单片机功能实现计算机

功能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;
	}
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值