单片机数码管动态显示代码,从左到右闪烁流水,不用switch语句,且使用八位共阴极数码管
时间: 2023-10-22 16:09:14 浏览: 85
以下是使用循环实现单片机数码管动态显示代码,从左到右闪烁流水:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code LED_TBL[] = {
0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xf8, 0x80, 0x90
}; // 数码管显示表,0~9的编码
void delay(uint t)
{
while(t--);
}
void main()
{
uchar i, j, k;
uchar led_buf[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
while(1)
{
for(i = 0; i < 8; i++)
{
led_buf[i] = ~led_buf[i]; // 取反,实现闪烁效果
for(j = 0; j < 8; j++)
{
P2 = 0xff; // 关闭所有数码管
for(k = 0; k < 8; k++)
{
P1 = LED_TBL[led_buf[k]]; // 显示数码
P2 = ~(1 << k); // 选中对应的数码管
delay(100); // 延时,控制流水速度
}
}
}
}
}
```
代码解析:
首先,定义了一个数码管显示表 `LED_TBL`,其中存储了每个数字的编码,用于数码管的显示。
然后,定义了一个延时函数 `delay`,用于控制流水速度。
接着,在主函数中,定义了一个 `led_buf` 数组,用于存储每个数码管的状态。初始状态为全亮。
然后,进入一个无限循环。在循环中,先通过一个 `for` 循环,将 `led_buf` 数组中的每个元素取反,实现闪烁效果。然后,再通过三个嵌套的 `for` 循环,实现从左到右的流水显示。
其中,最内层的 `for` 循环用于控制选中哪个数码管,将对应的数码管置为低电平,其他数码管均为高电平。
中间层的 `for` 循环用于遍历 `led_buf` 数组,根据数组元素的值,显示相应的数字。
最外层的 `for` 循环用于控制流水的次数,即从左到右的循环次数。
注意:上述代码中,使用了位运算符 `~` 和 `<<`,来实现数码管的选中和取反操作。其中,`~` 表示按位取反,`<<` 表示左移。如果不熟悉位运算符,建议先学习一下。