单片机连接了4个数码管,请根据动态扫描过程,编写显示“4321”的程序,字形码表0-9对应的共阳字型码是[0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90]
时间: 2023-10-23 15:09:56 浏览: 49
以下是使用动态扫描的程序:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2^6;
sbit wela = P2^7;
uchar code table[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 数码管字形码表
void delay(uint xms) // 延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
uchar i, j; // i表示当前扫描的数码管编号,j表示要显示的数字
while(1)
{
for(i=0;i<4;i++) // 循环扫描4个数码管
{
for(j=4;j>0;j--) // 显示数字4-3-2-1
{
dula = 1; // 打开数码管的锁存器,准备显示下一个数字
P0 = table[j]; // 显示数字
dula = 0; // 关闭数码管的锁存器,锁定数字
P0 = 0xFF; // 关闭数码管,避免重影
wela = 1; // 打开位选锁存器,准备扫描下一个数码管
P0 = ~(0x01 << i); // 扫描数码管
wela = 0; // 关闭位选锁存器,锁定扫描位置
delay(5); // 延时一段时间,使数码管显示得更清晰
}
}
}
}
```
上面的程序使用了一个双重循环来实现动态扫描。外层循环依次扫描4个数码管,内层循环依次显示数字4-3-2-1。在每个数字显示之前,程序先打开当前数码管的锁存器,准备显示下一个数字。然后程序将要显示的数字送到P0口,关闭数码管,避免重影。接着程序打开位选锁存器,扫描下一个数码管。扫描时,程序先将一个1左移i位,得到一个只有第i位是0的二进制数,然后取反,得到一个只有第i位是1的二进制数,再将这个二进制数送到P0口,使得只有第i位的LED发光。最后程序延时一段时间,使数码管显示得更清晰。