单片机加减法计算器_用STC52的单片机做的一个简单的4位数的加减,乘除计算器...

这篇博客介绍了一个使用STC52单片机实现的4位数加减乘除计算器。通过矩阵键盘输入数字和运算符,采用定时器中断实现数码管动态显示。代码包括了按键读取、数据有效性检查、运算处理等功能。
摘要由CSDN通过智能技术生成

#include           //51单片机标准寄存器声明头文件

#include "bsp_GOG1.h"   //这个头文件用于映射GOG1学习板载硬件接口

/*计算器的运算状态定义:*/

#define NoKey       0xaa  //没有按键按下的状态

#define ErrKey      0xff  //错误的按键状态/干扰

#define DpyErr            0x0e  //错误显示状态(码表数组第14个元素:'E')

#define DpyCle      0x10  //清屏(码表数组第16个元素:0xff 关闭数码管)

#define InCount         0xf0  //有运算符输入状态

#define InErrEqu          0x0f  //有等号输入状态

#define NoCountFlag 0xa5  //没有运算符的状态

/*矩阵按键 功能定义: */

#define ADD        15          //'#':加法  S15

#define SUB        12          //'C':减法  S12

#define MUL        14          //'*':乘法  S13

#define DIV        11          //'B':除法  S8

#define EQU        13          //'D':等于  S16

#define CLE 10    //'A':清除  S4

/*相关子函数的声明:*/

void delayms(unsigned int ms);                          //延时函数

void SegDisplay(unsigned char casebit);         //数码管显示函数

unsigned char ReadKeyPad(void);          //读取矩阵键盘函数

void Timer0Init(void);                                         //定时器0初始化函数

unsigned char CheckInput(void);                         //计算器检查输入状态函数

void DatUnpack(unsigned int dat);                 //计算器数据拆分函数

bit CheckNum(unsigned int dat);                         //计算器数据有效性检查函数

void WarmDpy(unsigned char err);                 //计算器错误显示函数

void ComputeState(unsigned char dat);         //计算器计算过程函数

//数码管段码表 共阳  17个元素: 0~F & 0xff

unsigned char code SegCode[17]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,

0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

unsigned int Ans;              //运算结果

bit AnsFlag=0;            //运算结果存在标志

bit InFlag1=0;                      //输入有效数字1标志

bit InFlag2=0;                      //输入有效数字2标志

unsigned char CountFlag;  //运算符

unsigned int  temp1=0,temp2=0;//输入的2个运算的数字

unsigned char DisBuff[4]={DpyCle,DpyCle,DpyCle,DpyCle};//数码管显示缓存

/*******************************************************************************

* @brief  mian           (简介)

* @param  无                   (参数)

* @retval 无                   (返回值)

******************************************************************************/

void main(void)                                    //程序从这里开始

{

unsigned char in;                        //保存单个按键值的变量

CountFlag=NoCountFlag;                //运算符初始状态

Timer0Init();                                //定时器0初始化

while(1)

{

in=CheckInput();

while(in == NoKey) in=CheckInput(); //没有按键按下,在此等待

if(in !=ErrKey)                //按键有效

{

ComputeState(in);

}

else  WarmDpy(DpyErr); //按键无效,报错 'E'

}

}

/**********************************************************************

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值