用AT89C52,74LS245,74HC154写点阵显示16*64的keil程序
时间: 2023-11-27 11:54:41 浏览: 81
这里提供一个基本的AT89C52、74LS245和74HC154控制16*64点阵显示的Keil程序。需要注意的是,该程序仅提供基本的框架,需要根据具体的硬件电路和需求进行修改和优化。
```c
#include <reg52.h>
#include <intrins.h>
#define LED_WIDTH 16
#define LED_HEIGHT 64
// 74LS245控制引脚
sbit LS245_DIR = P1^0;
sbit LS245_LE = P1^1;
// 74HC154控制引脚
sbit HC154_A = P2^0;
sbit HC154_B = P2^1;
sbit HC154_C = P2^2;
// 存储点阵数据的数组
unsigned char code LED_DATA[LED_HEIGHT][LED_WIDTH] = {...}; // 填入具体的点阵数据
// 将点阵数据转换为列数据
void LED_Convert(unsigned char *led_data, unsigned char *led_column, unsigned char column_index) {
for (int i = 0; i < LED_HEIGHT; i++) {
led_column[i] = led_data[i][column_index];
}
}
// 主函数
void main() {
unsigned char led_column[LED_HEIGHT]; // 存储转换后的列数据
unsigned char column_index = 0; // 当前列索引
LS245_DIR = 0; // 设置74LS245为输入模式
LS245_LE = 0; // 禁止74LS245输出
while (1) {
LED_Convert(LED_DATA, led_column, column_index); // 将点阵数据转换为列数据
// 输出列数据到74LS245
for (int i = 0; i < LED_HEIGHT; i++) {
P0 = led_column[i];
_nop_();
LS245_LE = 1;
_nop_();
LS245_LE = 0;
}
// 控制74HC154选择当前列
switch (column_index) {
case 0: HC154_A = 0; HC154_B = 0; HC154_C = 0; break;
case 1: HC154_A = 1; HC154_B = 0; HC154_C = 0; break;
// ...
case 15: HC154_A = 1; HC154_B = 1; HC154_C = 1; break;
}
// 更新列索引,循环显示
column_index = (column_index + 1) % LED_WIDTH;
}
}
```
在程序中,我们首先定义了16*64的点阵数据数组`LED_DATA`,然后通过`LED_Convert`函数将点阵数据转换为列数据,再通过74LS245输出到点阵显示屏上。同时,通过74HC154控制当前显示的列。最后,通过循环控制列的更新,实现点阵显示的效果。
阅读全文