⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 这是一个LCD显示的计算器
💻 C
字号:
//***************************************************************************************************************
//*程序名称	: 简易计算器程序
//*硬件环境	: MJ51学习板(LittleJimmy V1.0)
//*CPU类型	: AT89S52@12MHz
//*程序作者	:  LittleJimmy, jimmy416@163.com
//*编写日期	:  2007-8-28
//*
//*特殊说明	:	由于本学习板中许多功能复用了单片机引脚,所以某些实验需要进行跳线,具体实验中都会有详细说明
//*
//*跳线说明	:	请将J3第1,2,3,4,5,6,7位跳线设置到 ‘LCD’ 侧			
//***************************************************************************************************************
#include <reg52.h>
#include <stdlib.h>
#include <stdio.h>

/************************************************************
程序说明:
	此计算器为简易算器,操作数(包括小数点)最长为5位,每次只
	能计算一次,要重新计算须清零后才能重新计算。
键盘说明:
	S1,S2,S3,S4,S5,S6,S7,S8,S9,S10代表: 0,1,2,3,4,5,6,7,8,9
	S11:小数点
	S12:等于号
	S13,S14,S15,S16代表: +,-,*,/
	int0键:清零
	      |C|
	---------
	|0|1|2|3|
	---------
	|4|5|6|7|
	---------
	|8|9|.|=|
	---------
	|+|-|*|/|
	---------
************************************************************/

#define	U8	unsigned char
#define U16 unsigned int

extern void LcdPrint(U8 x, U8 y, U8 *str);
extern void LCD_bglight(bit status);
extern void LCD_init(void);


unsigned char nowpos=0;
unsigned char temp;
bit PointFlag = 0;					//是否已输入小数点
bit KeyPressedFlag = 0;				//按键被按下标志
float Dat1=0,Dat2=0,result=0;		//两个操作数和运算结果
unsigned char operate = 0;			//操作符,0表示没有,1:+  2:-  3:*  4:/
unsigned char TempArray[16];		//操作用数组
bit ClearFlag = 0;					//清零标志
bit completeFlag = 0;				//完成计算标志

//****************************************************************
//* 清空BUF函数
//****************************************************************
void RstBuf()
{
	unsigned char i;
	for(i=0;i<16;i++)
	{
		TempArray[i] = 0x00;
	}
}


//****************************************************************
//* 数据复位函数
//****************************************************************
void datarst()
{
	nowpos = 0;
	PointFlag = 0;	
	KeyPressedFlag = 0;
	Dat1 = 0;
	Dat2 = 0;
	result = 0;
	operate = 0;
	completeFlag = 0;
	ClearFlag = 1;
	RstBuf();

}


//****************************************************************
//* 得到键值函数
//* 返回0-16
//* 0-9代表数字0-9;  10代表小数点;    11代表等于号
//* 12,13,14,15代表+,-,*,/
//* 16代表无返回
//****************************************************************
unsigned char GetKeyVal()
{
	unsigned char i,GetVal,KeyVal=16;

	 for(i=0;i<4;i++)					//依次对四行进行扫描
	 {
	 	P1 = ( (~(0x01<<i)) | 0xF0 );	//将当前要扫描的低四位行电平拉低
		GetVal = ~(P1>>4) & 0x0F;		//从高位读取输入的值(取反值,因电路为低有效)
		if(GetVal)						//如果读入的值不为0,说明有键被按下
		{
			switch(GetVal)				//按按键值变为实际值
			{
				case 1:
					GetVal = 3;
					break;
				case 2:
					GetVal = 2;
					break;
				case 4:
					GetVal = 1;
					break;
				case 8:
					GetVal = 0;
					break;
				default:
					GetVal = 4;
					break;
			}

			if(GetVal != 4)				//如果数据正常
			{
				KeyVal = GetVal + (i*4);//结合行值,算出是第几个按键
			}
		}
	 }

	 return KeyVal;
}


//****************************************************************
//* 外部中断服务子程序,清零
//****************************************************************
void EX0_ser(void) interrupt 0
{
	datarst();
}


//****************************************************************
//* 主程序
//****************************************************************
void main(void)
{
	EX0 = 1;													//开中断,用于清零键
	IT0 = 1;
	EA= 1;
	LCD_init();													//LCD初始化
	LCD_bglight(1);
	datarst();													//初始化数据

	while(1)
	{
		if(ClearFlag)											//清零
		{	
			LcdPrint(0, 0, "                ");
			LcdPrint(0,0,"0");
			ClearFlag = 0;
		}
		
		temp = GetKeyVal();										//查询是否有按键
		if(temp == 16)											//如果没有铵键
		{
			KeyPressedFlag = 0;	
		}

		if( temp!=16 && KeyPressedFlag ==0 && completeFlag==0)	//有按键按下
		{
			KeyPressedFlag = 1;
			if(temp>=0 && temp<=10 && nowpos<5)					//最多5位输入,包括小数点
			{
				if(temp == 10 && PointFlag == 0)				//如果是小数点
				{
					PointFlag = 1;
					if(nowpos==0){								//第一位就输入小数点,向后推一位
						TempArray[nowpos++] = '0';
					}
					TempArray[nowpos++] = '.';					//添加小数点
				}
				else if(nowpos == 0 && temp == 0)				//第一位就输入0,不处理数组
				{
					ClearFlag = 1;
				}
				else											//如果不是小数点,将数字记录下来
				{
					TempArray[nowpos++] = temp + 48;	
				}

				LcdPrint(0, 0, "                ");				//显示当前值
				LcdPrint(0, 0, TempArray);
			}
			else if(temp>=12 && temp<=15)						//如果是运算符
			{
				Dat1 = atof(TempArray);
				operate = temp-11;								//得到运算符, 1:+   2:-   3:*   4:/
				
				nowpos = 0;										//回到第0个位置
				PointFlag = 0;									//清除小数点标志
				RstBuf();		
			}
			else if(temp == 11)									//等于号
			{
				completeFlag = 1;								//完成运算
				Dat2 = atof(TempArray);							//算出第2个数
				nowpos = 0;										//回到第0个位置
				PointFlag = 0;									//清除小数点标志
				RstBuf();

				switch(operate)									//计算
				{
					case 1:
						result = Dat1 + Dat2;
						break;
					case 2:
						result = Dat1 - Dat2;
						break;
					case 3:
						result = Dat1 * Dat2;
						break;
					case 4:
						result = Dat1 / Dat2;
						break;
					default:
						result = Dat1 + Dat2;
				}
				
				sprintf(TempArray,"%0.2f\0",result);				//显示结果
				LcdPrint(0, 0, "                ");
				LcdPrint(0, 0, TempArray);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -