功能1:实现两个数加减乘除运算
功能2:实现清屏功能
功能3:实现长时间不操作清屏功能
仅仅支持两个正数进行运算
*支持答案为65535内的运算
*支持输出负数
*支持除法,但只能保留一位数
#include <REGX52.H>
#include "Delay.h" //包含Delay头文件
#include "LCD1602.h" //包含LCD1602头文件
#include "MatrixKey.h" //包含矩阵键盘头文件
#include "Timer0.h"
int flag=1;
void main() {
int sum=0;
int x=0,y=0;
int a=0,i=0;
int count1=0;
int count2=0;
int num1[7]= {0};
int num2[7]= {0};
int symbol=0;
int TCount=0;
double sum1;
int sum_dot;
unsigned char KeyNum;
LCD_Init(); //LCD初始化
while(1) {
if(flag==0) //这个flag使用来清屏的,后续提到
{
for(i=0;i<16;i++)
{
LCD_ShowString(1,i," ");
}
sum=0;
x=0,y=0;
a=0,i=0;
count1=0;
count2=0;
symbol=0;
flag=1;
}
KeyNum=MatrixKey(); //获取矩阵键盘键码
if(KeyNum) {
if(KeyNum<=10) { //1~10显示数字
if(KeyNum==10) { //10显示0
KeyNum=0;
}
if(a==0) { //a用来判断数字显示在符号左还是右
num1[count1]=KeyNum; //num1存储左边的数字
count1++;
LCD_ShowNum(1,count1,KeyNum,1); //LCD显示键码
}
if(a==1) {
num2[count2]=KeyNum; //num2存储右边的数字
count2++;
LCD_ShowNum(1,8+count2,KeyNum,1); //LCD显示键码
Timer0Init(); //这个是判断是否长时间未操作,如果是则flag=0,清屏
TCount=0;
}
}
}
if(KeyNum>10) { //加减乘除模块
a=1;
switch(KeyNum-10)
{
case 1:
symbol=1; //symbol是标志位用来计算的
LCD_ShowString(1,7,"+"); //按键11为+
break;
case 2:
symbol=2;
LCD_ShowString(1,7,"-"); //按键12为-
break;
case 3:
symbol=3;
LCD_ShowString(1,7,"*"); //按键13为*
break;
case 4:
symbol=4;
LCD_ShowString(1,7,"/"); //按键14为÷
break;
case 5:
TCount=0;
EA=0;
LCD_ShowString(2,1,"="); //按键15为=
for(i=0;i<count1;i++) { //x为符号左边的数字
x=x*10+num1[i];
}
for(i=0;i<count2;i++) {
y=y*10+num2[i]; //y为符号右边的数字
}
if(count2==0) {
sum=x;
LCD_ShowString(2,2,"+"); //如果没输入第二个数字就按=号可以得到第一个数字
LCD_ShowNum(2,3,sum,7);
break;
}
if(symbol==1) { //加法
sum=x+y;
}
if(symbol==2) { //减法
sum=x-y;
}
if(symbol==3) { //乘法
sum=x*y;
}
if(symbol==4) { //除法
sum=sum1=x/(y*1.0);
}
if(sum<0) { //如果答案是负数显示负号
sum=y-x;
LCD_ShowString(2,2,"-");
LCD_ShowNum(2,3,sum,5);
break;
}
if(sum>=0) { //如果答案是正数显示正号
LCD_ShowString(2,2,"+");
LCD_ShowNum(2,3,sum,5);
}
if(symbol==4){ //除法包括小数点只保留一位
LCD_ShowNum(2,3,sum,5);
sum_dot=(sum1-sum)*10;
LCD_ShowString(2,8,".");
LCD_ShowNum(2,9,sum_dot,1);
symbol=0;
}
break;
case 6:
for(i=0;i<16;i++) //清屏,一二行
{
LCD_ShowString(1,i," ");
LCD_ShowString(2,i," ");
}
sum=0; //初始化
x=0,y=0;
a=0,i=0;
count1=0;
count2=0;
symbol=0;
break;
}
}
}
}
void Timer0_Routine() interrupt 1 //判断是否长时间不动
{
int i = 0;
static unsigned int T0Count;
TL0 = 0x20; //设置定时初值
TH0 = 0xD1; //设置定时初值
T0Count++;
if(T0Count>1500)
{
flag=0; //flag=0清屏
T0Count=0;
}
}