性能指標 4位數加法計算,功能鍵能清零;超出位數聲報警;違規操作聲報警光報警提
51hei.gif (241.46 KB, 下載次數: 49)
下載附件
2021-5-24 02:32 上傳
加法計算器.png (69.52 KB, 下載次數: 75)
下載附件
2021-5-24 00:18 上傳
單片機源程序如下:
- #include<reg52.h> //頭文件
- #include<intrins.h>//頭文件
- #include<math.h>
- #define uint unsigned int //宏定義
- #define uchar unsigned char//宏定義
- sbit int0=P3^2; //外部中斷0
- long x=0,y=0,num=0; //變量
- int operators,input,iny=0; //變量
- char key,k; //變量
- char error[5]="error";
- char overflow[8]="overflow"; //變量數組
- sbit EN=P2^7; //液晶選擇,使能信號
- sbit R_W=P2^5; //液晶讀/寫選擇端
- sbit RS=P2^6; //液晶數據/命令選擇端
- sbit led=P3^6; //燈
- sbit beep=P3^7; //蜂鳴器
- void delay(uint xms) //延時
- {
- uint xx,yy;
- for (xx=xms;xx>0;xx--)
- for(yy=110;yy>0;yy--);
- }
- /************LCD檢查忙碌函數***********/
- void check_BF()
- {
- char i,x=0x80;
- P0=0xff;
- while(x&0x80)
- {
- RS=0;
- R_W=1;
- EN=1;
- x=P0;
- EN=0;
- for (i=0;i<10;i++);
- }
- EN=0;//關閉使能信號
- }
- void write_com(char command)
- {
- RS=0;/*寫指令*/
- R_W=0;
- EN=1;/*使能信號開*/
- P0=command;/*將數據送入p1口*/
- EN=0;/*使能信號關*/
- check_BF();
- }
- void write_data(char ddata) //液晶數據
- {
- RS=1;/*寫指令*/
- R_W=0;
- EN=1;/*使能信號開*/
- P0=ddata;/*將數據送入p0口*/
- EN=0;/*使能信號關*/
- check_BF();
- }
- void init_LCM() //初始化
- {
- write_com(0x30);
- write_com(0x30);
- write_com(0x30);
- write_com(0x38);
- write_com(0x08);
- write_com(0x01);
- write_com(0x06);
- write_com(0x0e);
- }
- /**********LCD清屏函數**********/
- void clearLCD()
- {
- write_com(0x01);
- }
- /**********LCD顯示函數**********/
- void display(long a)
- {
- long temp,b,c=-1;
- int lenth=1,i,j;
- clearLCD();
- if(a<0) //計算值小于0
- {
- a=a*c;
- write_data('-'); //顯示負號
- }
- temp=a;
- while((temp=temp/10)!=0)
- {
- lenth++;
- }
- for(i=lenth;i>0;i--)
- {
- b=1;
- for(j=0;j<i-1;j++)
- {
- b=b*10;
- }
- write_data(0x30+a/b);
- a=a%b;
- }
- }
- /*********數值溢出處理函數**********/
- void dataoverflow() //結果超出范圍
- {
- int i=0;
- clearLCD();
- for(i=0;i<8;i++)
- write_data(overflow[i]);
- }
- void dataoverflow1() //輸入超出范圍,違規操作
- {
- int i=0;
- clearLCD();
- for(i=0;i<5;i++)
- write_data(error[i]);
- }
- /**********算術運算函數*************/
- void arithmetic()
- {
- if (iny)
- {
- switch(operators)
- {
- case 1: //加法運算
- x=x+y;
- num=x;
- if(num<=9999&&num>=-9999) //在計算范圍內
- {
- display(num); //液晶顯示
- }
- else
- {
- dataoverflow(); //超過范圍
- led=0; //指示燈亮
- }
- break;
- }
- }
- }
- /***********外部中斷0處理函數*************/
- void INT_0(void) interrupt 0 using 0
- {
- if(key<=9&&key>=0) //判斷按下的鍵是否為數值
- {
- num=num*10+(key-0);
- if (operators>0)
- {
- y=num;
- iny=1;
- }
- else
- x=num;
- if(num<=9999&&num>=-9999) //當前數值是否超出限定范圍
- {
- display(num);
- }
- else
- {
- dataoverflow1(); //錯誤提示
- beep=0; //報警
- }
- }
- else
- {
- switch(key) //按鍵值判斷
- {
- case 'c': //刪除按鍵
- x=0;
- y=0;
- num=0;
- iny=0;
- operators=0;
- led=1;
- beep=1;
- display(num);
- break;
- case '=': //等于按鍵
- arithmetic();
- iny=0;
- operators=0;
- num=0;
- break;
- case '+': //加號按鍵
- if (operators)
- arithmetic();
- operators=1;
- num=0;
- break;
- }
- }
- }
- void keyscan() //按鍵函數
- {
- uchar temp;
- P1=0xfe;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0) //如果按鍵被按下
- {
- delay(10); //延時消抖
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xee:
- key='+'; //加
- break;
- }
- int0=0; //外部中斷0電平觸發
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- int0=1;
- }
- }
- P1=0xfd;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xed:
- key='='; //等于
- break;
- case 0xdd:
- key=3; //3
- break;
- case 0xbd: //6
- key=6;
- break;
- case 0x7d:
- key=9;
- break;
- }
- int0=0;
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- int0=1;
- }
- }
- P1=0xfb;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xeb:
- key=0;
- break;
- case 0xdb:
- key=2;
- break;
- case 0xbb:
- key=5;
- break;
- case 0x7b:
- key=8;
- break;
- }
- int0=0;
- while(temp!=0xf0)
- {
- temp=P1;
- int0=0;
- temp=temp&0xf0;
- }
- int0=1;
- }
- }
- P1=0xf7;
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- delay(10);
- temp=P1;
- temp=temp&0xf0;
- if(temp!=0xf0)
- {
- temp=P1;
- switch(temp)
- {
- case 0xe7:
- key='c';
- break;
- case 0xd7:
- key=1;
- break;
- case 0xb7:
- key=4;
- break;
- case 0x77:
- key=7;
- break;
- }
- int0=0;
- while(temp!=0xf0)
- {
- temp=P1;
- temp=temp&0xf0;
- }
- int0=1;
- }
- }
- }
- void main() //主函數
- {
- EA=1; //打開總中斷
- EX0=1; //外部中斷
- IT0=1;
- P1=0xff;
- display(0);
- init_LCM();
- write_data(0x30);
- while(1) //大循環
- {
- keyscan(); //按鍵函數
- }
- }
復制代碼
所有資料51hei提供下載:
加法計算器.zip
(102.52 KB, 下載次數: 29)
2021-5-24 00:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|