51单片机简易计算器代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include"reg52.h"

#define uchar unsigned char

#define uint unsigned int

sbit busy=P0^7;

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

char i,j,temp,num;

long a,b,c; //a,第一个数b,第二个数c,得数

uchar flag,fuhao;//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,0 x2b-0x30}; //按键显示编码表

sbit lcden=P2^2;

sbit lcdwrite=P2^1;

sbit lcdrs=P2^0;

//lcd的写指令

void write_com(uchar com)

{

lcdrs=0;

lcden=0;

P0=com;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

//lcd的写数据

void write_date(uchar da)

{

lcdrs=1;

lcden=0;

P0=da;

delay(1);

lcden=1;

delay(1);

lcden=0;

}

//初始化

void init() //初始化

{

uchar num;

num=-1;

lcdwrite=0;

lcden=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

delay(500);//延时0.5s

write_com(0x01);

i=0;

j=0;

a=0; //第一个参与运算的数

b=0; //第二个参与运算的数

c=0;

flag=0; //flag表示是否有符号键按下,

fuhao=0; // fuhao表征按下的是哪个符号

}

void keyscan() // 键盘扫描程序

{

P3=0xfe;

if(P3!=0xfe)

{

delay(10); //延迟20ms

if(P3!=0xfe)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=0; break;

case 0xd0:num=1; break;

case 0xb0:num=2; break;

case 0x70:num=3; break;

}

}

while(P3!=0xfe);

if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

{

if(j==1)//确认一次计算完毕,清屏

{ write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else//如果按下的是'/'

{

flag=1;

fuhao=4;//4表示除号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfd;

if(P3!=0xfd)

{

delay(10);

if(P3!=0xfd)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=4; break;

case 0xd0:num=5; break;

case 0xb0:num=6; break;

case 0x70:num=7; break;

}

}

while(P3!=0xfd);

if(num==4||num==5||num==6)//如果按下的是'4','5'或'6'

{

if(j==1)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

{

a=a*10+table[num];

}

else//如果按过符号键

{

b=b*10+table[num];

}

}

else//如果按下的是'X'

{

flag=1;

fuhao=3;//3表示乘号已按

}

i=table1[num];

write_date(0x30+i);

}

P3=0xfb;

if(P3!=0xfb)

{

delay(10);

if(P3!=0xfb)

{

temp=P3&0xf0;

switch(temp)

{

case 0xe0:num=8; break;

case 0xd0:num=9; break;

case 0xb0:num=10; break;

case 0x70:num=11; break;

}

}

while(P3!=0xfb);

if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

{

if(j==1)

{

write_com(0x01);

j=0;

}

if(flag==0)//没有按过符号键

相关文档
最新文档