如何用单片机c51写16*16LED点阵显示串口输入字符代码必须含有中断函数、
时间: 2023-12-10 14:41:38 浏览: 146
下面是一个基于C51单片机的16*16LED点阵显示串口输入字符的代码,其中包含中断函数:
```
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SRCLK=P3^6; //移位寄存器时钟线
sbit RCLK=P3^5; //移位寄存器锁存线
sbit SER=P3^4; //移位寄存器数据线
uchar code table[]={
0x00,0x7c,0x82,0x92,0x6c,0x00,0x00,0x00,
0x00,0x82,0xfe,0x02,0x00,0x00,0x00,0x00,
0x00,0x8c,0x92,0xa2,0x62,0x00,0x00,0x00,
0x00,0x44,0x92,0x92,0x6c,0x00,0x00,0x00,
0x00,0x30,0x28,0x24,0xfe,0x00,0x00,0x00,
0x00,0x4e,0x8a,0x8a,0x72,0x00,0x00,0x00,
0x00,0x7c,0x92,0x92,0x4c,0x00,0x00,0x00,
0x00,0x06,0x02,0xc2,0x3e,0x00,0x00,0x00,
0x00,0x6c,0x92,0x92,0x6c,0x00,0x00,0x00,
0x00,0x0c,0x92,0x92,0x7c,0x00,0x00,0x00,
0x00,0x00,0x6c,0x6c,0x00,0x00,0x00,0x00,
0x00,0x00,0xec,0x6c,0x00,0x00,0x00,0x00,
0x00,0x10,0x38,0x7c,0xfe,0x00,0x00,0x00,
0x00,0x00,0xfe,0xfe,0x00,0x00,0x00,0x00,
0x00,0x00,0xfe,0xfe,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
}; //点阵字体表
void delay(uint i) //延时函数
{
while(i--);
}
void write_byte(uchar dat) //写入一个字节到移位寄存器
{
uchar i;
for(i=0;i<8;i++){
SRCLK=0; //移位寄存器时钟线拉低
SER=dat&0x80; //往移位寄存器写入数据
dat<<=1;
SRCLK=1; //移位寄存器时钟线拉高
}
}
void write_row(uchar dat,uchar row) //写入一行到点阵
{
RCLK=0; //移位寄存器锁存线拉低
write_byte(~(1<<row)); //写入行选择信号
write_byte(dat); //写入数据
RCLK=1; //移位寄存器锁存线拉高,显示数据
}
void display(uchar *dat) //显示字符串
{
uchar i;
for(i=0;i<16;i++){
write_row(dat[i],i); //逐行显示
}
}
void uart_init() //串口初始化
{
TMOD=0x20; //定时器1工作在方式2,8位自动重装载
TH1=0xfd; //设置波特率为9600
TL1=0xfd;
TR1=1; //启动定时器1
SCON=0x50; //串口工作在模式1,8位数据,可变波特率
ES=1; //允许串口中断
EA=1; //开启总中断
}
void uart() interrupt 4 //串口中断函数
{
uchar c;
if(RI==1){ //接收到数据
RI=0; //清除接收中断标志位
c=SBUF; //读取数据
if(c=='\r'){ //回车换行
display(" "); //清空点阵
display("Hello World!"); //显示Hello World!
}
}
}
void main()
{
uart_init(); //串口初始化
while(1); //主程序空循环
}
```
此代码使用了移位寄存器实现点阵数据的显示,通过串口输入字符控制点阵的显示。在中断函数中读取串口输入的字符并作出相应的显示。需要注意的是,由于C51单片机的内存有限,使用中断函数需要合理地分配内存空间,避免内存溢出。
阅读全文