基于单片机的计算器设计1602完整版

上传人:s9****2 文档编号:555995769 上传时间:2024-02-29 格式:DOC 页数:24 大小:868KB
返回 下载 相关 举报
基于单片机的计算器设计1602完整版_第1页
第1页 / 共24页
基于单片机的计算器设计1602完整版_第2页
第2页 / 共24页
基于单片机的计算器设计1602完整版_第3页
第3页 / 共24页
基于单片机的计算器设计1602完整版_第4页
第4页 / 共24页
基于单片机的计算器设计1602完整版_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《基于单片机的计算器设计1602完整版》由会员分享,可在线阅读,更多相关《基于单片机的计算器设计1602完整版(24页珍藏版)》请在金锄头文库上搜索。

1、3.1 硬件连接图3-1所示为简易计算器的电路原理图。P3口用于键盘输入,接4*4矩阵键盘,键值与键盘的对应表如表-所示,p0口和p2口用于显示,p2口用于显示数值的高位,po口用于显示数值的低位。图3-1 简易计算器电路原理图键值与功能对应表键值0123456789+-/=ON/C功能0123456789+-=清零表3-13.2 计算器的软件设计#include /头文件#define uint unsigned int / #define uchar unsigned charsbit lcden=P23; /定义引脚sbit rs=P24;sbit rw=P20;sbit busy=P0

2、7;char i,j,temp,num,num_1;long a,b,c; /a,第一个数 b,第二个数 c,得数float a_c,b_c;uchar flag,fuhao;/flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table=7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0;uchar code table1=7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30;void delay(uchar z) / 延迟函数uchar y;

3、for(z;z0;z-) for(y=0;y110;y+);void check() / 判断忙或空闲do P0=0xFF; rs=0; /指令 rw=1; /读 lcden=0; /禁止读写 delay(1); /等待,液晶显示器处理数据 lcden=1; /允许读写 while(busy=1); /判断是否为空闲,1为忙,0为空闲void write_com(uchar com) / 写指令函数P0=com; /com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;void write_date(uchar date) / 写数据函数 P0=date;rs

4、=1;rw=0;lcden=0;check();lcden=1;void init() /初始化 num=-1;lcden=1; /使能信号为高电平write_com(0x38); /8位,2行write_com(0x0c); /显示开,光标关,不闪烁*/write_com(0x06); /增量方式不移位 显竟獗暌贫 柚?write_com(0x80); /检测忙信号write_com(0x01); /显示开,光标关,不闪烁num_1=0;i=0;j=0;a=0; /第一个参与运算的数b=0; /第二个参与运算的数c=0;flag=0; /flag表示是否有符号键按下, fuhao=0; /

5、fuhao表征按下的是哪个符号void keyscan() / 键盘扫描程序P3=0xfe; if(P3!=0xfe) delay(20); 延迟20ms if(P3!=0xfe) temp=P3&0xf0; switch(temp) case 0xe0:num=0; break; case 0xd0:num=1; break; case 0xb0:num=2; break; case 0x70:num=3; break; while(P3!=0xfe); if(num=0|num=1|num=2)/如果按下的是7,8或9 if(j!=0) write_com(0x01); j=0; if(f

6、lag=0)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else/如果按下的是/ flag=1; fuhao=4;/4表示除号已按 i=table1num; write_date(0x30+i);P3=0xfd;if(P3!=0xfd) delay(5); if(P3!=0xfd) temp=P3&0xf0; switch(temp) case 0xe0:num=4; break; case 0xd0:num=5; break; case 0xb0:num=6; break; case 0x70:num=7; break; w

7、hile(P3!=0xfd); if(num=4|num=5|num=6&num!=7)/如果按下的是4,5或6 if(j!=0) write_com(0x01); j=0; if(flag=0)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else/如果按下的是/ flag=1; fuhao=3;/3表示乘号已按 i=table1num; write_date(0x30+i);P3=0xfb;if(P3!=0xfb) delay(5); if(P3!=0xfb) temp=P3&0xf0; switch(temp) case

8、0xe0:num=8; break; case 0xd0:num=9; break; case 0xb0:num=10; break; case 0x70:num=11; break; while(P3!=0xfb); if(num=8|num=9|num=10)/如果按下的是1,2或3 if(j!=0) write_com(0x01); j=0; if(flag=0)/没有按过符号键 a=a*10+tablenum; else/如果按过符号键 b=b*10+tablenum; else if(num=11)/如果按下的是- flag=1; fuhao=2;/2表示减号已按 i=table1n

9、um; write_date(0x30+i);P3=0xf7;if(P3!=0xf7) delay(5); if(P3!=0xf7) temp=P3&0xf0; switch(temp) case 0xe0:num=12; break; case 0xd0:num=13; break; case 0xb0:num=14; break; case 0x70:num=15; break; while(P3!=0xf7); switch(num) case 12:write_com(0x01);a=0;b=0;flag=0;fuhao=0;/按下的是清零 break; case 13: /按下的是0

10、 if(flag=0)/没有按过符号键 a=a*10; write_date(0x30); P1=0; else if(flag=1)/如果按过符号键 b=b*10; write_date(0x30); break; case 14:j=1; if(fuhao=1)write_com(0x80+0x4f);/按下等于键,光标前进至第二行最后一个显示处 write_com(0x04); /设置从后住前写数据,每写完一个数据,光标后退一格 c=a+b; while(c!=0) write_date(0x30+c%10); c=c/10; write_date(0x3d); /再写= a=0;b=0;flag=0;fuhao=0; else if(fuhao=2)write_com(0x80+0x4f);/光标前进至第二行最后一个显示处 write_com(0x04); /设置从后住前写数据,每写完一个数据,光标后退一格(这个照理说顺序不对,可显示和上段一样)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号