找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5117|回复: 2
打印 上一主题 下一主题
收起左侧

单片机LCD1602+矩阵+计算器程序(有详细代码注释)

[复制链接]
跳转到指定楼层
楼主
做了一个简单的计算器。
利用4X4矩阵键盘和1602设计一个计算器
要求:可以实现至少三位数以内之的 加、减、乘、除
(小数、负数可以不考虑)
二、1602显示部分:

第一行:显示键盘输入的数字和运算符号
第二行:显示 “=”+“计算结果”

在输入数据进行计算时,如果有输入错误情况可以按“清除”键,把输错的数清掉,之后可以继续输入正确的数进行计算。

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <stdlib.h>
  3. #include "keyport.h"
  4. #include "delay.h"
  5. #include <math.h>
  6. #include "1602.h"

  7. float code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','-','*','C','=','+','/'};//转换成液晶显示的字符
  8. void main()
  9. {
  10.         unsigned char key,i,j,k,key_flag,n;
  11.         int sum_1,sum_2,sum,sums;
  12.         bit aa = 0;
  13.         LCD_Init();           //初始化液晶
  14.         DelayMs(20);          //延时有助于稳定
  15.         LCD_Clear();          //清屏
  16.         
  17.         while(1)
  18.         {
  19.                 key = keynum();
  20.                  if(key!=0xff)
  21.                         {
  22.                                 if(key < 10)                //显示0~9的数值
  23.                                 {
  24.                                         if(aa == 0 )        //第一次累加sum_1的值
  25.                                         {
  26.                                                    sum_1 = sum_1*10 + key;
  27.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_1/10000%10]);
  28.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_1/1000%10]);
  29.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_1/100%10]);
  30.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_1/10%10]);
  31.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_1%10]);
  32.                                         }
  33.                                         if(aa == 1 )        //第二次累加sum_2的值
  34.                                         {
  35.                                                 sum_2 = sum_2*10 + key;
  36.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_2/10000%10]);
  37.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_2/1000%10]);
  38.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_2/100%10]);
  39.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_2/10%10]);
  40.                                                 LCD_Write_Char(0+i,0+j,dofly_code[sum_2%10]);
  41.                                         }
  42.                                 }
  43.                                 else if(key == 10 || key == 14 || key == 11 || key == 15)                 //第二个数的累加,显示运算符号
  44.                                 {
  45.                                         key_flag = key;                        //记录+-*/
  46.                                         aa = 1;                                        //开始第二个数累加
  47.                                         LCD_Write_Char(0+i,0+j,dofly_code[key]);//依次显示输入字符
  48.                                 }
  49.                                 if(key == 13)                //如果按下等于号
  50.                                 {
  51.                                         LCD_Write_Char(0,1+j,dofly_code[key]);//依次显示输入字符
  52.                                         switch (key_flag)               
  53.                                                 {
  54.                                                         case 14:
  55.                                                                 sum = sum_1 + sum_2;
  56.                                                                 break;
  57.                                                         case 10:
  58.                                                                 sum = sum_1 - sum_2;
  59.                                                                 break;
  60.                                                         case 11:
  61.                                                                 sum = sum_1 * sum_2;
  62.                                                                 break;
  63.                                                         case 15:
  64.                                                                 sum = sum_1 / sum_2;
  65.                                                                 break;
  66.                                                 }
  67.                                                 sums = sum;                        //检测sum是几位数字
  68.                                                 while(sums)
  69.                                                         {
  70.                                                                 n++;
  71.                                                                 sums/=10;
  72.                                                     }
  73.                                                         switch (n)                //显示消隐
  74.                                                                 {
  75.                                                                         case 5:
  76.                                                                                 LCD_Write_Char(n-4,1+j,dofly_code[sum/10000%10]);
  77.                                                                         case 4:
  78.                                                                                 LCD_Write_Char(n-3,1+j,dofly_code[sum/1000%10]);
  79.                                                                         case 3:
  80.                                                                                 LCD_Write_Char(n-2,1+j,dofly_code[sum/100%10]);
  81.                                                                         case 2:
  82.                                                                                 LCD_Write_Char(n-1,1+j,dofly_code[sum/10%10]);
  83.                                                                         case 1:
  84.                                                                                 LCD_Write_Char(n-0,1+j,dofly_code[sum%10]);
  85.                                                                                 break;
  86.                                                                         case 0:
  87.                                                                                 LCD_Write_Char(1,1+j,dofly_code[0]);
  88.                                                                 }
  89.                                 }
  90.                                 if(key == 12)                                //清除错误输入
  91.                                 {
  92.                                         k++;
  93.                                         LCD_Write_Com(0x10);                //对应了光标向左移动一格。整体的画面不滚动
  94.                                         LCD_Write_Com(0x04);                //地址指针减一,比如第一个字符写入8FH,则下一个字符会写入8EH;屏幕上的内容不滚动
  95.                                         i = i - k-1;
  96.                                         if(aa == 0)                                        //清除第一个数字
  97.                                                 {
  98.                                                         sum_1 = sum_1*k/10;        
  99.                                                 }
  100.                                         else if (aa == 1)                        //清除第二个数字
  101.                                                 {
  102.                                                         sum_2 = sum_2*k/10;
  103.                                                 }
  104.                                         k = 0;
  105.                                         LCD_Write_Com(0x06);                //光标后移
  106.                                 }
  107.                                 else
  108.                                 {
  109.                                         LCD_Write_Com(0x06);        //地址指针加一,如第一个字符写入80H,下一个字符会写入81H;内容不会移动
  110.                                 }
  111.                                 i++;
  112.                         if(i==16)//如果第一行显示满,转到第二行
  113.                           {
  114.                            i=0;j++;
  115.                            if(j==2)//如果2行都显示满,清屏后重新从第一行显示
  116.                            {
  117.                                   j=0;
  118.                            }
  119.                    }
  120.         }
  121.         }
  122. }
复制代码

所有资料51hei提供下载:
计算器.zip (51.82 KB, 下载次数: 59)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:927822 发表于 2021-5-26 21:28 | 只看该作者
定义字符的数字如何加减乘除?
回复

使用道具 举报

板凳
ID:1111750 发表于 2024-2-28 16:40 | 只看该作者
感谢分享,提供了重要思路。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表