📄 main.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 + -