《51单片机控制lcd1602实现计算器(共6页).doc》由会员分享,可在线阅读,更多相关《51单片机控制lcd1602实现计算器(共6页).doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上/利用51单片机控制LCD1602,实现加减乘除运算#include#define uint unsigned int #define uchar unsigned char #define DATE_IO P0/P0口并行传输数据(LCD1602的数据端接P0口)sbit RS=P10;/LCD1602寄存器选择端sbit E=P12; /使能信号端sbit RW=P11;/读写控制端sbit deng=P13;/结果sbit shuzi11=P32;/前面的数字加1(因为我的按键是与P3口相连的)sbit shuzi22=P37; /后面的数字加1 sbit ji
2、a=P33;/加号sbit jian=P34;/减号sbit cheng=P35;/乘号sbit chu=P36;/除号uint countqian=0,counthou=0;/数值uchar qian,bai,shi,ge,a=0;uchar code table1=;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;a0;x-)for(y=z;y0;y-);/*/*控
3、制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
4、; 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; i
5、f(countqian=999)/记到999归0countqian=0;void jiayihou()/后边数字加1计数函数 if(shuzi22=0)/如果后面加1的按键按下 delay(50);/消除抖动 counthou=counthou+1; if(counthou=999)/记到999归0counthou=0; void fuhao()/+,-,*,/运算号 if(jia=0)/如果加号按下 while(!jia);/等待按键的释放 write_date(table20);/显示+a=1;/加号按下的标志 if(jian=0)/如果减号按下 while(!jian);/等待按键的释放
6、 write_date(table21);/显示- a=2;/减号按下的标志 if(cheng=0)/如果乘号按下 while(!cheng);/等待按键的释放 write_date(table22);/显示* a=3;/乘号按下的标志 if(chu=0)/如果除号按下 while(!chu);/等待按键的释放 write_date(table23);/显示/a=4;/除号按下的标志 void chaiqian()/将前边各位数字拆开函数 bai=countqian/100;/求百位数字 shi=countqian%100/10;/求十位数字 ge=countqian%10;/求各位数字voi
7、d 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()/将相
8、减结果各位数字拆开函数 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
9、)%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第一行,
10、一旦首地址确定,显示完第一个数字后,光标会自动加1右移 write_date(table1bai);/第一位显示百位 write_date(table1shi); /第二位显示十位 write_date(table1ge); /第三位显示个位 fuhao();/显示运算号 delay(50);/改变数值可以修改数字滚动的速度void xianshihou()/显示后边数字 write_command(0x80+4);/设置显示地址为LCD第一行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移 write_date(table1bai);/第一位显示百位 write_date(table
11、1shi); /第二位显示十位 write_date(table1ge); /第三位显示个位 /delay(50);/改变数值可以修改数字滚动的速度void xianshijie()/显示结果 write_command(0xc0);/设置显示地址为LCD第二行,一旦首地址确定,显示完第一个数字后,光标会自动加1右移 write_date(table1qian);/第一位显示千位 write_date(table1bai);/第二位显示百位 write_date(table1shi); /第三位显示十位 write_date(table1ge); /第四位显示个位 /delay(50);/改变
12、数值可以修改数字滚动的速度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(); /显示结果 专心-专注-专业