利用keil程序编写基于51单片机的代码,要求实现通过 74HC595 模块控制 LED 点阵以一行循环滚动显 示。
时间: 2024-02-15 21:02:20 浏览: 25
好的,这是一个关于基于 51 单片机的 LED 点阵滚动显示的程序,使用 74HC595 模块来控制。
```C
#include <reg51.h>
#define LATCH P2_0
#define SCLK P2_1
#define DIN P2_2
unsigned char code font[][8] = {
{0x00,0x78,0x84,0x84,0x84,0x78,0x00,0x00}, // A
{0x00,0xFC,0x48,0x48,0x48,0x30,0x00,0x00}, // B
{0x00,0x78,0x84,0x84,0x84,0x84,0x00,0x00}, // C
{0x00,0xFC,0x84,0x84,0x84,0x78,0x00,0x00}, // D
{0x00,0xFC,0x48,0x48,0x48,0x48,0x00,0x00}, // E
{0x00,0xFC,0x40,0x40,0x40,0x40,0x00,0x00}, // F
{0x00,0x78,0x84,0x84,0x84,0x5C,0x00,0x00}, // G
{0x00,0xFC,0x40,0x40,0x40,0xFC,0x00,0x00}, // H
{0x00,0x00,0x84,0xFC,0x84,0x00,0x00,0x00}, // I
{0x00,0x0C,0x04,0x84,0x7C,0x00,0x00,0x00}, // J
{0x00,0xFC,0x40,0xA0,0x10,0x0C,0x00,0x00}, // K
{0x00,0xFC,0x04,0x04,0x04,0x04,0x00,0x00}, // L
{0x00,0xFC,0x60,0x18,0x60,0xFC,0x00,0x00}, // M
{0x00,0xFC,0x60,0x18,0x06,0xFC,0x00,0x00}, // N
{0x00,0x78,0x84,0x84,0x84,0x78,0x00,0x00}, // O
{0x00,0xFC,0x40,0x40,0x40,0x30,0x00,0x00}, // P
{0x00,0x78,0x84,0xA4,0x84,0x78,0x00,0x00}, // Q
{0x00,0xFC,0x40,0xC0,0x20,0x1C,0x00,0x00}, // R
{0x00,0x48,0x94,0x94,0x94,0x64,0x00,0x00}, // S
{0x00,0x40,0x40,0xFC,0x40,0x40,0x00,0x00}, // T
{0x00,0x7C,0x80,0x80,0x80,0x7C,0x00,0x00}, // U
{0x00,0x0C,0x30,0xC0,0x30,0x0C,0x00,0x00}, // V
{0x00,0x7C,0x80,0x60,0x80,0x7C,0x00,0x00}, // W
{0x00,0xCC,0x30,0x0C,0x30,0xCC,0x00,0x00}, // X
{0x00,0x0C,0x10,0xE0,0x10,0x0C,0x00,0x00}, // Y
{0x00,0xC4,0xA4,0x94,0x8C,0x84,0x00,0x00}, // Z
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space
};
void delay(unsigned int time) {
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 125; j++);
}
void shift(unsigned char byte) {
unsigned char i;
for (i = 0; i < 8; i++) {
SCLK = 0;
DIN = byte & 0x80 ? 1 : 0;
byte <<= 1;
SCLK = 1;
}
}
void display(unsigned char *buf) {
unsigned char i;
for (i = 0; i < 8; i++) {
LATCH = 0;
shift(buf[i]);
LATCH = 1;
delay(1);
}
}
void main() {
unsigned char i, j, k, l;
unsigned char buf[8] = { 0 };
while (1) {
for (i = 0; i < sizeof(font) / sizeof(font[0]); i++) {
for (j = 0; j < 8; j++) {
for (k = 0; k < 8; k++) {
buf[k] = font[i][(j + k) % 8];
}
for (l = 0; l < 8; l++) {
display(buf);
}
}
delay(100);
}
}
}
```
这个程序实现了一个循环滚动的 LED 点阵显示器,它使用了 74HC595 模块来控制点阵。在程序中,我们使用了一个字体数组来存储字母的字形信息,然后通过循环滚动来显示这些字母。在循环滚动过程中,我们使用了一个缓冲区 `buf` 来保存点阵的状态,然后通过 `display` 函数来将缓冲区的内容输出到点阵上。
为了控制 74HC595 模块,我们需要实现一个 `shift` 函数来向模块发送数据。在这个函数中,我们使用了一个循环来逐位发送数据,每次发送一位之后,我们将数据左移一位,然后再次发送下一位。在发送数据的过程中,我们需要注意数据的高低位顺序,因为 74HC595 模块是以 MSB 优先的方式接收数据的。
最后,我们还需要实现一个 `delay` 函数来控制 LED 点阵的刷新速度。在这个函数中,我们使用了一个简单的循环来延时一段时间,以达到控制刷新速度的效果。
希望这个程序能够帮助你实现 LED 点阵滚动显示。