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

case 2: // 显示右起第 2 个 数码管 Su8GetCo de=Cu8DigTa ble[vGu8Di splay_Righ_ 2]; //从编 码转换表中提 取出来的编码 。 P0=Su8Ge tCode; //段 码端输出 需要显示的编 码 P1_0=1; //右起 第 1 位数码管的 公共端 co m4, “总开 关”关闭 ,输出 高电平 1 P1_1=0; //右起 第 2 位数码管的 公共端 co m3, “总开 关…

100%1 / 836
Delay(10000);
PeripheralInitial();
while(1)
{
}
}
/* 注释三:
* DisplayScan 数码管的动态扫描函数,之所以放在定时中断里,是因为动态扫描数码管对时间均匀度
* 要求很高,如果放在 main 主函数中,期间稍微出现一些延时滞后或者超前执行的情况,都会导致
* 数码管出现“闪烁”或者“忽暗忽亮”的显示效果
*/
void DisplayScan(void)
{
static unsigned char Su8GetCode; //从编码转换表中提取出来的编码
static unsigned char Su8ScanStep=1; //扫描步骤
if(0==vGu16ScanTimerCnt) //定时的时间到,切换显示下一个数码管,依次动态快速循环切换显
{
/* 注释四:
* 在即将切换显示到下一个新的数码管之前,应该先关闭显示所有的数码管,避免因关闭不彻底而导致
* 数码管某些段位出现“漏光,也就是数码管因程序处理不善而出现常见的“鬼影”显示情况。
*/
P0=0x00; //输出显示先清零,先关闭显示所有的数码管
//先关闭所有 com 口,先关闭显示所有的数码管
P1_0=1; //右起 1 位数码管的公共端 com4,总开关”关闭,输出低电平 1
P1_1=1; //右起 2 位数码管的公共端 com3,总开关”关闭,输出高电平 1
P1_2=1; //右起 3 位数码管的公共端 com2,总开关”关闭,输出低电平 1
P1_3=1; //右起 4 位数码管的公共端 com1,总开关”关闭,输出高电平 1
switch(Su8ScanStep)
{
case 1: //显示右起第 1 数码管
Su8GetCode=Cu8DigTable[vGu8Display_Righ_1]; //从编码转换表中提取出来的编码
P0=Su8GetCode; //段码端输出需要显示的编
P1_0=0; //右起 1 位数码管的公共端 com4,“总开关”打开,输出低电平 0
P1_1=1; //右起 2 位数码管的公共端 com3,“总开关”关闭,输出高电平 1
P1_2=1; //右起 3 位数码管的公共端 com2,“总开关”关闭,输出高电平 1
P1_3=1; //右起 4 位数码管的公共端 com1,“总开关”关闭,输出高电平 1
break;
case 2: //显示右起第 2 数码管
Su8GetCode=Cu8DigTable[vGu8Display_Righ_2]; //从编码转换表中提取出来的编码
P0=Su8GetCode; //段码端输出需要显示的编
P1_0=1; //右起 1 位数码管的公共端 com4,“总开关”关闭,输出高电平 1
P1_1=0; //右起 2 位数码管的公共端 com3,“总开关”打开,输出低电平 0
P1_2=1; //右起 3 位数码管的公共端 com2,“总开关”关闭,输出高电平 1
P1_3=1; //右起 4 位数码管的公共端 com1,“总开关”关闭,输出高电平 1
break;
case 3: //显示右起第 3 数码管
Su8GetCode=Cu8DigTable[vGu8Display_Righ_3]; //从编码转换表中提取出来的编码
P0=Su8GetCode; //段码端输出需要显示的编
P1_0=1; //右起 1 位数码管的公共端 com4,“总开关”关闭,输出高电平 1
P1_1=1; //右起 2 位数码管的公共端 com3,“总开关”关闭,输出高电平 1
P1_2=0; //右起 3 位数码管的公共端 com2,“总开关”打开,输出低电平 0
P1_3=1; //右起 4 位数码管的公共端 com1,“总开关”关闭,输出高电平 1
break;
case 4: //显示右起第 4 数码管
Su8GetCode=Cu8DigTable[vGu8Display_Righ_4]; //从编码转换表中提取出来的编码
P0=Su8GetCode; //段码端输出需要显示的编
P1_0=1; //右起 1 位数码管的公共端 com4,“总开关”关闭,输出高电平 1
P1_1=1; //右起 2 位数码管的公共端 com3,“总开关”关闭,输出高电平 1
P1_2=1; //右起 3 位数码管的公共端 com2,“总开关”关闭,输出高电平 1
P1_3=0; //右起 4 位数码管的公共端 com1,“总开关”打开,输出低电平 0
break;
}
Su8ScanStep++;
if(Su8ScanStep>4) //如果扫描步骤大于 4,继续从第 1 步开始扫描
{
Su8ScanStep=1;
}
vGu8ScanTimerFlag=0;
vGu16ScanTimerCnt=SCAN_TIME;
vGu8ScanTimerFlag=1; //启动新一轮的定时器
}
}
void T0_time() interrupt 1
{
DisplayScan(); //数码管的动态扫描函数
if(1==vGu8ScanTimerFlag&&vGu16ScanTimerCnt>0) //数码管显示切换时间的定时器
{
vGu16ScanTimerCnt--;
}
TH0=0xfc;
TL0=0x66;
}
void SystemInitial(void)
{
//初始化上电瞬间数码管的状态,关闭显示所有的数码
P0=0x00;
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)
{
}