LCD液晶显示的51单片机简单计算器

  • 概述
  • 方案
    • 矩阵键盘输入映射与设计原理
  • 软件设计
    • 软件设计思路
    • 软件代码

概述

LCD液晶显示的51单片机简单计算器可实现完成了两个范围在0到255的数加、减、乘、除运算,其中减法可显示负数,除法只保留整数并由LCD液晶显示。并在实验室实验箱,实现上述功能。完成该任务需要熟悉和了解控制LCD液晶屏的显示的方法,矩阵键盘读取按键值的方法、89C51系列单片机的相关知识、C51编程和数字电子技术的相关知识。
完整代码:https://download.csdn.net/download/weixin_43786907/16524021。

方案

我使用实验室试验箱的2×8矩阵键盘作为的16个按键作为输入分别为0到9、“+”、“-”、“*”、“/”、“=”与复位,由单片机计算并通过LCD显示。

矩阵键盘输入映射与设计原理

系统输入有:0到9、“+”、“-”、“”、“/”、“=”与复位对应矩阵键盘的16个按键。我将矩阵键盘16个按键赋予按键值与并且与实际意义形成映射。
矩阵键盘按键值:

矩阵键盘的输入映射:

矩阵键盘实际上是一个2
8的矩阵按键,在矩阵键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样10个I/O口就可以扫描2*8=16个按键是否按下。
矩阵键盘原理图:

当A端口全部为低电平,D端口的1、2引脚不全为高电平就有按键按下。当确定有按键按下后,A端口的引脚轮流输出低电平,判断D端口的1、2引脚在A端口的哪个引脚为低电平时,D端口的1、2引脚会出现低电平,从而确定哪个按键按下。具体而言,让A端口信从“11111110”到“11111101”……“01111111”循环。D端口的1、2引脚接收两位行信号。A端口八列逐列扫描,当D端口的1、2引脚有一个引脚接收到低电平时便可确定在哪一列,按键按下,再确定D端口第一位为低电平,便可确定哪一列按下。行列结合便可确定哪个按键按下。

软件设计

软件设计思路

程序运行时,首先会判断是否按键按下,若有按键按下确定是哪个按键。并在LCD上显示,按下等号后开始计算,并在LCD上显示结果,并再次判断是否有按键按下,程序循环。若按下复位,程序恢复到初始状态。

软件代码

(1)基本定义部分

#include <reg52.h>                            //C51系列开发头文件
#include <absacc.h>                           //绝对地址访问头文件
#define u8 unsigned char                      //类型重命名
#define u16 unsigned int                      //类型重命名
#define keymax 100                            //按键缺省值
#define Y1602C_W_CON  XBYTE[0xC000]           //LCD写命令地址
#define Y1602C_R_CON  XBYTE[0xC001]           //LCD读忙状态地址
#define Y1602C_W_Data  XBYTE[0xC002]          //LCD写数据地址
#define Y1602C_R_Data  XBYTE[0xC003]          //LCD读数据地址
xdata u8 COM_8255 _at_ 0xF003;                //8255的控制口
xdata u8 PA_8255 _at_ 0xF000;                 //8255的PA口
xdata u8 PB_8255 _at_ 0xF001;                 //8255的PB口
xdata u8 PC_8255 _at_ 0xF002;                 //8255的PC口
void InitLCD();                               //LCD初始化
void DelayXms(u8 X);                          //毫秒延时
void WR_Con(u8 ConData);                      //LCD写数据
void WR_Data(u8 wData);                       //LCD写数据
u8 AllKey();                                  //检测是否有按键按下
u8 keynum=0;                                  //按键号码
u16 a=0,b=0;                                  //当前数值与转存数值
u8 fuhao=0;                                   //符号标志1:+ 2:- 3:* 4:/

(2)延时函数

void DelayXms(u8 X)
{   u8 i,j;i = 2*X;do{ j  = 250;do{}while(--j);}while(--i);
}

(2)LCD相关函数

void WR_Data(u8 WData)
{   Y1602C_W_Data = WData;while(Y1602C_R_CON & 0x80);
}//LCD写数据子程序void WR_Con(u8 ConData)
{   Y1602C_W_CON = ConData;while(Y1602C_R_CON & 0x80);
}//LCD写指令子程序void InitLCD()
{   DelayXms(5);        WR_Con(0x38);       //写指令,5*7点阵,8位CPU接口    WR_Con(0x0C);       //设定为整体显示,光标不显示WR_Con(0x06);       //设定光标正向移动WR_Con(0x01);        //清屏WR_Con(0X80);        //显示初始位置
}//LCD初始化

(3)按键与显示相关函数

u8 AllKey()
{   PB_8255 = 0x0;                     //全"0"->扫描口return ~PC_8255 & 0x3;              //读键状态, 取低二位
}//判断是否有按键按下,返回0无按键按下u8 keyi()
{u8 i;u8 j=keymax;                                    //设置键值为缺省值if (AllKey()!=0)                                //判断有无按键按下{DelayXms(10);if (AllKey()!=0)                            //消抖再判断{i = 0xfe;                        //设置行扫描初值为00000001j=0;                                    //按键初值为0while(i!=0xff){PB_8255 = i;if((PC_8255&0x1)==0){                             //0行有键闭合break;}else if((PC_8255&0x2)==0){                              //1行有键闭合j+=8;                  //按键值加8break;}j++;                      //按键值加1i=((i<<1)|1);             //行扫描}}while((AllKey()!=0));                      //等待按键松开}if(j<10)                                      //为数值{WR_Data((j+'0'));                     //数值转化为对应ASCII码}if(j==10){WR_Data('+');                        //显示“+”}if(j==11){WR_Data('-');                       //显示“-”}if(j==12){WR_Data('*');                      //显示“*”}if(j==13){WR_Data('/');                      //显示“/”}if(j==14){WR_Data('=');                      //显示“=”}if(j==15){WR_Data(' ');                      //显示“空”}return j;
}//返回按键值并通过LCD显示映射值

(4)运算处理函数

void calculate()
{u8 i,j,k;u16 c;u8 jieguo[10];if(keynum<10)                                //数字处理{a=10*a+keynum;                           //原数值*10+现数值keynum=keymax;                           //按值设为缺省}else if(keynum==10)                        //按键为“+”号{b=a;a=0;fuhao=1;keynum=keymax;}else if(keynum==11)                       //按键为“”号{b=a;a=0;fuhao=2;keynum=keymax;}else if(keynum==12)                   //按键为“*”号{b=a;a=0;fuhao=3;keynum=keymax;}else if(keynum==13)                 //按键为“/”号{b=a;a=0;fuhao=4;keynum=keymax;}else if(keynum==14)                   //按键为“=”号{if(fuhao==1)                          //加法处理c=b+a;if(fuhao==2){if(b<a){WR_Data('-');        //减法处理考虑负数c=a-b;}elsec=b-a;}if(fuhao==3)               //乘法处理考虑负数c=a*b;if(fuhao==4)               //除法处理(unsigned int)c=b/a;if(c==0)                  //得数为0特殊处理WR_Data('0');else{for(i=0;c>0;i++)         //得数显示{j=c%10;c=c/10;jieguo[i]=j;}k=i;for(j=0,i=i-1;j<k;i--,j++){WR_Data((jieguo[i]+'0'));}}a=0;b=0;fuhao=0;  //计算完毕,回到初始值}if(keynum==15)                     //复位,回到初始值{a=0;b=0;fuhao=0;InitLCD();}
}

(5)主函数

void main()
{COM_8255 = 0x89;                      //8255设置InitLCD();                         //LCD初始化while(1){keynum=keyi();                  //读取键值calculate();                   //运算}
}

完整代码:https://download.csdn.net/download/weixin_43786907/16524021

LCD液晶显示的51单片机简单计算器相关推荐

  1. 51单片机简单计算器实现(100行)附源码

    不引流,项目最后附上本项目百行源码!! 如果对你有帮助不妨点个赞! 本项目使用:51单片机,矩阵键盘,四位数码管 使用LCD显示的思路相差不大,由于是仿真,包容性比较强,所以还有很大优化空间 先上仿真 ...

  2. 用计算机设计电路图,基于51单片机的计算器设计(含电路图,程序)

    基于51单片机的计算器设计(含电路图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文11200字,程序,答辩PPT) 摘 要 计算器一般是指"电子计算器",能进行 ...

  3. 51单片机-红外计算器

    51单片机-红外计算器 1.硬件:普中-A2开发板 使用哪些硬件资源? 1.1.LCD1602液晶显示器 1.2.红外接收头 1.3.红外遥控器 2.软件介绍: 2.1.共分为8个.c文件. 2.1. ...

  4. 基于51单片机简单病床呼叫系统

    基于51单片机简单病床呼叫系统 基于51单片机设计 主要硬件:AT89C52 扬声器.按键 采用16个按键控制16个床位系统设计 实现代码 #include<reg51.h> #defin ...

  5. 基于51单片机的计算器设计

    能做计算器的单片机 单片机的出现是计算机制造技术高速发展的产物,它是嵌入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域,电子.科技.通信.汽车.工业等.本次设计是设计一个简易计算器,能够进 ...

  6. 51单片机的计算器设计

    一.硬件方案 本设计是以51单片机为核心的计算器模拟系统设计,输入采用4×4矩阵键盘,可以进行加.减.乘.除4位带符号数字运算,并在LCD1602上显示操作过程.整体电路主要由51单片机最小系统,LC ...

  7. 基于51单片机实现计算器功能

    题目要求: 1.根据开发板设计10以内的加法计算器,用LED数码管显示数字和计算结果.(必做). 2.根据开发板设计100以内的计算器,用LED数码管显示数字和计算结果,要求可实现加法.减法.乘法和除 ...

  8. 51单片机简单乐曲演奏(青花瓷)

    51单片机演奏 #include "STC15.h" #include "intrins.h" code unsigned char fvL[]={0x8c,0 ...

  9. 51单片机简易计算器C语言程序,用51单片机制作的简单计算器程序

    三.程序源代码 #include <reg51.h>#include <intrins.h> #include <ctype.h> #include <std ...

最新文章

  1. mysql innodb 设置,Mysql5.5 InnoDB存储引擎简单设置
  2. Flex Builder 开发语言切换问题
  3. ThreadLocal原理与使用
  4. MATLAB中squeeze函数的作用
  5. TextScanner:旷视新作文字识别新突破,确保字符阅读顺序
  6. mysql的索引和执行计划
  7. Eclipse自动部署项目到Tomcat的webapps下的有效方法
  8. Modal View Controllers, Not Model-View-Controller(MVC)
  9. Windows10临时关闭数字签名认证
  10. Mysql binlog入门
  11. VTM3.0代码阅读:xCheckRDCostAffineMerge2Nx2N函数
  12. 网鼎杯2020 玄武组部分writeup
  13. webrtc代码走读二十一(采集视频旋转功能)
  14. 第五部分 3D环绕声技术
  15. 关于JavaScript继承与原型链的一些理解
  16. 架构设计:网络附属存储NAS,块存储EBS与对象存储OSS的比较以及选用
  17. 吴恩达:如何学习机器学习
  18. 这款游戏可能是minecraft和迷你世界的共同敌人了吧!
  19. 访问学者办理签证的问题整理!
  20. 大类资产配置策略(一)恒定混合策略(Constant-mix Strategy)

热门文章

  1. 用Golang写一个搜索引擎(0x03)
  2. Jmeter_模板设置默认请求参数
  3. OO_2019_第一单元总结——表达式求导
  4. 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
  5. 一种快速部署开发用oracle的办法
  6. 2018-2019-1 20165205 20165233 实验二 固件程序设计
  7. No repository found containing,eclipse 自动更新erro 解决
  8. Go 实现 soundex 算法
  9. S. gcc相关软件安装
  10. HDU 5928 DP 凸包graham