单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.

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

作者: 燦洋   时间: 2019-6-11 15:41
标题: 单片机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, 下载次数: 62)

作者: kudelinshaowudi   时间: 2021-5-26 21:28
定义字符的数字如何加减乘除?

作者: 红鱼   时间: 2024-2-28 16:40
感谢分享,提供了重要思路。




欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1