|
做了一個簡單的計算器。
利用4X4矩陣鍵盤和1602設(shè)計一個計算器
要求:可以實現(xiàn)至少三位數(shù)以內(nèi)之的 加、減、乘、除
(小數(shù)、負(fù)數(shù)可以不考慮)
二、1602顯示部分:
第一行:顯示鍵盤輸入的數(shù)字和運算符號
第二行:顯示 “=”+“計算結(jié)果”
在輸入數(shù)據(jù)進(jìn)行計算時,如果有輸入錯誤情況可以按“清除”鍵,把輸錯的數(shù)清掉,之后可以繼續(xù)輸入正確的數(shù)進(jìn)行計算。
單片機(jī)源程序如下:
- #include <reg52.h>
- #include <stdlib.h>
- #include "keyport.h"
- #include "delay.h"
- #include <math.h>
- #include "1602.h"
- float code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','-','*','C','=','+','/'};//轉(zhuǎn)換成液晶顯示的字符
- void main()
- {
- unsigned char key,i,j,k,key_flag,n;
- int sum_1,sum_2,sum,sums;
- bit aa = 0;
- LCD_Init(); //初始化液晶
- DelayMs(20); //延時有助于穩(wěn)定
- LCD_Clear(); //清屏
-
- while(1)
- {
- key = keynum();
- if(key!=0xff)
- {
- if(key < 10) //顯示0~9的數(shù)值
- {
- if(aa == 0 ) //第一次累加sum_1的值
- {
- sum_1 = sum_1*10 + key;
- LCD_Write_Char(0+i,0+j,dofly_code[sum_1/10000%10]);
- LCD_Write_Char(0+i,0+j,dofly_code[sum_1/1000%10]);
- LCD_Write_Char(0+i,0+j,dofly_code[sum_1/100%10]);
- LCD_Write_Char(0+i,0+j,dofly_code[sum_1/10%10]);
- LCD_Write_Char(0+i,0+j,dofly_code[sum_1%10]);
- }
- if(aa == 1 ) //第二次累加sum_2的值
- {
- sum_2 = sum_2*10 + key;
- LCD_Write_Char(0+i,0+j,dofly_code[sum_2/10000%10]);
- LCD_Write_Char(0+i,0+j,dofly_code[sum_2/1000%10]);
- LCD_Write_Char(0+i,0+j,dofly_code[sum_2/100%10]);
- LCD_Write_Char(0+i,0+j,dofly_code[sum_2/10%10]);
- LCD_Write_Char(0+i,0+j,dofly_code[sum_2%10]);
- }
- }
- else if(key == 10 || key == 14 || key == 11 || key == 15) //第二個數(shù)的累加,顯示運算符號
- {
- key_flag = key; //記錄+-*/
- aa = 1; //開始第二個數(shù)累加
- LCD_Write_Char(0+i,0+j,dofly_code[key]);//依次顯示輸入字符
- }
- if(key == 13) //如果按下等于號
- {
- LCD_Write_Char(0,1+j,dofly_code[key]);//依次顯示輸入字符
- switch (key_flag)
- {
- case 14:
- sum = sum_1 + sum_2;
- break;
- case 10:
- sum = sum_1 - sum_2;
- break;
- case 11:
- sum = sum_1 * sum_2;
- break;
- case 15:
- sum = sum_1 / sum_2;
- break;
- }
- sums = sum; //檢測sum是幾位數(shù)字
- while(sums)
- {
- n++;
- sums/=10;
- }
- switch (n) //顯示消隱
- {
- case 5:
- LCD_Write_Char(n-4,1+j,dofly_code[sum/10000%10]);
- case 4:
- LCD_Write_Char(n-3,1+j,dofly_code[sum/1000%10]);
- case 3:
- LCD_Write_Char(n-2,1+j,dofly_code[sum/100%10]);
- case 2:
- LCD_Write_Char(n-1,1+j,dofly_code[sum/10%10]);
- case 1:
- LCD_Write_Char(n-0,1+j,dofly_code[sum%10]);
- break;
- case 0:
- LCD_Write_Char(1,1+j,dofly_code[0]);
- }
- }
- if(key == 12) //清除錯誤輸入
- {
- k++;
- LCD_Write_Com(0x10); //對應(yīng)了光標(biāo)向左移動一格。整體的畫面不滾動
- LCD_Write_Com(0x04); //地址指針減一,比如第一個字符寫入8FH,則下一個字符會寫入8EH;屏幕上的內(nèi)容不滾動
- i = i - k-1;
- if(aa == 0) //清除第一個數(shù)字
- {
- sum_1 = sum_1*k/10;
- }
- else if (aa == 1) //清除第二個數(shù)字
- {
- sum_2 = sum_2*k/10;
- }
- k = 0;
- LCD_Write_Com(0x06); //光標(biāo)后移
- }
- else
- {
- LCD_Write_Com(0x06); //地址指針加一,如第一個字符寫入80H,下一個字符會寫入81H;內(nèi)容不會移動
- }
- i++;
- if(i==16)//如果第一行顯示滿,轉(zhuǎn)到第二行
- {
- i=0;j++;
- if(j==2)//如果2行都顯示滿,清屏后重新從第一行顯示
- {
- j=0;
- }
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
計算器.zip
(51.82 KB, 下載次數(shù): 72)
2019-6-11 15:41 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|