标题:
51单片机计算器源程序 矩阵键盘 数码管和lcd1602显示
[打印本页]
作者:
Fmaroon
时间:
2016-12-5 21:36
标题:
51单片机计算器源程序 矩阵键盘 数码管和lcd1602显示
0.png
(14.53 KB, 下载次数: 41)
下载附件
2016-12-6 00:34 上传
下面是1602显示的版本:
0.png
(307.53 KB, 下载次数: 56)
下载附件
2016-12-6 00:26 上传
利用矩阵键盘和lcd1602显示:
#include<reg51.h> //头文件
typedef unsigned char uchar;
typedef unsigned int uint;
sbit RW=P3^5;
sbit RS=P3^6;
sbit E=P3^4;
long x=0,y=0,num=0;
uint aa,bb=0;
uchar key;
uchar code tab1[5]="ERROR";
uchar code tab2[8]="OVERFLOW";
//LCD1602液晶检查忙碌子函数
void LCD1602_busy()
{
char i,x=0x80;
P0=0xff;
while(x&0x80)
{
RS=0;
RW=1;
E=1;
x=P0;
E=0;
for(i=0;i<10;i++);
}
E=0;
}
//LCD1602液晶写命令子函数
void write_com(uchar com)
{
RS=0;
RW=0;
E=1;
P0=com;
E=0;
LCD1602_busy();
}
//LCD1602液晶写数据子函数
void write_date(uchar date)
{
RS=1;
RW=0;
E=1;
P0=date;
E=0;
LCD1602_busy();
}
//LCD1602液晶初始化子函数
void LCD1602_init()
{
write_com(0x30);
write_com(0x30);
write_com(0x30);
write_com(0x38);
write_com(0x08);
write_com(0x01);
write_com(0x06);
write_com(0x0e);
}
//LCD1602液晶清屏子函数
void LCD1602_clear()
{
write_com(0x01);
}
//除数为处理子函数
void sfj1()
{
int i=0;
LCD1602_clear();
for(i=0;i<5;i++)
write_date(tab1[i]);
}
//数值溢出处理子函数
void sfj2()
{
int i=0;
LCD1602_clear();
for(i=0;i<8;i++)
write_date(tab2[i]);
}
//键值转化为键盘上按键值子函数
char sfj3(int keycode)
{
switch(keycode)
{
case 0:
return '7';
break;
case 1:
return '4';
break;
case 2:
return '1';
break;
case 3:
return 'c';
break;
case 4:
return '8';
break;
case 5:
return '5';
break;
case 6:
return '2';
break;
case 7:
return '0';
break;
case 8:
return '9';
break;
case 9:
return '6';
break;
case 10:
return '3';
break;
case 11:
return '=';
break;
case 12:
return '/';
break;
case 13:
return '*';
break;
case 14:
return '-';
break;
case 15:
return '+';
break;
}
}
//LCD1602液晶显示子函数
void display(long a)
{
long temp,b,c=-1;
int lenth=1,i,j;
LCD1602_clear();
if(a<0)
{
a=a*c;
write_date('-');
}
temp=a;
while((temp=temp/10)!=0)
{
lenth++;
}
for(i=lenth;i>0;i--)
{
b=1;
for(j=0;j<i-1;j++)
{
b=b*10;
}
write_date(0x30+a/b);
a=a%b;
}
}
//算术运算子函数
void sfj4()
{
if(bb)
{
switch(aa)
{
case 1:
x=x+y;
num=x;
if(num<134217728&&num>-134217728)
{
display(num);
}
else
sfj2();
break;
case 2:
x=x-y;
num=x;
if(num<134217728&&num>-134217728)
{
display(num);
}
else
sfj2();
break;
case 3:
x=x*y;
num=x;
if(num<134217728&&num>-134217728)
{
display(num);
}
else
sfj2();
break;
case 4:
if(y==0)
sfj1();
else
{
x=x/y;
num=x;
if(num<134217728&&num>-134217728)
{
display(num);
}
else
sfj2();
}
break;
}
y=0;
}
}
//主函数
void main()
{
EA=1;
EX0=1;
IT0=1;
P2=0xff;
display(0);
LCD1602_init();
write_date(0x30);
while(1)
{
}
}
//外部0中断处理子函数
void wb0() interrupt 0 using 0
{
key=sfj3(P2&0x0f);
if(key<='9'&&key>='0') //判断按下的键是否为数值
{
num=num*10+(key-'0');
if(aa>0)
{
y=num;
bb=1;
}
else
x=num;
if(num<134217728&&num>-134217728) //当前数值是否超出限定范围
{
display(num);
}
else
sfj2();
}
else
{
switch(key)
{
case 'c':
x=0;
y=0;
num=0;
bb=0;
aa=0;
display(num);
break;
case '=':
sfj4();
bb=0;
aa=0;
num=0;
break;
case '+':
if(aa)
sfj4();
aa=1;
num=0;
break;
case '-':
if(aa)
sfj4();
aa=2;
num=0;
break;
case '*':
if(aa)
sfj4();
aa=3;
num=0;
break;
case '/':
if(aa)
sfj4();
aa=4;
num=0;
break;
}
}
}
复制代码
下载:
51单片机简易计算器.rar
(50.24 KB, 下载次数: 66)
2016-12-6 00:34 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
shenqiang
时间:
2016-12-20 13:21
有点难啊
作者:
shenqiang
时间:
2016-12-20 13:56
楼主在不?求教。QQ278959526
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1