protues中有KEYPAD-SMALLCALC直接就是4*4的矩阵:

​​​​​​​        

做完之后才发现了,当时不知道,自己画了一个4*4的矩阵键盘

1.protues仿真图

2.源程序

        注释我写的很详细

#include "reg52.h"
typedef unsigned int uint;    //定于无符号int
typedef unsigned char uchar;  //定义无符号char
sbit rw=P2^5;
sbit rs=P2^6;
sbit e=P2^7;             uint fuhao,flag,k,i,j,num;
uchar disp[]="     ERROR!";//除数为0时,显示
uchar wel[]="    Welcome!";//初始化时显示
long a,b,c,x;void delay(long i)  //延时
{while(i--);
}void Delay1000ms()     //@11.0592MHz   STC-ISP软件延时计算器生成延时一秒函数
{unsigned char i, j, k;i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i);
}void lcdwrc(uint c) //设置LCD写命令
{delay(1000);rs=0;rw=0;e=0;P0=c;e=1;delay(1000);e=0;
}void lcdwrd(uint dat) //设置LCD写数据
{delay(1000);rs=1;rw=0;e=0;P0=dat;e=1;delay(1000);e=0;rs=0;
}void lcdinit()   //初始化LCD
{delay(1500);lcdwrc(0x38);delay(500);lcdwrc(0x38);delay(500);lcdwrc(0x38);delay(500);lcdwrc(0x38); //功能设定指令lcdwrc(0x08);  //lcdwrc(0x01); //清屏lcdwrc(0x06);  //设置LCD显示lcdwrc(0x0c); //显示开关控制指令num=0;fuhao=0;flag=0;a=0;b=0;c=0;x=0;k=0;j=0;
}void KeyDown()     //按键函数
{k=0;     P1=0x0f;   //后列前行 列都为高电平1,行都为低电平0 if(P1!=0x0f)//有按键被按下 {delay(1000);if(P1!=0x0f)//延时再次判断,软件消抖 {P1=0x0f;//列都为高电平1,行都为低电平0switch(P1){case 0x07:      //0000 0111 第一列有按键被按下 {P1=0xf0;//列都为低电平0,行都为高电平1 switch(P1)//判断哪一行的按键被按下 {case 0x70: num = 1;k=7;break;    //0111 0000第一列第一行 case 0xb0: num = 5;k=4;break;    //1011 0000第一列第二行 case 0xd0: num = 9;k=1;break;    //1101 0000第一列第三行 case 0xe0: num = 13;break;       //1110 0000第一列第四行 } if(num!=13)//被按下的按键不是清零键 {if(fuhao==0)//fuhao==0,表示第一个数a,fuhao==1,表示第二个数b a=a*10+k;elseb=b*10+k;}lcdwrd(0x30+k);//显示按下的数,0x3y:显示y if(num==13)//按下的按键是清零键{     lcdwrc(0x01);  //清屏指令          lcdinit();//重新初始化LCD1602 }                      }while(P1!=0xf0);break;//当有按键被按下时,结束此次判断,进行下一次判断 case 0x0b: //0000 1011 第二列有按键被按下 {P1=0xf0;//列都为低电平0,行都为高电平1switch(P1)//判断哪一行有按键被按下 {case 0x70: k=8;break;//第二列第一行 case 0xb0: k=5;break;//第二列第二行 case 0xd0: k=2;break;//第二列第三行 case 0xe0: k=0;break;//第二列第四行 }   if(fuhao==0)a=a*10+k;elseb=b*10+k;    lcdwrd(0x30+k);    }while(P1!=0xf0);break;case 0x0d: //0000 1101 第三列有按键被按下 {P1=0xf0;switch(P1){case 0x70: num=3;k=9;break;//第三列第一行 case 0xb0: num=7;k=6;break;//第三列第二行 case 0xd0: num=11;k=3;break;//第三列第三行 case 0xe0: num=15;break;//第三列第四行 }    if(num!=15){   if(fuhao==0)a=a*10+k;elseb=b*10+k;    lcdwrd(0x30+k);}if(num==15)//按下的键为=键 {switch(flag)//判断进行哪种运算 {case 1://+{c=a+b;//计算结果 lcdwrc(0x4f+0x80);//光标置于第二行末尾 lcdwrc(0x04);//设置显示方式:显示后指针减一 if(c==0)//若结果为0 lcdwrd(0x30);//显示0 while(c!=0){lcdwrd(0x30+c%10);//从最后一位开始显示 c=c/10; }lcdwrd(0x3d);//显示= }break;case 2://-{if(a>b)c=a-b;elsec=b-a;//计算两数相减的绝对值 lcdwrc(0x4f+0x80);//将光标置于第二行末尾 lcdwrc(0x04);//设置显示方式:显示后指针减一 if(c==0)//若结果为零 lcdwrd(0x30);//显示0 while(c!=0) {lcdwrd(0x30+c%10);//从最后一位开始显示c=c/10;}if(a<b)//若结果为负数 lcdwrd(0x2d);//ROM字符库-lcdwrd(0x3d);//显示= }break;case 3://*{c=a*b; //计算结果 lcdwrc(0x4f+0x80);//光标置于第二行末尾 lcdwrc(0x04);//显示设置:显示后指针减一 if(c==0)//若结果为0 lcdwrd(0x30);//显示0 while(c!=0)  {                                          lcdwrd(0x30+c%10); //从最后一位开始显示c=c/10; }lcdwrd(0x3d);  //显示=  }    break;case 4:  //÷ {   if(b==0)//若除数为0 { lcdwrc(0x01);//清屏 for(j=0;j<11;j++){lcdwrd(disp[j]);//显示语句:ERROR! }delay(5000);//延时 lcdwrc(0x01);//初始化LCD1602delay(5000);}else{ //将结果放大10000倍 c=(long)(((float)a/b)*10000);//例36/6=6.0000  60000x=c;lcdwrc(0x4f+0x80);//光标第二行最后lcdwrc(0x04);//I/D==0while(c!=0)   //一位一位显示{k++;lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置  //0  00  000  0000c=c/10;//取前面的结果数据if(x>0&&x<=9){if(k==1)//只有小数点后最后一位{    lcdwrd(0x30);//0lcdwrd(0x30);//0lcdwrd(0x30);//0 lcdwrd(0x2e);//.k=0;}}if(x>9&&x<=99){  if(k==2)//只有小数点后最后两位{ lcdwrd(0x30);//0lcdwrd(0x30);//0lcdwrd(0x2e);//.k=0;}}if(x>99&&x<=999){if(k==3)//只有小数点后最后三位{lcdwrd(0x30);//0lcdwrd(0x2e);//.k=0;}    }else if(k==4)//小数点后四位都有{lcdwrd(0x2e);//.k=0;}       }if(x<10000)lcdwrd(0x30);//若结果小于1,在各位补充0 lcdwrd(0x3d);//显示=    } }   break;}}}while(P1!=0xf0);break;case 0x0e: //0000 1110{ fuhao=1; //有符号键被按下 P1=0xf0; //1111 0000switch(P1){case 0x70:/*0111 0000*/flag=4;lcdwrd(0xfd);break;//除号第四列第一行 case 0xb0:/*1011 0000*/flag=3;lcdwrd(0x2a);break;//*   第四列第二行 case 0xd0:/*1101 0000*/flag=2;lcdwrd(0x2d);break;//-   第四列第三行 case 0xe0:/*1110 0000*/flag=1;lcdwrd(0x2b);break;//+   第四列第四行 }     }  while(P1!=0xf0);break;}}}
}void main()
{   uint x;lcdinit();//LCD1602初始化 for(x=0;x<12;x++)lcdwrd(wel[x]);//显示欢迎语句:Welcome Delay1000ms();//STC-ISP软件延时计算器1s延时函数 lcdwrc(0x01);//LCd1602清屏 while(1)      KeyDown();//按键判断函数
}

基于51单片机简易计算器LCD1602显示相关推荐

  1. 基于51单片机+DHT11温湿度+LCD1602显示

    DHT温湿度1602显示 DHT11温湿度相关介绍 DHT11产品概述 1.测量范围 2.接口说明 3.电源引脚 4.串行接口 (单线双向) 5.相关时序及代码 6. DHT11引脚说明 程序代码 m ...

  2. 【Proteus仿真】51单片机制作简易计算器+ LCD1602显示

    [Proteus仿真]51单片机制作简易计算器+ LCD1602显示 Proteus仿真效果演示 程序代码 #include<reg51.h> //头文件 #define uint uns ...

  3. 51单片机设计简易计算机原理,基于AT89C51单片机简易计算器的设计(DOC).docx

    PAGE PAGE # 基于AT89C51单片机简易计算器的设计 [摘要]单片机的出现是计算机制造技术高速发展的产物,它是嵌 入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域, 电子.科技 ...

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

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

  5. 4. 51 测量空气的温度和湿度(51单片机 + DHT11温湿度 + LCD1602显示)

    51单片机 + DHT11温湿度 + LCD1602显示 DHT11温湿度相关介绍 DHT11产品概述 测量范围 接口说明 电源引脚 串行接口 (单线双向) 相关时序及代码 用代码实现上述时序图(起始 ...

  6. 51单片机ADC0832模数转换+ LCD1602显示+Proteus仿真

    51单片机ADC0832模数转换+ LCD1602显示+Proteus仿真 Proteus仿真 在Proteus SP2仿真过程中发现无法读取ADC0832的数据.解决办法:在proteus安装目录下 ...

  7. 基于51单片机的计算器 汇编语言 proteus仿真 数码管显示

    之前讲的计算器都是基于C语言的,接下来讲一下基于汇编语言的简易计算器. 硬件设计 显示器仍然是数码管,MCU是C51,支持整数部分的计算 仿真图: 程序设计 YJ EQU 50H ;结果存放 YJ1 ...

  8. 基于51单片机简易智能家居

    基于51单片机的智能家居的设计 前言 一.项目简介 二.开发环境/工具: 1.Keil 5/Keil 4 2.STC-ISP 3.蓝牙串口助手 4.手机app 三.硬件设计: 1.单片机与蓝牙模块连接 ...

  9. 基于51单片机简易数字示波器Proteus仿真

    功能介绍: 采用51单片机作为主控CPU:LCD12864可显示方波,三角波,锯齿波,正弦波等,可通过光标对波形进行测量,可以调节显示波形的幅度和频率,也可以将波形进行左右拖拉,完美的仿真出一个51单 ...

  10. 29、基于51单片机简易电子琴(有存储功能)系统设计

    摘  要 随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶.我们都会抽空欣赏世界名曲,作为对精神的洗礼.本论文设计一个基于单片机的简易电子琴.我们对于电子琴如何实 ...

最新文章

  1. 判断三角形与射线相交的完整代码。。。
  2. python的set结构
  3. hexo github搭建博客常用的命令
  4. 简历不会做?集设网社区带来精致的个人网站供你参考
  5. ArcGIS Runtime for Android开发教程V2.0(9)基础篇-----查询检索
  6. 列车运行图的编制原则是什么_列车运行图编制规则
  7. Vue 项目静态化打包 seo优化
  8. 数字类型转换以及函数全介绍
  9. 【Android驱动】高通msm8953背光流程
  10. 软件测试思想者 - 初识抑郁症
  11. 埃拉托色尼筛选法 C++实现
  12. 计算机在职研究生的详细介绍
  13. C4D 克隆 学习笔记
  14. matlab习题及答案,MATLAB习题及答案
  15. 通信行业和互联网行业对比分析
  16. c++ 常用STL 之unordered_map
  17. Oracle 11g R2 Clusterware新特性 – HAIP详解
  18. 武汉python工资怎么样_Python前景、就业、薪资大揭秘,打工者必看!
  19. CC1101的WOR电磁波唤醒方式用法
  20. 新模式!chatGPT+Python爬虫接私单怎么玩?

热门文章

  1. 计算机网络中的A类、B类、C类地址的划分
  2. 将EBS设为首页worklist删除误报
  3. (MATLAB源代码)SVM多分类
  4. 信息管理系统项目前端界面设计
  5. sql取上个月年月_sql 查询本年、本月、本日记录的语句,附SQL日期函数
  6. USB2.0 EMC标准设计
  7. Python使用python-snap7实现西门子PLC通讯
  8. rs485接口上下拉_通讯接口应用笔记1:RS485通讯上下拉电阻的选择
  9. win10需要开启系统打印机服务器,Win10系统开启和关闭打印机服务技巧
  10. 千图/千库/我图网/觅元素,终身会员来了!设计师的福利日!视觉运营室