|
51單片機(jī)的簡易計(jì)算器仿真設(shè)計(jì),有proteus仿真和程序,可以在附件中下載
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (23.98 KB, 下載次數(shù): 98)
下載附件
2018-10-20 00:19 上傳
單片機(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
- #define PI=3.1415926
- uchar operand1[9], operand2[9];
- uchar operator;
- void delay(uint);
- uchar keyscan();
- void disp(void);
- void buf(uint value);
- uint compute(uint va1,uint va2,uchar optor);
- uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- uchar dbuf[8] = {10,10,10,10,10,10,10,10};
-
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=33;y>0;y--);
- }
- /*鍵盤掃描*/
- uchar keyscan()
- {
- uchar skey;
- P1 = 0xfe;
- while((P1 & 0xf0) != 0xf0)
- {
- delay(10);
- while((P1 & 0xf0) != 0xf0)
- {
- switch(P1)
- {
- case 0xee: skey = '7'; break;
- case 0xde: skey = '8'; break;
- case 0xbe: skey = '9'; break;
- case 0x7e: skey = 'f'; break;
- default: skey = '#';
- }
- while((P1 & 0xf0) != 0xf0);
- }
- }
- P1 = 0xfd;
- while((P1 & 0xf0) != 0xf0)
- {
- delay(10);
- 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);
- }
- }
- P1 = 0xfb;
- while((P1 & 0xf0) != 0xf0)
- {
- delay(10);
- 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);
- }
- }
- P1 = 0xf7;
- while((P1 & 0xf0) != 0xf0)
- {
- delay(10);
- 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;
- uchar ckey, cut1 = 0, cut2 = 0;
- uchar operator;
- uchar i, bool;
- init:
- 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 != '#')
- {
- if(isdigit(ckey))
- {
- switch(bool)
- {
- case 0:
- operand1[cut1] = ckey;
- operand1[cut1+1] = '\0';
- value1 = atoi(operand1);
- 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=='*')
- {
- bool = 1;
- operator = ckey;
- buf(0);
- dbuf[7] = 10;
- disp();
- }
- else if(ckey=='f')
- {
- operator = ckey;
- value2=value1;
- buf(0);
- dbuf[7] = 10;
- disp();
-
- }
- else if(ckey == '=')
- {
- value = compute(value1,value2,operator);
- buf(value);
- disp();
- while(1)
- {
- ckey = keyscan();
- if(ckey == '
- )
- goto init;
- else
- {
- buf(value);
- disp();
- }
- }
- }
- else if(ckey ==
- )
- { goto init;}
- }
- disp();
- }
- }
- 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 'f' :
- for(va1=va1-1;va1>0;--va1)
- {
- va2*=va1;
- value=va2;
- }
- break;
- default : break;
- }
- return value;
- }
- 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;
- }
- void disp(void)
- {
- uchar bsel, n;
- bsel=0xee;
- for(n=0;n<8;n++)
- {
- P2=bsel;
- P0=table[dbuf[n]];
- bsel=_crol_(bsel,1);
- delay(10);
- P0=0x00;
- }
- }
復(fù)制代碼
Keil代碼與Proteus8.8仿真下載:
簡易計(jì)算器.rar
(145.63 KB, 下載次數(shù): 127)
2018-10-19 20:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
-
0.png
(7.47 KB, 下載次數(shù): 217)
下載附件
2018-10-20 00:20 上傳
|