要求是:
1.简易四则运算,包括负数运算
2.错误提示:当计算器执行过程中有错误时,会在LCD上显示相应的提示,如:当输入的数值或计算得到的结果大于计算器的表示范围时,计算器会在LCD上提示OV;当除数为0时,计算器会在LCD上提示ERR。
仿真图在压缩包里
以下是程序:
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit lcden=P1^1;
- sbit rs=P1^0;
- sbit rw=P1^2;
- sbit busy=P0^7;
- char i,j,temp,num,num_1;
- long a,b,c;
- float a_c,b_c;
- uchar flag,fuhao;
- uchar code table[]={
- 7,8,9,0,
- 4,5,6,0,
- 1,2,3,0,
- 0,0,0,0};
- uchar code table1[]={
- 7,8,9,0x2f-0x30,
- 4,5,6,0x2a-0x30,
- 1,2,3,0x2d-0x30,
- 0x01-0x30,0,0x3d-0x30,0x2b-0x30
- };
- void delay(uchar z)
- {
- uchar y;
- for(z;z>0;z--)
- for(y=0;y<110;y++);
- }
- void write_com(uchar com)
- {
- rs=0;
- P0=com;
- delay(5);lcden=1;delay(5); lcden=0;
- }
- void write_date(uchar date)
- {
- rs=1; P0=date; delay(5);
- lcden=1; delay(5); lcden=0;
- }
- void init()
- {
- num=-1;
- lcden=1;
- rw=0;
- write_com(0x38);
- delay(5); write_com(0x38);
- delay(5); write_com(0x0c);
- delay(1); write_com(0x06);
- delay(1); write_com(0x80);
- delay(1); write_com(0x01);
- num_1=0;
- i=0; j=0;
- a=0;
- b=0;
- c=0;
- flag=0;
- fuhao=0;
- }
- void keyscan()
- {
- P2=0xfe;
- if(P2!=0xfe)
- {
- delay(20);
- if(P2!=0xfe) { temp=P2&0xf0;
- switch(temp)
- {
- case 0xe0:num=0; break; //7
- case 0xd0:num=1; break; //8
- case 0xb0:num=2; break; //9
- case 0x70:num=3; break;
- }
- } while(P2!=0xfe);
- if(num==0||num==1||num==2)
- {
- if(j!=0){write_com(0x01); j=0; }
- if(flag==0)
- { a=a*10+table[num]; }
- else
- { b=b*10+table[num]; }
- }
- else
- {
- flag=1;
- fuhao=4;
- }
- i=table1[num];
- write_date(0x30+i);
- }
- P2=0xfd;
- if(P2!=0xfd)
- {
- delay(20);
- if(P2!=0xfd){ temp=P2&0xf0;
- switch(temp)
- {
- case 0xe0:num=4; break; //4
- case 0xd0:num=5; break; //5
- case 0xb0:num=6; break; //6
- case 0x70:num=7; break; //¡á
- }
- } while(P2!=0xfd);
- if(num==4||num==5||num==6&&num!=7)
- {
- if(j!=0){ write_com(0x01); j=0; }
- if(flag==0)
- { a=a*10+table[num]; }
- else
- { b=b*10+table[num]; }
- }
- else
- { flag=1;
- fuhao=3;
- }
- i=table1[num];
- write_date(0x30+i);
- }
- P2=0xfb;
- if(P2!=0xfb){ delay(20);
- if(P2!=0xfb) { temp=P2&0xf0;
- switch(temp)
- {
- case 0xe0:num=8; break; //1
- case 0xd0:num=9; break; //2
- case 0xb0:num=10; break; //3
- case 0x70:num=11; break; //-
- }
- } while(P2!=0xfb);
- if(num==8||num==9||num==10)
- {
- if(j!=0){ write_com(0x01); j=0; }
- if(flag==0)
- { a=a*10+table[num]; }
- else
- { b=b*10+table[num]; }
- }
- else if(num==11)
- {
- flag=1;
- fuhao=2;
- }
- i=table1[num];
- write_date(0x30+i);
- }
- P2=0xf7;
- if(P2!=0xf7){ delay(20);
- if(P2!=0xf7){ temp=P2&0xf0;
- switch(temp)
- {
- case 0xe0:num=12; break;
- case 0xd0:num=13; break;
- case 0xb0:num=14; break;
- case 0x70:num=15; break;
- }
- } while(P2!=0xf7);
- switch(num)
- {
- case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}
- break;
- case 13:{
- if(flag==0)
- { a=a*10; write_date(0x30); P2=0; }
- else if(flag>=1)
- { b=b*10; write_date(0x30); }
- } break;
- case 14:{j=1;
- if(fuhao==1)
- {
- write_com(0x80+0x4f);
- write_com(0x04);
- c=a+b;
- while(c!=0){write_date(0x30+c%10); c=c/10; }
- write_date(0x3d);
- a=0;b=0;flag=0;fuhao=0;
- }
- else if(fuhao==2)
- {
- write_com(0x80+0x4f);
- write_com(0x04);
- if(a-b>0) c=a-b;
- else c=b-a;
- while(c!=0) { write_date(0x30+c%10);c=c/10; }
- if(a-b<0) write_date(0x2d);
- write_date(0x3d);
- a=0;b=0;flag=0;fuhao=0;
- }
- else if(fuhao==3)
- {write_com(0x80+0x4f); write_com(0x04);
- c=a*b;
- while(c!=0) {write_date(0x30+c%10); c=c/10; }
- write_date(0x3d); a=0;b=0;flag=0;fuhao=0;
- }
- else if(fuhao==4)
- {write_com(0x80+0x4f);
- write_com(0x04);
- i=0;
- if(b!=0)
- {
- c=(long)(((float)a/b)*1000);
- while(c!=0)
- {
- write_date(0x30+c%10);
- c=c/10;
- i++; if(i==3) write_date(0x2e);
- }
- if(a/b<=0)
- {
- if(i<=2)
- {
-
- if(i==1) write_date(0x30);
- write_date(0x2e); // .
- write_date(0x30);
- }
-
- write_date(0x30); //
- }
- write_date(0x3d);
- a=0;b=0;flag=0;fuhao=0;
- }
- else
- {
- write_date('!');write_date('R');write_date('O');
- write_date('R');write_date('R');write_date('E');
- }
- }
- } break;
- case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;} break;
- }
- }//P2!=0xf7
- }
- main()
- {
- init();
- while(1)
- {
- keyscan();
- }
- }
复制代码
|