如何用单片机c51写16*16LED点阵显示串口输入字符的代码
时间: 2023-12-10 07:41:32 浏览: 112
以下是基于C51单片机的16*16LED点阵显示串口输入字符的代码:
```c
#include <reg52.h> //C51单片机头文件
#define uchar unsigned char //定义uchar类型
#define uint unsigned int //定义uint类型
sbit DATA=P2^0; //数据线
sbit LATCH=P2^1; //锁存线
sbit CLK=P2^2; //时钟线
void delay(uint i) //延时函数
{
while(i--);
}
void send_byte(uchar dat) //向点阵模块发送字节数据
{
uchar i;
for(i=0;i<8;i++) //逐位发送8位数据
{
CLK=0;
DATA=dat&0x80; //取最高位
CLK=1;
dat<<=1; //左移一位
}
}
void send_command(uchar address,uchar dat) //向点阵模块发送指令
{
LATCH=0; //锁存线拉低
send_byte(address); //先发送地址
send_byte(dat); //再发送数据
LATCH=1; //锁存线拉高,数据更新
}
void init() //点阵模块初始化函数
{
send_command(0x09,0x00); //译码方式:不译码
send_command(0x0a,0x01); //亮度设置:中等亮度
send_command(0x0b,0x07); //扫描界限:0~7
send_command(0x0c,0x01); //控制方式:打开普通扫描模式
send_command(0x0f,0x00); //显示测试:关闭
}
void display(uchar *p) //显示函数
{
uchar i,j,k;
for(j=0;j<16;j++) //逐行扫描
{
send_command(0x01,0x00); //先清空第j行
send_command(0x0c,j+1); //再选定第j行
for(i=0;i<2;i++) //逐列显示
{
k=*p++; //取出下一个字节数据
send_byte(k); //发送到点阵模块
}
}
}
void main()
{
uchar i;
uchar buffer[32]; //缓存区
uchar len;
TMOD=0x20; //定时器1工作在方式2
TH1=0xfd; //波特率设置为9600bps
TL1=0xfd;
SCON=0x50; //串口工作在模式1
PCON=0x00; //波特率不倍频
TR1=1; //启动定时器1
init(); //点阵模块初始化
while(1)
{
if(RI) //如果接收到一个字符
{
RI=0;
buffer[len++]=SBUF; //将其存入缓存区
if(len>=32) len=0; //缓存区溢出,从头开始
i=0;
while(buffer[i]) //如果缓存区还有数据
{
display(&buffer[i]); //显示缓存区中的数据
i+=2; //每次取两个字节数据
delay(500); //延时一段时间
}
}
}
}
```
在这个代码中,我们使用了一个缓存区来存储串口输入的字符,然后逐个取出并显示在16*16LED点阵上。在显示函数中,我们使用了点阵模块的地址和数据寄存器来向点阵模块发送指令和数据。同时,我们还使用了一个定时器来控制显示的刷新速度。
需要注意的是,这个代码中使用的是基于P2口的硬件SPI方式来控制点阵模块的显示,如果你使用的是其他型号的点阵模块,可能需要修改其中的引脚定义和通讯协议。同时,由于16*16LED点阵的显示数据量比较大,如果使用的单片机内存较小,可能需要使用外部存储器来存储显示数据。
阅读全文