做了一个简单的计算器。
利用4X4矩阵键盘和1602设计一个计算器
要求:可以实现至少三位数以内之的 加、减、乘、除
(小数、负数可以不考虑)
二、1602显示部分:
第一行:显示键盘输入的数字和运算符号
第二行:显示 “=”+“计算结果”
在输入数据进行计算时,如果有输入错误情况可以按“清除”键,把输错的数清掉,之后可以继续输入正确的数进行计算。
单片机源程序如下:
- #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','=','+','/'};//转换成液晶显示的字符
- 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); //延时有助于稳定
- LCD_Clear(); //清屏
-
- while(1)
- {
- key = keynum();
- if(key!=0xff)
- {
- if(key < 10) //显示0~9的数值
- {
- 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) //第二个数的累加,显示运算符号
- {
- key_flag = key; //记录+-*/
- aa = 1; //开始第二个数累加
- 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是几位数字
- 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); //对应了光标向左移动一格。整体的画面不滚动
- LCD_Write_Com(0x04); //地址指针减一,比如第一个字符写入8FH,则下一个字符会写入8EH;屏幕上的内容不滚动
- i = i - k-1;
- if(aa == 0) //清除第一个数字
- {
- sum_1 = sum_1*k/10;
- }
- else if (aa == 1) //清除第二个数字
- {
- sum_2 = sum_2*k/10;
- }
- k = 0;
- LCD_Write_Com(0x06); //光标后移
- }
- else
- {
- LCD_Write_Com(0x06); //地址指针加一,如第一个字符写入80H,下一个字符会写入81H;内容不会移动
- }
- i++;
- if(i==16)//如果第一行显示满,转到第二行
- {
- i=0;j++;
- if(j==2)//如果2行都显示满,清屏后重新从第一行显示
- {
- j=0;
- }
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
计算器.zip
(51.82 KB, 下载次数: 72)
|