基于Keil+c51单片机和74hc245a和74ls154a实现16×16滚动显示姓名学号方法及代码
时间: 2023-11-22 15:52:08 浏览: 66
首先,我们需要连接74hc245a和74ls154a芯片,将其作为16×16的LED点阵的控制器。其中,74hc245a是用来扩展输出端口的,74ls154a是用来进行地址选择的。
接下来,我们需要编写程序来控制LED点阵的显示。以下是基于Keil+c51单片机的16×16滚动显示姓名学号的代码:
```c
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code name[]={"xxx"}; // 姓名
uchar code id[]={"1234567"}; // 学号
uchar code table[]={
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 第一行
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 第二行
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 第三行
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // 第四行
};
void delay(uint i)
{
while(i--);
}
void write_data(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
if(dat&0x80)
P1=0x01; // 数据线高电平
else
P1=0x00; // 数据线低电平
dat<<=1;
P3|=0x04; // 时钟线上升沿
_nop_();
_nop_();
P3&=0xfb; // 时钟线下降沿
_nop_();
_nop_();
}
}
void write_address(uchar addr)
{
uchar i;
for(i=0;i<4;i++)
{
if(addr&0x80)
P1=0x01; // 地址线高电平
else
P1=0x00; // 地址线低电平
addr<<=1;
P3|=0x08; // 字选线上升沿
_nop_();
_nop_();
P3&=0xf7; // 字选线下降沿
_nop_();
_nop_();
}
}
void main()
{
uchar i, j, k;
while(1)
{
for(i=0;i<16;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<16;k++)
{
write_address(j*16+k); // 选择地址
write_data(table[i*16+k]); // 写入数据
}
}
delay(400);
}
for(i=0;i<16;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<16;k++)
{
write_address(j*16+k); // 选择地址
write_data(table[i*16+k+16]); // 写入数据
}
}
delay(400);
}
}
}
```
在代码中,我们首先定义了姓名和学号的数组,并且定义了一个16×16的点阵表,用于存储LED点阵的显示信息。
在`write_data`函数中,我们通过将数据线设置为高电平或低电平来控制LED点阵每个LED的亮灭状态,再通过时钟线上升沿和下降沿来控制数据传输的时序。
在`write_address`函数中,我们通过将地址线设置为高电平或低电平来选择LED点阵的每个LED,再通过字选线上升沿和下降沿来控制地址选择的时序。
在`main`函数中,我们通过循环调用`write_address`和`write_data`函数来实现LED点阵的滚动显示效果。其中,通过调整延时时间可以控制滚动速度。
需要注意的是,以上代码只是提供了一个基本的思路,具体的实现还需要根据硬件电路和LED点阵的具体规格进行调整。
阅读全文