从单片机基础到程序框架(全集 2019pdf版).pdf - 第595页

if(1==vG u8ChangeTim erFlag&&vG u16ChangeTi merCnt>0) // 数码管显示 切换时间的定 时器 { vGu16Cha ngeTimerCnt --; } TH0=0xfc ; TL0=0x66 ; } void Syste mInitial( void) { //初始 化上电瞬间数 码管的状态 P1_0=1; // 右起第 1 位数码管的 公共端 co m4, “总…

100%1 / 836
volatile unsigned char vGu8ChangeTimerFlag=0; //控制切换数字的时间的定时器
volatile unsigned int vGu16ChangeTimerCnt=0;
unsigned char Gu8Number=0; //从 0 9 依次循环显示的数
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{
DisplayTask(); //数码管显示的任务函数
}
}
void DisplayTask(void) //数码管显示的任务函数
{
static unsigned char Su8GetCode; //从编码转换表中提取出来的编码
if(0==vGu16ChangeTimerCnt) //定时的时间到,更新显示下一个数字,依次循环显示
{
Su8GetCode=Cu8DigTable[Gu8Number]; //从编码转换表中提取出来的编码
P0=Su8GetCode; //段码端输出需要显示的编码
P1_0=0; //右起 1 位数码管的公共端 com4,总开关”打开,输出低电平 0
P1_1=1; //右起 2 位数码管的公共端 com3,总开关”关闭,输出高电平 1
P1_2=0; //右起 3 位数码管的公共端 com2,总开关”打开,输出低电平 0
P1_3=1; //右起 4 位数码管的公共端 com1,总开关”关闭,输出高电平 1
Gu8Number++; //显示的数字不断从 0 9 累加
if(Gu8Number>9)
{
Gu8Number=0;
}
vGu8ChangeTimerFlag=0;
vGu16ChangeTimerCnt=CHANGE_TIME;
vGu8ChangeTimerFlag=1; //启动新一轮的定时器
}
}
void T0_time() interrupt 1
{
if(1==vGu8ChangeTimerFlag&&vGu16ChangeTimerCnt>0) //数码管显示切换时间的定时器
{
vGu16ChangeTimerCnt--;
}
TH0=0xfc;
TL0=0x66;
}
void SystemInitial(void)
{
//初始化上电瞬间数码管的状态
P1_0=1; //右起第 1 位数码管的公共端 com4,“总开关”关闭,输出低电平 1
P1_1=1; //右起第 2 位数码管的公共端 com3,“总开关”关闭,输出高电平 1
P1_2=1; //右起第 3 位数码管的公共端 com2,“总开关”关闭,输出低电平 1
P1_3=1; //右起第 4 位数码管的公共端 com1,“总开关”关闭,输出高电平 1
TMOD=0x01;
TH0=0xfc;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}
第一百一十三节: 动态扫描的数码管显示数字。
【113.1 动态扫描的数码管。
上图 113.1.1 数码管
上一节,看到打开显示的数码管右起第 1 个(com4)和 3 个(com2)在任意时刻显示的数字是一样的,
为什么?因为四个数码管 8 个段 a,b,c,d,e,f,g,h 连接的单片机 IO 口是共用的,如果把四个数码管
全部打开(com1,com2,com3,com4 全部输出低电平)会发现四个数码管在任意时刻显示的四个数字也是一
的!实际应用中,要四个数码管能各自独立显示不同的数字,就需要用到“分时动态扫描”的方式。所谓分
时,就是在任意时刻只能显示其中一个数码管(某个 com 输出低电平)其它三个数码管关闭(其它三个 com
输出高电平),每个数码管显示停留的时间固定一致并且非常短暂,四个数码管依次循环的切换显示,只要
切换画面的速度足够快,人的视觉就分辨不出来,感觉八个数码管是同时亮的(实际不是同时亮)跟动画
片“1 秒钟动态切换显示多少幅画面”的原理一样。现在编写一个程序例子,四个数码管要显示四个不同
数字“1234”,程序代码如下:
#include "REG52.H"
/* 注释一:
* SCAN_TIME 是每个数码管停留显示的短暂时间。这里称为“扫描时间。这个时间既不能太长也不能
* 太短,要调试到恰到好处。太长,则影响其它数码管的显示,会让人觉得画面不连贯不是同时亮
* 太短,又会影响显示的亮度。具体的时间应该根据实际项目不断调试修正而得到最佳显示的数值
*/
#define SCAN_TIME 1