久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6707|回復(fù): 2
收起左側(cè)

單片機(jī)LCD1602+矩陣+計算器程序(有詳細(xì)代碼注釋)

[復(fù)制鏈接]
ID:438858 發(fā)表于 2019-6-11 15:41 | 顯示全部樓層 |閱讀模式
做了一個簡單的計算器。
利用4X4矩陣鍵盤和1602設(shè)計一個計算器
要求:可以實現(xiàn)至少三位數(shù)以內(nèi)之的 加、減、乘、除
(小數(shù)、負(fù)數(shù)可以不考慮)
二、1602顯示部分:

第一行:顯示鍵盤輸入的數(shù)字和運算符號
第二行:顯示 “=”+“計算結(jié)果”

在輸入數(shù)據(jù)進(jìn)行計算時,如果有輸入錯誤情況可以按“清除”鍵,把輸錯的數(shù)清掉,之后可以繼續(xù)輸入正確的數(shù)進(jìn)行計算。

單片機(jī)源程序如下:
  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','=','+','/'};//轉(zhuǎn)換成液晶顯示的字符
  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);          //延時有助于穩(wěn)定
  15.         LCD_Clear();          //清屏
  16.         
  17.         while(1)
  18.         {
  19.                 key = keynum();
  20.                  if(key!=0xff)
  21.                         {
  22.                                 if(key < 10)                //顯示0~9的數(shù)值
  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)                 //第二個數(shù)的累加,顯示運算符號
  44.                                 {
  45.                                         key_flag = key;                        //記錄+-*/
  46.                                         aa = 1;                                        //開始第二個數(shù)累加
  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是幾位數(shù)字
  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);                //對應(yīng)了光標(biāo)向左移動一格。整體的畫面不滾動
  94.                                         LCD_Write_Com(0x04);                //地址指針減一,比如第一個字符寫入8FH,則下一個字符會寫入8EH;屏幕上的內(nèi)容不滾動
  95.                                         i = i - k-1;
  96.                                         if(aa == 0)                                        //清除第一個數(shù)字
  97.                                                 {
  98.                                                         sum_1 = sum_1*k/10;        
  99.                                                 }
  100.                                         else if (aa == 1)                        //清除第二個數(shù)字
  101.                                                 {
  102.                                                         sum_2 = sum_2*k/10;
  103.                                                 }
  104.                                         k = 0;
  105.                                         LCD_Write_Com(0x06);                //光標(biāo)后移
  106.                                 }
  107.                                 else
  108.                                 {
  109.                                         LCD_Write_Com(0x06);        //地址指針加一,如第一個字符寫入80H,下一個字符會寫入81H;內(nèi)容不會移動
  110.                                 }
  111.                                 i++;
  112.                         if(i==16)//如果第一行顯示滿,轉(zhuǎn)到第二行
  113.                           {
  114.                            i=0;j++;
  115.                            if(j==2)//如果2行都顯示滿,清屏后重新從第一行顯示
  116.                            {
  117.                                   j=0;
  118.                            }
  119.                    }
  120.         }
  121.         }
  122. }
復(fù)制代碼
}HA`6@(C3{HGA`9%KCS($$M.png V}~}0M[5K0R8S_I{QW)C1SQ.png
所有資料51hei提供下載:
計算器.zip (51.82 KB, 下載次數(shù): 72)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:927822 發(fā)表于 2021-5-26 21:28 | 顯示全部樓層
定義字符的數(shù)字如何加減乘除?
回復(fù)

使用道具 舉報

ID:1111750 發(fā)表于 2024-2-28 16:40 | 顯示全部樓層
感謝分享,提供了重要思路。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频一区 | 午夜精品久久久久久不卡欧美一级 | 国产精品久久久久久吹潮 | 日韩一区二区三区视频在线观看 | 久久精品视频在线免费观看 | 日本不卡视频在线播放 | 午夜精品久久久久久久星辰影院 | 高清欧美性猛交xxxx黑人猛交 | 成人在线亚洲 | 成人精品视频免费 | 九九热在线精品视频 | 国产一区二区三区四区 | 热99视频 | 黄色免费在线观看网址 | www国产成人免费观看视频,深夜成人网 | 91人人视频在线观看 | 在线成人免费视频 | 一区二区蜜桃 | 国产一区二区欧美 | 亚洲精品视频一区二区三区 | 国产成人精品网站 | 久久人人网 | 在线免费观看日本 | 国久久| 特黄毛片 | 亚洲乱码一区二区三区在线观看 | 天天澡天天操 | 最新国产精品精品视频 | 久久国产精品一区二区三区 | 久久高清亚洲 | 国产精品不卡 | 欧美精品一区二区三区在线播放 | 精品91久久| 亚洲国产精品久久久久久 | 拍真实国产伦偷精品 | 九九热国产精品视频 | 福利视频一区二区 | 亚洲精品一区二 | 欧美一区二区三区四区五区无卡码 | 欧美群妇大交群中文字幕 | 久久大 |