|
这个程序是开发板里面的一个,大家能帮我分析下这个程序的工作原理吗,先谢谢各位了。。程序如下,我一直都搞不懂.......
/****************************** (C) COPYRIGHT 2013 YQDZ **************************
* 文 件 名 : 999累加.C
* 作 者 : YQDZ
* 版 本 : V1.0
* 日 期 : 2013/07/07
* 主 控 MCU : STC89C52RC
* 主 频 : 11.0592MHz
* 编 译 器 : Keil C51 V4.22
* 描 述 : 多位数码管动态扫描显示变化数据,并不停变化数值。V573需要用短
* 路帽短接到VCC,不用时需要移除。
*********************************************************************************/
#include"reg52.h" /* 调用头文件,单片机内部寄存器都定义在此,用的时候需要先调用 */
typedef unsigned char UINT8; /* 给unsigned char重新定义一个别名UINT8,用的时候直接写UINT8就可以 */
typedef unsigned int UINT16; /* 给unsigned int重新定义一个别名UINT16,用的时候直接写UINT16就可以 */
/******************************** 引脚定义 **************************************
单片机 74HC573
P00-P07 DB0-DB7
P22 LE1
P23 LE2
V573 VCC
*********************************************************************************/
#define DataPort P0 /* 定义数据端口,程序中遇到DataPort则用P0替换 */
sbit LE1 = P2^2; /* 定义74HC573锁存使能端口 段锁存 */
sbit LE2 = P2^3; /* 定义74HC573锁存使能端口 位锁存 */
UINT8 code DuanMa[ ] = { 0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F }; /* 段码值0-9 */
UINT8 code WeiMa[] = { 0xFE,0xFD,0xFB,0xF7,
0xEF,0xDF,0xBF,0x7F }; /* 分别对应相应的数码管位码,决定哪个数码管被点亮 */
UINT8 TempData[8]; /* 存储显示值 */
/*******************************************************************************
* 函 数 名 : DelayMs
* 描 述 : 毫秒延时.
* 输 入 : UINT8 Ms:
* 要延时的Ms时间. Ms值范围为0-65535,数值越大延时时间越长
* 返 回 : 无.
*******************************************************************************/
void DelayMs( UINT16 Ms )
{
UINT8 i;
while (Ms--)
{
for ( i = 0; i < 114; i++ ); /* 循环114大概是1MS时间 */
}
}
/*******************************************************************************
* 函 数 名 : Display
* 描 述 : 显示函数,用于动态扫描数码管
* 输 入 : UINT8 FirstBit:
* 要显示的位
* UINT8 Num:
* 要显示的数码管的位数
* 返 回 : 无.
********************************************************************************/
void Display( UINT8 FirstBit, UINT8 Num )
{
UINT8 i;
for( i = 0; i < Num; i++ )
{
DataPort=0; /* 清空数据,防止有交替重影 */
LE1 = 1; /* 段锁存 */
LE1 = 0;
DataPort = WeiMa[ i + FirstBit ]; /* 取位码 */
LE2 = 1; /* 位锁存 */
LE2 = 0;
DataPort = TempData[ i ]; /* 取显示数据,段码 */
LE1 = 1; /* 段锁存 */
LE1 = 0;
DelayMs(5); /* 扫描间隙延时,时间太长会闪烁,太短会造成重影 */
}
}
/*******************************************************************************
* 函 数 名 : main
* 描 述 : 主函数
* 输 入 : 无.
* 返 回 : 无.
********************************************************************************/
void main (void)
{
UINT16 Num;
UINT16 j = 0;
while( 1 )
{
j++; /* 计数次数加1 */
if( j == 5 ) /* 检测当前数值显示了一小段时间后,需要显示的数值加1,实现数据显示的变化 */
{
j = 0; /* 计数重新开始 */
Num++; /* 显示数据加 1 */
if( Num == 1000 ) /* 用于显示0-999 */
Num = 0; /* 重新从0开始显示 */
}
TempData[ 0 ] = DuanMa[ Num / 100 ]; /* 计算显示数据对应段码的数据成员,如要显示68,则68/10=6 68%10 = 8 */
TempData[ 1 ] = DuanMa[ ( Num % 100 ) / 10 ];
TempData[ 2 ] = DuanMa[ ( Num % 100 ) % 10 ];
Display( 2, 3 ); /* 调用显示程序 */
}
}
|
|