1 / 23
文档名称:

基于51单片机的简易计算器.doc

格式:doc   页数:23
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

基于51单片机的简易计算器.doc

上传人:6188 2016/5/4 文件大小:0 KB

下载得到文件列表

基于51单片机的简易计算器.doc

相关文档

文档介绍

文档介绍:基于 51 单片机的简易计算器简介用51 做的一个建议计算器, 能计算 7位数*7位数, 小数点保留三位,其他不多说,上图和程序,由于时间关系,程序没完全优化,解决了按一次计算符号后再按符号键无效的问题。 + 矩阵键盘+1602 显示图3-1 所示为简易计算器的电路原理图。 P3口用于键盘输入,接 4*4 矩阵键盘,键值与键盘的对应表如表---- 所示,p0口和 p2口用于显示,p2口用于显示数值的高位, po口用于显示数值的低位。图 3-1 简易计算器电路原理图 PCB 键值与功能对应表键值 0123456789+- ×/=ON/C 功能 0123456789+- ×÷=清零说明矩阵键盘有 16个按键,满足对简易计算器的计算实现,显示部分采用 LCD1602 , 第一行显示计算的数值符号,第二行显示计算结果。最大能计算 7 位数*7 位数的值,可以计算负数,小数点结果保留有三位,在每次按下计算符号后,接着只能按下数字,再按下符号键无效,也就是每次计算只能按一个计算符号,如输入错误需按 N清零键,或者复位单片机。 2. 计算器的软件设计#include<> #include<> #define uchar unsigned char sbit lcden=P2^2; sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit lcdbf=P0^7; uchar temp,key,i,j,flag,fh,k; long a,b,c; uchar code table[]={1,2,3,0, 4,5,6,0, 7,8,9,0, 0,0,0,0}; uchar code table2[]="123+456-789*000/"; void delay(uchar ms) { uchar x,y; for(x=ms;x>0;x--) for(y=110;y>0;y--); } /*------------- 对 LCD1602 的操作-----------*/ bit busy(void)// 判断忙碌{ bit res; lcdrs=0; lcdrw=1; lcden=1; _nop_(); _nop_(); res=lcdbf; lcden=0; return res; } void write_inst (uchar cmd)// 写命令{ while(busy()==1); // 忙碌就等待 lcdrs=0; lcdrw=0; lcden=0; _nop_(); _nop_(); P0=cmd; _nop_(); _nop_(); lcden=1; _nop_(); _nop_(); lcden=0; } void ()// 写地址{ |0x80); } void write_date(uchar dat) // 写数据{ while(busy()==1); lcdrs=1; lcdrw=0; lcden=0; P0=dat; _nop_(); _nop_(); lcden=1; _nop_(); _nop_(); lcden=0; } void init() // 初始化{ lcden=1; write_inst(0x38);// 显示 8位2行 delay(5); write_inst(0x0c);// 显示开,光标关,不闪烁 delay(5); write_inst(0x06);// 增量方式不位移 delay(5); write_inst(0x80);// 检测忙碌信号 delay(5); write_inst(0x01);// delay(5); } /*------------ 键盘扫描-----------*/ void keyscan()// 键盘扫描{ P3=0xfe; if(P3!=0xfe) { delay(20); if(P3!=0xfe) { temp=P3&0xf0; switch(temp) { case 0xe0:key=0;break; case 0xd0:key=1;break; case 0xb0:key=2;break; case 0x70:key=3;break; }} while(P3!=0xfe); if(key==0||key==1||key==2) { if(j!=0) { write_inst(0x01); j=0; } if(flag==0) { a=a*10+table[key]; } if(flag==1) { b=b*10+table[key]; } write_date(table2[key]); } else { if(k==0) { flag=1; k=1; fh=1; write_date(