您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 51单片机控制lcd1602实现计算器
//利用51单片机控制LCD1602,实现加减乘除运算#includereg52.h#defineuintunsignedint#defineucharunsignedchar#defineDATE_IOP0//P0口并行传输数据(LCD1602的数据端接P0口)sbitRS=P1^0;//LCD1602寄存器选择端sbitE=P1^2;//使能信号端sbitRW=P1^1;//读写控制端sbitdeng=P1^3;//结果sbitshuzi11=P3^2;//前面的数字加1(因为我的按键是与P3口相连的)sbitshuzi22=P3^7;//后面的数字加1sbitjia=P3^3;//加号sbitjian=P3^4;//减号sbitcheng=P3^5;//乘号sbitchu=P3^6;//除号uintcountqian=0,counthou=0;//数值ucharqian,bai,shi,ge,a=0;ucharcodetable1[]=0123456789;ucharcodetable2[]=+-*/;//**********************延时函数*****************************************voiddelay_us(unsignedintn){if(n==0)return;while(--n);}voiddelay_ms(uinti){unsignedchara,b;for(a=1;ai;a++)for(b=1;b;b++);}voiddelay(uintz){uintx,y;for(x=110;x0;x--)for(y=z;y0;y--);}//***********************************************************************//*********************控制LCD1602的函数*******************************voidwrite_command(ucharcome)//写指令函数{RS=0;//选择指令寄存器E=1;//由高电平跳变成低电平时,液晶执行命令DATE_IO=come;delay_us(5);E=0;RS=1;}voidwrite_date(uchardate)//写数据函数{RS=1;//选择数据寄存器E=1;//由高电平跳变成低电平时,液晶执行命令DATE_IO=date;delay_us(5);E=0;RS=0;}//********************************************************************************//**************************液晶初始化函数(基本上就是这个模式)*******************voidinit()//液晶初始化函数{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);}//**********************************************************************************voidjiayiqian()//前边数字加1计数函数{if(shuzi11==0)//如果前面加1的按键按下{delay(50);//消除抖动countqian=countqian+1;}if(countqian==999)//记到999归0countqian=0;}voidjiayihou()//后边数字加1计数函数{if(shuzi22==0)//如果后面加1的按键按下{delay(50);//消除抖动counthou=counthou+1;}if(counthou==999)//记到999归0counthou=0;}voidfuhao()//+,-,*,/运算号{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;//除号按下的标志}}voidchaiqian()//将前边各位数字拆开函数{bai=countqian/100;//求百位数字shi=countqian%100/10;//求十位数字ge=countqian%10;//求各位数字}voidchaihou()//将后边各位数字拆开函数{bai=counthou/100;//求百位数字shi=counthou%100/10;//求十位数字ge=counthou%10;//求各位数字}voidchaijiejia()//将相加结果各位数字拆开函数{qian=(countqian+counthou)/1000;//求千位数字bai=(countqian+counthou)%1000/100;//求百位数字shi=(countqian+counthou)%100/10;//求十位数字ge=(countqian+counthou)%10;//求各位数字}voidchaijiejian()//将相减结果各位数字拆开函数{qian=(countqian-counthou)/1000;//求千位数字bai=(countqian-counthou)%1000/100;//求百位数字shi=(countqian-counthou)%100/10;//求十位数字ge=(countqian-counthou)%10;//求各位数字}voidchaijiecheng()//将相乘结果各位数字拆开函数{qian=(countqian*counthou)/1000;//求千位数字bai=(countqian*counthou)%1000/100;//求百位数字shi=(countqian*counthou)%100/10;//求十位数字ge=(countqian*counthou)%10;//求各位数字}voidchaijiechu()//将相除结果各位数字拆开函数(只取了模值){qian=(countqian/counthou)/1000;//求千位数字bai=(countqian/counthou)%1000/100;//求百位数字shi=(countqian/counthou)%100/10;//求十位数字ge=(countqian/counthou)%10;//求各位数字}voidxianshiqian()//显示前边数字{write_command(0x80);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[bai]);//第一位显示百位write_date(table1[shi]);//第二位显示十位write_date(table1[ge]);//第三位显示个位fuhao();//显示运算号delay(50);//改变数值可以修改数字滚动的速度}voidxianshihou()//显示后边数字{write_command(0x80+4);//设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[bai]);//第一位显示百位write_date(table1[shi]);//第二位显示十位write_date(table1[ge]);//第三位显示个位//delay(50);//改变数值可以修改数字滚动的速度}voidxianshijie()//显示结果{write_command(0xc0);//设置显示地址为LCD第二行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移write_date(table1[qian]);//第一位显示千位write_date(table1[bai]);//第二位显示百位write_date(table1[shi]);//第三位显示十位write_date(table1[ge]);//第四位显示个位//delay(50);//改变数值可以修改数字滚动的速度}voidmain()//主函数{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();//显示结果}}}}
本文标题:51单片机控制lcd1602实现计算器
链接地址:https://www.777doc.com/doc-6328683 .html