51单片机控制lcd1602实现计算器
![51单片机控制lcd1602实现计算器](https://img.360docs.net/imgf1/1s6s87sa4cfdyj9ohw2xolbw4ct8c316-11.webp)
![51单片机控制lcd1602实现计算器](https://img.360docs.net/imgf1/1s6s87sa4cfdyj9ohw2xolbw4ct8c316-52.webp)
//利用51单片机控制LCD1602,实现加减乘除运算
#include<>
#define uint unsigned int
#define uchar unsigned char
#define DATE_IO P0//P0口并行传输数据(LCD1602的数据端接P0口)
sbit RS=P1^0;//LCD1602寄存器选择端
sbit E=P1^2; //使能信号端
sbit RW=P1^1;//读写控制端
sbit deng=P1^3;//结果
sbit shuzi11=P3^2;//前面的数字加1(因为我的按键是与P3口相连的)
·
sbit shuzi22=P3^7; //后面的数字加1
sbit jia=P3^3;//加号
sbit jian=P3^4;//减号
sbit cheng=P3^5;//乘号
sbit chu=P3^6;//除号
uint countqian=0,counthou=0;//数值
uchar qian,bai,shi,ge,a=0;
uchar code table1[]="09";
*
uchar code table2[]="+-*/";
//**********************延时函数***************************************** void delay_us(unsigned int n)
{
if(n==0)
return ;
while(--n);
}
"
void delay_ms(uint i)
{
unsigned char a,b;
for (a=1;a
for(b=1;b;b++);
}
void delay(uint z)
{
uint x,y;
、
for(x=110;x>0;x--)
for(y=z;y>0;y--);
}
//***********************************************************************
//*********************控制LCD1602的函数*******************************
void write_command(uchar come)//写指令函数
{
RS=0;//选择指令寄存器
E=1;//由高电平跳变成低电平时,液晶执行命令
^
DATE_IO=come;
delay_us(5);
E=0;
RS=1;
}
void write_date(uchar date)//写数据函数
{
RS=1;//选择数据寄存器
E=1;//由高电平跳变成低电平时,液晶执行命令
#
DATE_IO=date;
delay_us(5);
E=0;
RS=0;
}
//***************************************************************************** ***
//**************************液晶初始化函数(基本上就是这个模式)*******************
void init()//液晶初始化函数
{
#
RW=0;//低电平时进行写操作(高电平时进行读操作)
E=0;
write_command(0x38);//设置LCD两行显示,一个数据由5*7点阵表示,数据由8跟线传输delay_ms(5);
write_command(0x01);//清除屏幕显示
delay_ms(5);
write_command(0x06);//设定输入方式,增量不移位
delay_ms(5);
write_command(0x0c);//开整体显示,关光标,不闪烁
delay_ms(5);
!
}
//***************************************************************************** *****
void jiayiqian()//前边数字加1计数函数
{
if(shuzi11==0)//如果前面加1的按键按下
{
delay(50);//消除抖动
countqian=countqian+1;
}
。
if(countqian==999)//记到999归0
countqian=0;
}
void jiayihou()//后边数字加1计数函数
{
if(shuzi22==0)//如果后面加1的按键按下
{
delay(50);//消除抖动
counthou=counthou+1;
?
}
if(counthou==999)//记到999归0
counthou=0;
}
void fuhao()//+,-,*,/运算号
{
if(jia==0)//如果加号按下
{
while(!jia);//等待按键的释放
《
write_date(table2[0]);//显示'+'
a=1;//加号按下的标志
}
if(jian==0)//如果减号按下
{
while(!jian);//等待按键的释放
write_date(table2[1]);//显示'-'
a=2;//减号按下的标志
}
if(cheng==0)//如果乘号按下
[
{
while(!cheng);//等待按键的释放
write_date(table2[2]);//显示'*'
a=3; //乘号按下的标志
}
if(chu==0)////如果除号按下
{
while(!chu);//等待按键的释放
write_date(table2[3]);//显示'/'
a=4;//除号按下的标志
@
}
}
void chaiqian()//将前边各位数字拆开函数
{
bai=countqian/100;//求百位数字
shi=countqian%100/10;//求十位数字
ge=countqian%10;//求各位数字
}
【
void chaihou()//将后边各位数字拆开函数
{
bai=counthou/100;//求百位数字
shi=counthou%100/10;//求十位数字
ge=counthou%10;//求各位数字
}
void chaijiejia()//将相加结果各位数字拆开函数
{
qian=(countqian+counthou)/1000;//求千位数字
(
bai=(countqian+counthou)%1000/100;//求百位数字shi=(countqian+counthou)%100/10;//求十位数字ge=(countqian+counthou)%10;//求各位数字
}
void chaijiejian()//将相减结果各位数字拆开函数
{
qian=(countqian-counthou)/1000;//求千位数字
bai=(countqian-counthou)%1000/100;//求百位数字
shi=(countqian-counthou)%100/10;//求十位数字
(
ge=(countqian-counthou)%10;//求各位数字
}
void chaijiecheng()//将相乘结果各位数字拆开函数
{
qian=(countqian*counthou)/1000;//求千位数字
bai=(countqian*counthou)%1000/100;//求百位数字
shi=(countqian*counthou)%100/10;//求十位数字
ge=(countqian*counthou)%10;//求各位数字
}
…
void chaijiechu()//将相除结果各位数字拆开函数(只取了模值)
{
qian=(countqian/counthou)/1000;//求千位数字
bai=(countqian/counthou)%1000/100;//求百位数字
shi=(countqian/counthou)%100/10;//求十位数字
ge=(countqian/counthou)%10;//求各位数字
}
void xianshiqian()//显示前边数字
<
{
write_command(0x80);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移
write_date(table1[bai]);//第一位显示百位
write_date(table1[shi]); //第二位显示十位
write_date(table1[ge]); //第三位显示个位
fuhao();//显示运算号
delay(50);//改变数值可以修改数字滚动的速度
}
void xianshihou()//显示后边数字
$
{
write_command(0x80+4);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移
write_date(table1[bai]);//第一位显示百位
write_date(table1[shi]); //第二位显示十位
write_date(table1[ge]); //第三位显示个位
//delay(50);//改变数值可以修改数字滚动的速度
}
void xianshijie()//显示结果
{
>
write_command(0xc0);//设置显示地址为LCD第二行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移
write_date(table1[qian]);//第一位显示千位
write_date(table1[bai]);//第二位显示百位
write_date(table1[shi]); //第三位显示十位
write_date(table1[ge]); //第四位显示个位
//delay(50);//改变数值可以修改数字滚动的速度
}
void main()//主函数
{
~
init();//调用液晶初始化函数
while(1)
{
jiayiqian();//调用前边数字加1计数函数
chaiqian();//调用将前边数字各位数字拆开函数
xianshiqian();//显示前边数字
jiayihou();//调用后边数字加1计数函数
chaihou();//调用将后边数字各位数字拆开函数
xianshihou();//显示后边数字
if(deng==0)//控制显示结果的按键按下
<
{
if(a==1)//计算的是加法
{
chaijiejia();//将结果的各位数字拆分开
xianshijie(); //显示结果
}
if(a==2)//计算的是减法
{
chaijiejian(); //将结果的各位数字拆分开
xianshijie();//显示结果
}
if(a==3)//计算的是乘法
{
chaijiecheng();//将结果的各位数字拆分开
xianshijie(); //显示结果
}
if(a==4) //计算的是除法
{
chaijiechu();//将结果的各位数字拆分开
xianshijie(); //显示结果
}
}
}
}