只要用鍵盤和數(shù)碼管就能制作出一個(gè)簡(jiǎn)易的51單片機(jī)計(jì)算器
捕獲.PNG (28.55 KB, 下載次數(shù): 40)
下載附件
2016-7-7 20:45 上傳
計(jì)算器的仿真原理圖
0.png (270.37 KB, 下載次數(shù): 45)
下載附件
2016-7-7 20:55 上傳
單片機(jī)計(jì)算器的ppt文檔
硬件部分比較簡(jiǎn)單,當(dāng)鍵盤按鍵按下時(shí)它的那一行、那一列的端口為低電平。因此,只要掃描行、列端口是否都為低電平就可以確定是哪個(gè)鍵被按下。
劉杰_51簡(jiǎn)單計(jì)算器.003.jpg (30.39 KB, 下載次數(shù): 37)
下載附件
2016-7-7 21:05 上傳
主程序流程圖
程序的主要思想是:將按鍵抽象為字符,然后就是對(duì)字符的處理。將操作數(shù)分別轉(zhuǎn)化為字符串存儲(chǔ),操作符存儲(chǔ)為字符形式。然后調(diào)用compute()函數(shù)進(jìn)行計(jì)算并返回結(jié)果。具體程序及看注釋還有流程圖。
51單片機(jī)計(jì)算器源程序:
#include <reg51.h>
#include <intrins.h>
#include <ctype.h> /* isdigit()函數(shù) */
#include <stdlib.h> /* atoi()函數(shù) */
#define uchar unsigned char
#define uint unsigned int
uchar operand1[9], operand2[9]; /* 操作數(shù) */
uchar operator; /* 操作符 */
void delay(uint);
uchar keyscan();
void disp(void);
void buf(uintvalue);
uint compute(uint va1,uint va2,uchar optor);
uchar code table[] = {0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff}; /* 字符碼表 */
uchar dbuf[8] = {10,10,10,10,10,10,10,10}; /* 顯示緩存 */
/* 延時(shí)函數(shù) */
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************************************
鍵盤掃描程序
將按鍵轉(zhuǎn)化為字符并作為輸出
'$','#'分別表示清零鍵和沒有鍵按下
*******************************************/
uchar keyscan()
{
uchar skey; /* 按鍵值標(biāo)記變量 */
/***********************
掃描鍵盤第1行
************************/
P1 = 0xfe;
while((P1 & 0xf0) != 0xf0) /* 有按鍵按下 */
{
delay(3); /* 去抖動(dòng)延時(shí) */
while((P1 & 0xf0) != 0xf0) /* 仍有鍵按下 */
{
switch(P1) /* 識(shí)別按鍵并賦值 */
{
case 0xee: skey = '7'; break;
case 0xde: skey = '8'; break;
case 0xbe: skey = '9'; break;
case 0x7e: skey = '/'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0) /* 等待按鍵松開 */
;
}
}
/***********************
掃描鍵盤第2行
************************/
P1 = 0xfd;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xed: skey = '4'; break;
case 0xdd: skey = '5'; break;
case 0xbd: skey = '6'; break;
case 0x7d: skey = '*'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
/***********************
掃描鍵盤第3行
************************/
P1 = 0xfb;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xeb: skey = '1'; break;
case 0xdb: skey = '2'; break;
case 0xbb: skey = '3'; break;
case 0x7b: skey = '-'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
/***********************
掃描鍵盤第4行
************************/
P1 = 0xf7;
while((P1 & 0xf0) != 0xf0)
{
delay(3);
while((P1 & 0xf0) != 0xf0)
{
switch(P1)
{
case 0xe7: skey = '$'; break;
case 0xd7: skey = '0'; break;
case 0xb7: skey = '='; break;
case 0x77: skey = '+'; break;
default: skey = '#';
}
while((P1 & 0xf0) != 0xf0)
;
}
}
return skey;
}
void main()
{
uint value1, value2, value; /* 數(shù)值1,數(shù)值2,結(jié)果 */
uchar ckey, cut1 = 0, cut2 = 0; /* ckey鍵盤輸入字符 */
uchar operator; /* 運(yùn)算符 */
uchar i, bool = 0;
init: /* goto語句定位標(biāo)簽 */
buf(0); /* 初始化 */
disp();
value = 0;
cut1 = cut2 = 0;
bool = 0;
for(i = 0;i < 9;i++)
{
operand1[ i] = '\0';
operand2[ i] = '\0';
} /* 初始化 */
while(1)
{
ckey =keyscan(); /* 讀取鍵盤 */
if(ckey != '#')
{ /* isdigit函數(shù),字符是阿拉伯?dāng)?shù)字返回非0值,否則返回0 */
if(isdigit(ckey))
{
switch(bool)
{
case 0:
operand1[cut1] = ckey;
operand1[cut1+1] = '\0';
value1 =atoi(operand1); /* atoi函數(shù),將字符串轉(zhuǎn)化為,int整數(shù) */
cut1++;
buf(value1);
disp();
break;
case 1:
operand2[cut2] = ckey;
operand2[cut2+1] = '\0';
value2 =atoi(operand2);
cut2++;
buf(value2);
disp();
break;
default: break;
}
}
else if(ckey=='+'||ckey=='-'||ckey=='*'||ckey=='/')
{
bool = 1;
operator = ckey;
buf(0);
dbuf[7] = 10;
disp();
}
else if(ckey == '=')
{
value =compute(value1,value2,operator);
buf(value);
disp();
while(1) /* 計(jì)算結(jié)束等待清零鍵按下 */
{
ckey = keyscan();
if(ckey == '$') /* 如果有清零鍵按下跳轉(zhuǎn)到開始 */
goto init;
else
{
buf(value);
disp();
}
}
}
else if(ckey == '$')
{ goto init;}
}
disp();
}
}
/******************************************
運(yùn)算函數(shù)
輸入:操作數(shù)和操作符
輸出:計(jì)算結(jié)果
*******************************************/
uint compute(uint va1,uint va2,uchar optor)
{
uint value;
switch(optor)
{
case '+' : value = va1+va2; break;
case '-' : value = va1-va2; break;
case '*' : value = va1*va2; break;
case '/' : value = va1/va2; break;
default : break;
}
return value;
}
/*******************************************
更新顯示緩存
輸入:無符號(hào)整數(shù)
輸出:將輸入送入顯示緩存
*******************************************/
void buf(uint val)
{
uchar i;
if(val == 0)
{
dbuf[7] = 0;
i = 6;
}
else
for(i = 7; val > 0; i--)
{
dbuf[ i] = val % 10;
val /= 10;
}
for( ; i > 0; i--)
dbuf[ i] = 10;
}
/*******************************************
顯示函數(shù)
*******************************************/
void disp(void)
{
uchar bsel, n;
bsel=0x01;
for(n=0;n<8;n++)
{
P2=bsel;
P0=table[dbuf[n]];
bsel=_crol_(bsel,1);
delay(3);
P0=0xff;
}
}
0.png (65.07 KB, 下載次數(shù): 40)
下載附件
2016-7-7 20:56 上傳
單片機(jī)計(jì)算器制作的全部資料下載:
C51簡(jiǎn)單計(jì)算器.zip
(1.24 MB, 下載次數(shù): 94)
2016-7-7 20:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|