?? 計算器.c
字號:
#include<reg52.h>
#define unchar unsigned char
#define unint unsigned int
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit busy=P0^7;
char i,flag,fuhao;
unchar num,temp;
long a,b,c;
unchar code table[]={7,8,9,0,//內(nèi)部運算用
4,5,6,0,
1,2,3,0,
0,0,0,0};
unchar code table1[]={7,8,9,0x2f-0x30,//顯示用7,8,9,/
4,5,6,0x2a-0x30,//4,5,6,*
1,2,3,0x2d-0x30,//1,2,3,-
0x01-0x30,0,0x3d-0x30,0x2b-0x30};//ON/C,0,=,+
void delay(unchar z)
{
unchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void checkbusy()
{
while(busy==1)//P0^7最高位為1為忙,0為閑
{
P0=0xff;
rs=0;
rw=1;
en=0;//禁止讀寫
delay(20);
en=1;
}
}
void write_com(unchar com)
{
rs=0;
rw=0;
en=0;
checkbusy();
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_date(unchar date)
{
rs=1;
rw=0;
en=0;
checkbusy();
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void init()
{
write_com(0x38);
delay(50);
write_com(0x0c);//開顯示關(guān)光標(biāo)和閃爍
delay(50);
write_com(0x06);//地址向后移
delay(50);
write_com(0x80);//初始地址
write_com(0x01);//清屏
delay(50);
i=0;flag=0;//賦初值
fuhao=0;a=0;b=0;c=0;
}
void lcd_clean()//清屏
{
write_com(0x01);
delay(20);
}
void keyscan()
{
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:num=0; break;
case 0xde:num=1; break;
case 0xbe:num=2; break;
case 0x7e:num=3; break;
}
}
while(P1!=0xfe);
if(num==0||num==1||num==2)
{
if(flag==0)
a=a*10+table[num];//a是在沒按符號鍵之前輸入的值
if(flag==1)
b=b*10+table[num];//b是按符號鍵后輸入的值
}
if(num==3)//"/"鍵
{
flag=1;
fuhao=4;//"/"
}
i=table1[num];//顯示的值
write_date(0x30+i);//十六進制表示的ASC碼
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(5);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=4; break;
case 0xdd:num=5; break;
case 0xbd:num=6; break;
case 0x7d:num=7; break;
}
}
while(P1!=0xfd);
if(num==4||num==5||num==6)
{
if(flag==0)
a=a*10+table[num];
else
b=b*10+table[num]; //
}
if(num==7)//"*"
{
flag=1;
fuhao=3;
}
i=table1[num];
write_date(0x30+i);
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(5);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=8; break;
case 0xdb:num=9; break;
case 0xbb:num=10; break;
case 0x7b:num=11; break;
}
}
while(P1!=0xfb);
if(num==8||num==9||num==10)
{
if(flag==0)
{a=a*10+table[num];}
else
{b=b*10+table[num];}
}
if(num==11)//"-"
{
flag=1;
fuhao=2;
}
i=table1[num];
write_date(0x30+i);
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(5);
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num=12; break;
case 0xd7:num=13; break;
case 0xb7:num=14; break;
case 0x77:num=15; break;
}
}
while(P1!=0xf7);//松手檢測,沒有松手則保持顯示的狀態(tài)
switch(num)
{
case 12:{
lcd_clean();
a=0;b=0;flag=0;
fuhao=0;
} break;
case 13:{
if(flag==0)
{
a=a*10;write_date(0x30);
}
else
{
b=b*10;
write_date(0x30);
}
} break;
case 14:{
if(fuhao==1)
{
write_com(0x80+0x0f);
lcd_clean();//重新定位后再清屏
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;//清0
}
else if(fuhao==2)
{
write_com(0x80+0x0f);
lcd_clean();
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+0x0f);
lcd_clean();
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+0x0f);
lcd_clean();
write_com(0x04);
i=0;
c=(long)(((float)a/b)*1000);//化整后再加小數(shù)點
while(c!=0)
{
write_date(0x30+c%10);
c=c/10; i++;
if(i==3)
write_date(0x2e);//加小數(shù)點"."
}
if(a/b<=0)
write_date(0x30);
write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
} break;
case 15:{
i=table1[num];
write_date(0x30+i);//"+"
flag=1;fuhao=1;
} break;
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -