单片机动态扫描原理

急需答案
2025-04-14 17:45:30
推荐回答(3个)
回答(1):

就是数码管一个一个循环点亮,只是速度要快,就相当于一起在亮

回答(2):

本视频介绍了单片机动态驱动数码管的工作原理。

回答(3):

// ---------------------------主函数-----------------------------------
//程序功能:数码显示从:00~99计数,0.5S加1
//数码管点亮方法,假如要显示:1234
//将4的段码送入数码管的段选,打开COM4相应的位选,即可点亮一只数码管显示4,延时2MS左右
//将3的段码送入数码管的段选,打开COM3相应的位选,即可点亮一只数码管显示3,延时2MS左右
//将2的段码送入数码管的段选,打开COM2相应的位选,即可点亮一只数码管显示2,延时2MS左右
//将1的段码送入数码管的段选,打开COM1相应的位选,即可点亮一只数码管显示1,延时2MS左右,如此反复循环即可。
//如果怕产生”鬼影“,在每次开COM口时先关闭所有的COM口。

void main (void)
{
SDA_164=0;
SCL_164=0;
//---------------------------------------
while (TRUE) //死循环
{
while(1)
{
for(i=0;i<10000;i++)
{
while(1)
{
//先关片选目的是为了在切换过程中数码管显示时彻底关断显示,去除“鬼影”,
//这个切换过程在这里为执行:SBUF=LED——TABLE[x]的时间,假如没有先关断所有片选,
//那么在这个过程中也会有数码管亮,虽然时间长短暂,但在光线较暗的地方就可以看到,
//一些不该点亮的段也有些红红的,就是这个原因造成的。如果这个切换的时间比较长,那么
//这些不该亮的点选通的时间就越长了,就造成了”鬼影“了。
//因此,最好的方法是:
// 先关所有片选-->送段码-->开位选-->延时(2MS左右)-->关所有片选-->送下一段码...

//有兴趣的朋友可以试下鬼影现象:将1,2,3,4 语句屏蔽掉,然后找个光线较暗的地方。

//---送段码前先关片选-----
COM_Port |=0xF0;

//********************************************************************
//送第一个数码管段码
Output_164( LED_TABLE[i%10] ); //这里用到了Timer0的移位寄存器功能 参见"Keil使用手册"及51相关书本
//-------先第一个选通2MS----------------
COM4=ON; //管4开
delay(220); //延时2MS左右选通下一个

//********************************************************************
//---送段码前先关片选-----
COM_Port |=0xF0;
//送第二个数码管段码
Output_164( LED_TABLE[(i/10)%10] );//这里用到了Timer0的移位寄存器功能
//-------------再第二个选通2MS----------------
COM3=ON;
delay(220); //延时2MS左右选通下一个
//------------一次小循环约:4MS,125*4=500MS;

//********************************************************************
//---送段码前先关片选-----
COM_Port |=0xF0;
//送第三个数码管段码
Output_164 (LED_TABLE[(i/100)%10] );//这里用到了Timer0的移位寄存器功能
//-------------再第二个选通2MS----------------
COM2=ON;
delay(220); //延时2MS左右选通下一个
//------------一次小循环约:4MS,125*4=500MS;

//********************************************************************
//---送段码前先关片选-----
COM_Port |=0xF0;
//送第四个数码管段码
Output_164 ( LED_TABLE[i/1000] );//这里用到了Timer0的移位寄存器功能
//-------------再第二个选通2MS----------------
COM1=ON;
delay(220); //延时2MS左右选通下一个
//------------一次小循环约:4MS,125*4=500MS;

cycles++;
if(cycles==10)//0.5S到,退出循环,使i加1
{
cycles=0;//
break;
}
}
}
}
}
}