#include <reg52.h>
#define uchar unsigned char
#define unit unsigned int
#define OPdata P0 //十位数据口
#define OPdata1 P1//个位数据口
sbit se0=P3^6//十位选择
sbit se1=P3^7//个位选择
sbit Q=P2^6
sbit W=P2^5
sbit E=P2^4
uchar cis//按下键盘次数
uchar jia1//加数1
uchar jia2//加数2
uchar z//中转数
uchar shi//十位数
uchar ge//个位数
uchar s//译码结果
uchar j//译码结果
uchar sum//加法结果
uchar keytemp
void judge(uchar m) //数码显像管译码
{
switch (m)
{
case 0: s=0x3Fbreak
case 1: s=0x06break
case 2: s=0x5Bbreak
case 3: s=0x4Fbreak
case 4: s=0x66break
case 5: s=0x6Dbreak
case 6: s=0x7Dbreak
case 7: s=0x07break
case 8: s=0x7Fbreak
case 9: s=0x6Fbreak
}
}
void judge1(uchar h) //十位数码显像管译码
{
switch (h)
{
case 0: j=0x3Fbreak
case 1: j=0x06break
}
}
void judgecis()
{
if (cis==1)
{
jia1=z
ge=z
shi=0
}
else if (cis==2)
{
jia2=z
ge=z
shi=0
cis=0
}
}
void jiafa(uchar m,uchar n) //加法
{
sum=m+n
if (sum>=10)
{
ge=sum-10
shi=1
}
else
{
ge=sum
shi=0
}
}
void main()
{
cis=0
jia1=0
jia2=0
shi=0
ge=0
s=0
j=0
P2=0XFF
se0=0//开启十位
se1=0//开启个位
OPdata=0x3f//十位
OPdata1=0x3f//个位
while (1)
{
Q=0
keytemp=P2
switch (keytemp)
{
case 0xbb: z=3 cis++while(P2==0xbb) break
case 0xbd: z=6 cis++while(P2==0xbd) break
case 0xbe: z=9 cis++while(P2==0xbe) break
case 0xb7: //等于号
jiafa (jia1,jia2) cis=0 break
}
Q=1
W=0
keytemp=P2
switch (keytemp)
{
case 0xde: z=8 cis++while(P2==0xde) break
case 0xdd: z=5 cis++while(P2==0xdd) break
case 0xdb: z=2 cis++while(P2==0xdb) break
case 0xd7: z=0 cis++while(P2==0xd7) break
}
W=1
E=0
keytemp=P2
switch (keytemp)
{
case 0xee: z=7 cis++while(P2==0xee) break
case 0xed: z=4 cis++while(P2==0xed) break
case 0xeb: z=1 cis++while(P2==0xeb) break
}
judgecis()
judge(ge)
OPdata1=s
judge1(shi)
OPdata=j
E=1
}
}
以下是我编的简易计算器程序,基本成功//4*4键盘检测程序,按下键后相应的代码显示在液晶屏上
//显示5位后,第6次显示操作符号
//再显示下一个数
// 键值与功能对应表
//键值 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零
#include<reg52.h>
sbit beep=P2^3
sbit lcden=P3^4
sbit rs=P3^5
sbit rw=P3^6
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
#define lcddata P0
ulint bb,dd,ee,ff
uchar d,flag1
uchar fd1,fd2
uchar b1=16,b2=16,b3=16,b4=16,b5=16
uchar d1=16,d2=16,d3=16,d4=16,d5=16
uchar f1=16,f2=16,f3=16,f4=16,f5=16,f6=16,f7=16,f8=16,f9=16,f10=16
uchar key,keyval,c,temp
void Delay1ms(uint i) //1ms延时程序
{
uint j
for(i>0i--)
{
for(j=0j<125j++)
{}
}
}
void write_com(uchar com)
{
lcddata=com
rs=0
rw = 0
lcden=0
Delay1ms(10)
lcden=1
Delay1ms(10)
lcden=0
}
void write_date(uchar date)
{
lcddata=date
rs=1
rw=0
lcden=0
Delay1ms(10)
lcden=1
Delay1ms(10)
lcden=0
}
void init2()
{
rw=0
write_com(0x38)
Delay1ms(10)
write_com(0x0f)
Delay1ms(10)
write_com(0x06)
Delay1ms(10)
write_com(0x01)
Delay1ms(10)
}
void display1(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第1个数显示程序
{
init2()
write_com(0x80)//第1行,第1字
Delay1ms(10)
write_date(0x30+A1)
Delay1ms(10)
write_date(0x30+A2)
Delay1ms(10)
write_date(0x30+A3)
Delay1ms(10)
write_date(0x30+A4)
Delay1ms(10)
write_date(0x30+A5)
Delay1ms(10)
}
void display2(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第2个数显示程序
{
write_com(0x88)//第1行,第1字
Delay1ms(10)
write_date(0x30+A1)
Delay1ms(10)
write_date(0x30+A2)
Delay1ms(10)
write_date(0x30+A3)
Delay1ms(10)
write_date(0x30+A4)
Delay1ms(10)
write_date(0x30+A5)
Delay1ms(10)
}
void display3(uchar a) //操作符号显示程序
{
write_com(0x86)//第1行,第1字
Delay1ms(10)
switch(a)
{
case 10:
write_date('+')
Delay1ms(10)
case 11:
write_date('-')
Delay1ms(10)
case 12:
write_date('x')
Delay1ms(10)
case 13:
write_date('/')
Delay1ms(10)
}
}
void display4(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5,uchar A6,uchar A7,uchar A8,uchar A9,uchar A10,uchar A11,uchar A12) //结果显示程序
{
write_com(0x80+0x40)//第2行,第1字
Delay1ms(10)
if (flag1==0)
{
write_date('-')
}
else write_date('+')
Delay1ms(10)
write_date(0x30+A1)
Delay1ms(10)
write_date(0x30+A2)
Delay1ms(10)
write_date(0x30+A3)
Delay1ms(10)
write_date(0x30+A4)
Delay1ms(10)
write_date(0x30+A5)
Delay1ms(10)
write_date(0x30+A6)
Delay1ms(10)
write_date(0x30+A7)
Delay1ms(10)
write_date(0x30+A8)
Delay1ms(10)
write_date(0x30+A9)
Delay1ms(10)
write_date(0x30+A10)
Delay1ms(10)
write_date('.')
Delay1ms(10)
write_date(0x30+A11)
Delay1ms(10)
write_date(0x30+A12)
Delay1ms(10)
}
uchar keyscan()
{
key=16
P3=0xef//P3.7输出1个低电平
temp=P3//读取
temp=temp&0x0f//屏蔽高4位
if(temp!=0x0f)
{
Delay1ms(10)
if(temp!=0x0f)
{
temp=P3
switch(temp)
{
case 0xee:
key=0
break
case 0xed:
key=4
break
case 0xeb:
key=8
break
case 0xe7:
key=12
break
}
while(temp!=0x0f)
{
temp=P3
temp=temp&0x0f
beep=0
}
beep=1
}
}
P3=0xdf
temp=P3
temp=temp&0x0f
if(temp!=0x0f)
{
Delay1ms(10)
if(temp!=0x0f)
{
temp=P3
switch(temp)
{
case 0xde:
key=1
break
case 0xdd:
key=5
break
case 0xdb:
key=9
break
case 0xd7:
key=13
break
}
while(temp!=0x0f)
{
temp=P3
temp=temp&0x0f
beep=0
}
beep=1
}
}
P3=0xbf
temp=P3
temp=temp&0x0f
if(temp!=0x0f)
{
Delay1ms(10)
if(temp!=0x0f)
{
temp=P3
switch(temp)
{
case 0xbe:
key=2
break
case 0xbd:
key=6
break
case 0xbb:
key=10
break
case 0xb7:
key=14
break
}
while(temp!=0x0f)
{
temp=P3
temp=temp&0x0f
beep=0
}
beep=1
}
}
P3=0x7f
temp=P3
temp=temp&0x0f
if(temp!=0x0f)
{
Delay1ms(10)
if(temp!=0x0f)
{
temp=P3
switch(temp)
{
case 0x7e:
key=3
break
case 0x7d:
key=7
break
case 0x7b:
key=11
break
case 0x77:
key=15
break
}
while(temp!=0x0f)
{
temp=P3
temp=temp&0x0f
beep=0
}
beep=1
}
}
return(key)
}
void main()
{ while(1)
{
c=1
while(c<6)//输入第1个5 位数
{
keyval=keyscan()
if(keyval<10)
{
switch(c)
{
case 1:b1=keyval break
case 2:b2=keyval break
case 3:b3=keyval break
case 4:b4=keyval break
case 5:b5=keyval break
}
c++
}
display1(b1,b2,b3,b4,b5)
}
while(c==6) //输入计算符号
{
keyval=keyscan()
if((keyval>=10)&&(keyval<14)) //可去一层括号,因逻辑运算优先级较低
{
d=keyval
}
c=1
display3(d)
}
while(c<6) //输入第2个5 位数
{
keyval=keyscan()
if(keyval<10)
{
switch(c)
{
case 1:d1=keyval break
case 2:d2=keyval break
case 3:d3=keyval break
case 4:d4=keyval break// 除
case 5:d5=keyval break
}
c++
}
display2(d1,d2,d3,d4,d5)
}
bb= b1*10000+b2*1000+b3*100+b4*10+b5
dd=d1*10000+d1*1000+d3*100+d4*10+d5
while(keyval!=14) //等待按下"="
{
keyval=keyscan()
}
Delay1ms(10)
switch(d)
{
case 10:ee=bb+dd break//+
case 11:
flag1=1
if(bb>=dd)
{
ee=bb-dd //-
flag1=0
}
else ee=dd-bb
break
case 12:ee=bb*dd break//*可能会溢出
case 13:ee=bb/dd //除法小数部分会丢失,保留2位
ff=bb%dd
fd1=ff*10/dd
fd2=ff*100/dd%10
break
}
f10=ee/1000000000%10
f9=ee/100000000%10
f8=ee/10000000%10
f7=ee/1000000%10
f6=ee/100000%10
f5=ee/10000%10
f4=ee/1000%10
f3=ee/100%10
f2=ee/10%10
f1=ee%10
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2)
while(keyval!=15)
{
keyval=keyscan()
}
b1=0b2=0b3=0b4=0b5=0
d1=0d2=0d3=0d4=0d5=0
bb=0dd=0ee=0
init2()
}
}