某一8位LED显示接口电路如下图所示,在分析电路工作原理的基础上,用C51编写一显示子函数将显示缓冲区DBuf[8]的数据送 LED数码管进行动态扫描显示。设,显示缓冲区DBuf[8]中的数据为非压缩BCD码0x00~0x09。
时间: 2023-06-11 17:08:54 浏览: 157
基于51单片机的LED数码管动态显示.doc
由于没有看到电路图,我假设你是在问如何实现一个8位LED动态扫描显示的问题。
首先,我们需要了解什么是动态扫描显示。动态扫描显示是指将多个数码管按照一定的顺序轮流显示,每个数码管显示的时间非常短,人眼看到的是所有数码管同时显示的效果。
对于一个8位LED动态扫描显示,我们可以将8个LED分成两组,每组4个LED。每组4个LED的控制线分别接在两个74HC595移位寄存器的输出端口上。其中,一个74HC595移位寄存器的输出端口控制一组LED的亮灭,另一个74HC595移位寄存器的输出端口则控制另一组LED的亮灭。
具体的实现方法是,将LED数码管的8个引脚分别与两个74HC595移位寄存器的串行数据输入端(SER)相连接。将两个74HC595移位寄存器的时钟输入端(SRCLK)连接到单片机的一个IO口上,在每个时钟周期内向SRCLK输入一个脉冲,实现移位操作。将两个74HC595移位寄存器的锁存输入端(RCLK)连接到单片机的另一个IO口上,在每个扫描周期内向RCLK输入一个脉冲,将移位寄存器中的数据锁存到输出端口,控制LED的亮灭。
下面是C51代码的实现:
```c
#include <reg52.h>
sbit SRCLK = P1^0; // 74HC595移位寄存器时钟输入端
sbit RCLK = P1^1; // 74HC595移位寄存器锁存输入端
sbit SER = P1^2; // 74HC595移位寄存器串行数据输入端
unsigned char DBuf[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; // 显示缓冲区,存放0x00~0x09的BCD码
unsigned char code LedChar[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
void Display(unsigned char *p) // 显示函数
{
unsigned char i, j;
for(i = 0; i < 8; i++) // 循环扫描显示
{
SER = 0; // 先将SER置位0
for(j = 0; j < 8; j++) // 将显示缓冲区中的数据依次写入移位寄存器
{
if(i == j) // 当i=j时,将要显示的数码管的段码写入移位寄存器
{
SER = LedChar[p[j]];
}
else // 其他数码管的段码写入0
{
SER = 0;
}
SRCLK = 0; // 将SER的数据移入移位寄存器
SRCLK = 1;
}
RCLK = 0; // 锁存移位寄存器中的数据
RCLK = 1;
P2 = ~(0x01 << i); // 控制对应的数码管亮灭
DelayMs(2); // 每个数码管的显示时间为2ms
P2 = 0xff; // 关闭所有数码管
}
}
void main()
{
while(1)
{
Display(DBuf); // 调用显示函数
}
}
```
上面的代码中,Display函数实现了动态扫描显示的功能。首先,循环扫描8个LED,每个LED的显示时间为2ms,然后将对应的BCD码转换成数码管的段码,写入移位寄存器中。在移位寄存器中的数据锁存到输出端口之前,通过控制对应的数码管的亮灭,实现LED的动态扫描显示。
阅读全文