计算器Proteus仿真文件:
单片机源程序如下:
- #include"key16a.h" //矩阵键盘识别
- #include"lcd1602.h"
- //16个按键的读入数据
- /* p20 p21 P22 P23 p20 p21 P22 P23
- P24 0 4 8 C / * - +
- P25 1 5 9 D = 9 6 3
- p26 2 6 A E 0 8 5 2
- p27 3 7 B F clear 7 4 1
- */
- Uchar code keyval[16]={'/','=',0,'C','*',9,8,7,'-',6,5,4,'+',3,2,1,};
- Uchar data numb1[4],numb2[4],result[12];
- void Fclear()
- { Uchar i;
- for(i=0;i<4;i++)
- { numb1[i]=0;
- numb2[i]=0;
-
- }
- for(i=0;i<12;i++)
- result[i]=' ';
- }
- void main()
- { Uchar i=0,j=0,tmp=0;
- Uchar oprat1=0,oprat2=0,opratflag=0;
- Uint answer=0;
- Fclear();
- //result[6]=result[7]=result[8]='.';
- //result[9]=result[10]=result[11]=32;//' ';
- /*
- while(1)
- { tmp=key_scan();
- if(tmp!=0xff)
- P0=keyval[tmp];
- //P0=keyval[key_scan()];
- NOP; }
- while(1);
- */
- RstLcd();
- ClrLcd();
- // WriteString("234",0,0);
- // WriteString("ASD",5,1);
- while(1)
- { do{tmp=key_scan();}while(tmp==0xff);
- tmp=keyval[tmp];
- if(tmp=='C'){ClrLcd();break;}
- else
- {if(tmp!='=') //输入对象判断及显示
- { if((tmp<10)&&(opratflag==0))
- { numb1[i]=tmp;WriteChar(tmp+0x30,i+4,0);i++;}
- else if (tmp>10)
- {opratflag=tmp;WriteChar(tmp,7,0);}
- else
- {numb2[j]=tmp;WriteChar(tmp+0x30,j+8,0);j++;}
- }
- else
- {
- switch(i) //得到数1,数1各位的显示码在numb1[]中
- { case 1: oprat1=numb1[0];
- numb1[0]+=0x30;numb1[1]=numb1[2]=' ';
- break;
- case 2:
- oprat1=numb1[0]*10+numb1[1];
- numb1[0]+=0x30;numb1[1]+=0x30;
- numb1[2]=' ';break;
- case 3:
- oprat1=numb1[0]*100+numb1[1]*10+numb1[2];
- numb1[0]+=0x30;numb1[1]+=0x30;
- numb1[2]+=0x30;
- break;
- }
- switch(j) //得到数2,数2各位的显示码在numb2[]中
- { case 1: oprat2=numb2[0];
- numb2[0]+=0x30;numb2[1]=numb2[2]=' ';
- break;
- case 2:
- oprat2=numb2[0]*10+numb2[1];
- numb2[0]+=0x30;numb2[1]+=0x30;
- numb2[2]=' '; break;
- case 3:
- oprat2=numb2[0]*100+numb2[1]*10+numb2[2];
- numb2[0]+=0x30;numb2[1]+=0x30;
- numb2[2]+=0x30;
- break;
- }
- result[0]=' ';//32;
- switch(opratflag) //运算及余数处理
- { case '+':
- answer=oprat1+oprat2;break;
- case '-':
- if(oprat1<oprat2)
- { answer=oprat2-oprat1;
- result[0]='-'; }
- else
- {answer=oprat1-oprat2;
- }
- break;
- case '*':
- answer=oprat1*oprat2;break;
- case '/':
- answer=oprat1/oprat2;
- tmp=oprat1%oprat2;
- if(tmp>=100) i=3;
- else if(tmp>9){i=2;}//result[9]=' ';}
- else if(tmp>0) {i=1;}//result[9]=' ';result[10]=' ';}
- else break;
- result[6]= result[7]=result[8]='.';
- j=9;
- switch(i)
- { case 3:result[j]=tmp/100+0x30;
- case 2:result[j++]=(tmp/10)%10+0x30;
- case 1:result[j]=tmp%10+0x30;
- break;
- }
- break;
- }
-
-
- if(answer>=10000) i=5;
- else if (answer>=1000)i=4;
- else if (answer>=100)i=3;
- else if (answer>=10)i=2;
- else i=1;
- j=1;
- switch(i)
- { case 5:result[j++]=answer/10000+0x30;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
计算机.7z
(6.73 MB, 下载次数: 24)
|