昨天晚上闲来就把串口点阵滚动显示给再写了一遍,就当是再次熟悉一下51吧,毕竟很久没写了,以下是源码,不尽完善,给自己以后留意下吧!
#include
#define uint unsigned int
#define uchar unsigned char
sbit DZ=P2^3;
void ser_cfg();
void dianzhen();
uchar table[40];
void delay(uint x)
{
while(x--);
}
void main()
{
ser_cfg();
while(1)
{
dianzhen();
}
}
/**************串口初始化函数***********/
void ser_cfg()
{
TMOD |=0x20; //用于产生波特率
TH1=0xfd; //定时器初值,9600--->fdH
TL1=0xfd;
TR1=1;
SCON=0x50; //串口工作方式1,8bit数据,波特率可变,定时器1产生溢出
ES=1; //使能串口中断
EA=1; //开总中断
}
/*****************************************/
void dianzhen()
{
int i,j,k;
for(j=0;j<40;j++)
{
for(k=0;k<50;k++)
{
for(i=0;i<8;i++)
{
DZ=1;
P0=table[(i+j)%40];
DZ=0;
P1=i;
delay(100);
}
}
}
}
/****************串口中断函数**********/
void ser_intr() interrupt 4
{
static uchar index;
if(TI)
{
TI=0; //清发送中断标志
}
if(RI)
{
RI=0; //清接收中断标志
table[index]=SBUF; //读取串口缓冲寄存器中接收到的数据
index++;
}
}
在写这个程序的时候遇到的一个问题是无法事先声明好一个数组用来存放要用于显示字符的码值,因为事先不知道滚动显示的字符个数,问了些高人,都认为在51里这个问题不是很好解决,因为无法使用动态内存分配,只有事先定义一个比较大的数组,然后用来存放,但是我当时定义一个大的数组时又遇到了越界的问题,所以比较纠结,感觉这是51的一个弊端,所以后面把数组大小又给减小了!
测试时可以从串口调试助手发送如下数据滚动显示
--- /\/\ | |
| \ / | |
| \/ \__/
---
008181FFFF818100183C7EFCFC7E3C18003E408080403E00
阅读(1573) | 评论(0) | 转发(0) |