51单片机 AT89S52 16*16点阵显示“湖南铁道职业技术学院”左移右移效果程序
时间: 2023-08-14 14:06:13 浏览: 42
以下是基于 AT89S52 单片机的 16*16 点阵显示“湖南铁道职业技术学院”左移右移效果程序:
```c
#include <52.h>
#define uchar unsigned char
#define uint unsigned
// P0~P7 控制行,从左到右
uchar code ROW[16] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F,
0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
// P2.0~P2.7 控制列,从上到下
uchar code COL[16] = {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE,
0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE};
// “湖南铁道职业技术学院”的点阵数据
uchar code HUNAN[16][16] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x7C, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x3E, 0x40, 0x40, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00, 0x00},
{0x10, 0x10, 0x00, 0x00, 0x7C, 0x44, 0x08, 0x10, 0x20, 0x44, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7C, 0x00, 0x00, 0x00},
{0x7C, 0x00, 0x00, 0x7C, 0x08, 0x08, 0x3E, 0x40, 0x40, 0x3E, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00},
{0x10, 0x10, 0x00, 0x00, 0x3E, 0x40, 0x40, 0x3E, 0x44, 0x44, 0x44, 0x44, 0x3E, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x44, 0x44, 0x7C, 0x00, 0x00, 0x00},
{0x7C, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x7C, 0x10, 0x10, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x7C, 0x08, 0x08, 0x08, 0x08, 0x7C, 0x00, 0x00, 0x00},
{0x7C, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x7C, 0x20, 0x10, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00},
{0x10, 0x10, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x44, 0x44, 0x7C, 0x00, 0x00, 0x00},
{0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00},
{0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x7C, 0x10, 0x10, 0x7C, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x44, 0x44, 0x7C, 0x00, 0x00, 0x00}};
// 延时函数
void delay(uint t) {
while (t--)
;
}
// 16*16 点阵显示函数
void show() {
uchar i, j, k;
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
// 控制行
P0 = ROW[i];
// 控制列
P2 = COL[j];
// 输出点阵数据
P1 = HUNAN[i][j];
for (k = 0; k < 10; k++) {
delay(100);
}
}
}
}
void main() {
while (1) {
// 从左往右滚动
for (uchar i = 0; i < 16; i++) {
// 将第 i 行数据左移 1 位
for (uchar j = 0; j < 16; j++) {
HUNAN[i][j] <<= 1;
}
// 延时一段时间,显示效果更佳
delay(1000);
// 显示点阵数据
show();
}
// 从右往左滚动,同理
for (uchar i = 0; i < 16; i++) {
for (uchar j = 0; j < 16; j++) {
HUNAN[i][j] >>= 1;
}
delay(1000);
show();
}
}
}
```
需要注意的是,上述程序中的 `delay()` 函数需要根据实际情况进行调整,确保点阵显示效果良好。此外,由于 16*16 点阵比较大,因此需要较高的刷新率才能保证显示效果,因此程序中使用了简单的延时方式来控制刷新率,更好的方式是使用定时器中断等方法。