基于51单片机的lcd 1602液晶显示的计算器_精品.doc
文本预览下载声明
基于51单片机的lcd 1602液晶显示的计算器
/****************************************************************
阿斌独家制作:
计算器,1602液晶显示
可计算10以下数加减乘除
可连续运算,最大显示结果数值65536
*****************************************************************/
键盘设置:
液晶初始显示:
运算显示:
主程序:
#includereg52.h
#include intrins.h
#define uint unsigned int
#define uchar unsigned char
sbit lcden=P2^2;
sbit lcdrw=P2^1;
sbit lcdrs=P2^0;
uchar num,temp,jia=0,jian=0,cheng=0,chu=0,qing=0;
uint key,key1,shu;
uchar fuhao,flag1,flag=0;
uchar table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x0};
void delay(uint z)
{
uint x,y;
for(x=z;x0;x--)
for(y=110;y0;y--);
}
bit lcd_bz()
{
bit result;
lcdrs=0;
lcdrw=1;
lcden=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P00x80);
lcden=0;
return result;
}
void write_com(uchar com)
{
while(lcd_bz());
lcdrs=0;
lcden=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
while(lcd_bz());
lcdrs=1;
lcden=0;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void lcd_init()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void keyscan()
{
P3=0xfe;
temp=P3;
temp=temp0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xee:key=1;num=0;break;
case 0xde:key=2;num=0;break;
case 0xbe:key=3;num=0;break;
case 0x7e:num=1;break; //加号
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
}
}
}
P3=0xfd;
temp=P3;
temp=temp0xf0;
while(temp!=0xf0)
{
delay(5);
temp=P3;
temp=temp0xf0;
while(temp!=0xf0)
{
temp=P3;
switch(temp)
{
case 0xed:key=4;num=0;break;
case 0xdd:key=5;num=0;break;
case 0xbd:key=6;num=0;break;
case 0x7d:num=2;break; //减号
}
while(temp!=0xf0)
{
temp=P3;
temp=temp0xf0;
}
}
}
P3=0xfb;
temp=P3;
temp=temp
显示全部