单片机学习笔记————51单片机实现带数码管显示的加法简易计算器

一、使用proteus绘制简单的电路图,用于后续仿真

单片机学习笔记————51单片机实现带数码管显示的加法简易计算器_第1张图片

 

二、编写程序

/********************************************************************************************************************
----	@Project:	LED-74HC595
----	@File:	main.c
----	@Edit:	ZHQ
----	@Version:	V1.0
----	@CreationTime:	20200701
----	@ModifiedTime:	20200701
----	@Description:	数字1键对应S1键,数字2键对应S2键,数字3键对应S3键…. 数字9键对应S9键, 数字0键对应S10键。加号键对应S13,等于号键对应S14,清除复位按键对应S16。其它按键不用。
----	常用的加法计算器功能。有连加功能。
----	本程序有2个窗口。
----	第1个窗口:原始数据和运算结果窗口。  比如加法运算中的被加数
----	第2个窗口:第二个参与运行的数据窗口。比如加法运算中的加数
----	单片机:AT89C52
********************************************************************************************************************/
#include "reg52.h"
/*——————宏定义——————*/
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/500)   /*0.5ms timer calculation method in 12Tmode*/

#define	const_voice_short	40	/*蜂鸣器短叫的持续时间*/
#define	const_voice_long	900	/*蜂鸣器长叫的持续时间*/
#define const_key_time 9	/*按键去抖动延时的时间*/

#define const_1s  96	/*大概产生一秒钟的时间基准*/

/*——————变量函数定义及声明——————*/
/*定义数码管的74HC595*/
sbit Dig_Hc595_Sh = P2^0;
sbit Dig_Hc595_St = P2^1;
sbit Dig_Hc595_Ds = P2^2;

/*定义蜂鸣器*/
sbit Beep = P2^7;

/*作为中途暂停指示灯 亮的时候表示中途暂停*/
sbit LED = P3^5;

/*定义按键*/
sbit Key_S1 = P0^0;	/*第一行输入*/
sbit Key_S2 = P0^1;	/*第二行输入*/
sbit Key_S3 = P0^2;	/*第三行输入*/
sbit Key_S4 = P0^3;	/*第四行输入*/

sbit Key_D1 = P0^4;	/*第一列输入*/
sbit Key_D2 = P0^5;	/*第二列输入*/
sbit Key_D3 = P0^6;	/*第三列输入*/
sbit Key_D4 = P0^7;	/*第四列输入*/

unsigned char ucKeyStep = 1;	/*按键扫描步骤变量*/
unsigned int uiKeyTimeCnt = 0;	/*按键去抖动延时计数器*/
unsigned char ucKeyLock = 0;	/*按键触发后自锁的变量标志*/

unsigned char ucRowRecord = 1;	/*记录当前扫描到第几列了*/
unsigned char ucKeySec = 0;	/*被触发的按键编号*/

unsigned char ucDigShow8 = 0;   /*第8位数码管要显示的内容*/
unsigned char ucDigShow7 = 0;   /*第7位数码管要显示的内容*/
unsigned char ucDigShow6 = 0;   /*第6位数码管要显示的内容*/
unsigned char ucDigShow5 = 0;   /*第5位数码管要显示的内容*/
unsigned char ucDigShow4 = 0;   /*第4位数码管要显示的内容*/
unsigned char ucDigShow3 = 0;   /*第3位数码管要显示的内容*/
unsigned char ucDigShow2 = 0;   /*第2位数码管要显示的内容*/
unsigned char ucDigShow1 = 0;   /*第1位数码管要显示的内容*/

unsigned char ucDigDot1 = 0;
unsigned char ucDigDot2 = 0;
unsigned char ucDigDot3 = 0;
unsigned char ucDigDot4 = 0;
unsigned char ucDigDot5 = 0;
unsigned char ucDigDot6 = 0;
unsigned char ucDigDot7 = 0;
unsigned char ucDigDot8 = 0;

unsigned char ucDigShowTemp = 0;	/*临时中间变量*/
unsigned char ucDisplayDriveStep = 1; /*动态扫描数码管的步骤变量*/

unsigned char ucWd = 1;	/*本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。*/

unsigned char ucDisplayUpdate = 1;	/*更新显示标志*/

unsigned long ulSource = 0;	/*原始数据    比如在加法运算中的被加数*/
unsigned long ulOther = 0;	/*另外一个参与运算的数据  比如在加法运算中的加数*/
unsigned long ulResult = 0;	/*运算结果*/
unsigned char ucOperator = 0;	/*运行符号。0代表当前没有选择运行符号。1代表当前的运算符是加法。*/

unsigned int uiVoiceCnt = 0;	/*蜂鸣器鸣叫的持续时间计数器*/

void Dig_Hc595_Drive(unsigned char, unsigned char);

/*根据原理图得出的共阴数码管字模表*/
code unsigned char Dig_Table[] =
{
0x3f,  /*0       序号0*/
0x06,  /*1       序号1*/
0x5b,  /*2       序号2*/
0x4f,  /*3       序号3*/
0x66,  /*4       序号4*/
0x6d,  /*5       序号5*/
0x7d,  /*6       序号6*/
0x07,  /*7       序号7*/
0x7f,  /*8       序号8*/
0x6f,  /*9       序号9*/
0x00,  /*不显示  序号10*/
0x40,  /*-		   序号11*/
0x73,  /*P       序号12*/	
};

/**
* @brief  定时器0初始化函数
* @param  无
* @retval 初始化T0
**/
void Init_T0(void)
{
	TMOD = 0x01;                    /*set timer0 as mode1 (16-bit)*/
	TL0 = T1MS;                     /*initial timer0 low byte*/
	TH0 = T1MS >> 8;                /*initial timer0 high byte*/
}
/**
* @brief  外围初始化函数
* @param  无
* @retval 初始化外围
* 让数码管显示的内容转移到以下几个变量接口上,方便以后编写更上一层的窗口程序。
* 只要更改以下对应变量的内容,就可以显示你想显示的数字。
**/
void Init_Peripheral(void)
{
	ET0 = 1;/*允许定时中断*/
	TR0 = 1;/*启动定时中断*/
	EA = 1;/*开总中断*/  
}

/**
* @brief  初始化函数
* @param  无
* @retval 初始化单片机
**/
void Init(void)
{
	LED = 1;
	Beep = 1;	
	
	Dig_Hc595_Drive(0x00, 0x00);	/*关闭所有经过另外两个74HC595驱动的LED灯*/

	Init_T0();
}
/**
*

你可能感兴趣的:(单片机,proteus,C,51单片机,加法计算器,简易)