51单片机LED点阵跑马灯程序实现解析
51单片机LED点阵跑马灯程序实现解析
本程序实现了一个LED点阵屏幕上的跑马灯效果,通过按键可以切换方向,并可以暂停/继续灯光的移动。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define data1 P0
#define data2 P2
sbit s1=P3^6;
sbit s2=P3^7;
bit fangxiang;
uint alt=0,net=0,sl=600;
bit mode;
uchar code tab[]={ // 字符数组,用于存储每个字符的点阵数据
0x00,0x88,0x20,0x88,0x20,0x91,0x20,0xA1,0xFF,0xC9,0x2A,0x89,0x2A,0x89,0x2A,0xBF,
0x2A,0x89,0x2A,0x89,0xFF,0xC9,0x20,0xA1,0x20,0x91,0x20,0x88,0x00,0x88,0x00,0x00,/*'?',0*/
0x02,0x00,0x02,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x02,0x42,0x01,0x7F,0xFE,
0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x02,0x00,0x02,0x00,0x00,0x00,/*'?',1*/
0x00,0x08,0x00,0x08,0x1F,0xC8,0x92,0x48,0x52,0x48,0x32,0x48,0x12,0x48,0x1F,0xFF,
0x12,0x48,0x32,0x48,0x52,0x48,0x92,0x48,0x1F,0xC8,0x00,0x08,0x00,0x08,0x00,0x00,/*'?',2*/
0x00,0x00,0x00,0x01,0x00,0x06,0x7F,0xF8,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,
0x04,0x40,0xFC,0x40,0x04,0x7F,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,/*'?',3*/
0x08,0x20,0x08,0xC0,0x0B,0x00,0xFF,0xFF,0x09,0x00,0x08,0xC1,0x00,0x06,0x7F,0xF8,
0x40,0x00,0x40,0x00,0x40,0x00,0x7F,0xFC,0x00,0x02,0x00,0x02,0x00,0x1E,0x00,0x00,/*'?',4*/
0x00,0x00,0x1F,0xFE,0x30,0x84,0xD0,0x84,0x10,0x84,0x10,0x84,0x1F,0xFE,0x02,0x00,
0x0C,0x00,0xF1,0x00,0x10,0xC2,0x10,0x01,0x10,0x02,0x1F,0xFC,0x00,0x00,0x00,0x00,/*'?',5*/
0x10,0x04,0x1F,0xFC,0x10,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00,/*'L',6*/
0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x17,0xC4,0x10,0x04,0x08,0x18,0x00,0x00,/*'E',7*/
0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00,/*'D',8*/
0x00,0x01,0x00,0x02,0x03,0xEC,0x02,0x20,0x02,0x20,0x02,0x28,0xFE,0x26,0x12,0x20,
0x12,0x28,0x12,0x26,0x12,0x20,0x13,0xE0,0x10,0x08,0x10,0x07,0x00,0x00,0x00,0x00,/*'?',9*/
0x00,0x00,0x7F,0xFF,0x40,0x10,0x44,0x08,0x5B,0x10,0x60,0xE0,0x10,0x10,0x13,0x10,
0x1D,0x10,0xF1,0x10,0x17,0xFF,0x11,0x10,0x11,0x10,0x11,0x10,0x10,0x10,0x00,0x00,/*'?',10*/
0x00,0x02,0x00,0x0C,0x7F,0xF0,0x48,0x20,0x49,0x21,0x4D,0x26,0x4B,0xF8,0x49,0x20,
0x49,0x20,0x49,0x20,0x4B,0xFF,0x4D,0x20,0x79,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*'?',11*/
0x00,0x02,0x00,0x42,0x00,0x22,0x7F,0x1A,0x49,0x02,0x49,0xFE,0x49,0x02,0x49,0x02,
0x49,0x02,0x49,0xFE,0x49,0x02,0x7F,0x0A,0x00,0x12,0x00,0x62,0x00,0x02,0x00,0x00,/*'?',12*/
0x02,0x04,0x02,0x08,0x42,0x10,0x42,0x60,0x42,0x00,0x42,0x02,0x42,0x01,0x43,0xFE,
0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x40,0x42,0x20,0x02,0x10,0x02,0x0C,0x00,0x00,/*'?',13*/
0x00,0x00,0x00,0x42,0x44,0x44,0x4C,0xC8,0x54,0xD0,0x65,0x42,0x45,0x41,0x46,0x7E,
0x84,0x40,0x88,0x40,0x90,0x50,0x81,0x48,0x80,0xC4,0x00,0x62,0x00,0x00,0x00,0x00,/*'?',14*/
0x04,0x44,0x0C,0xE6,0x35,0x44,0xC6,0x48,0x0C,0x48,0x00,0x01,0x11,0x02,0x13,0x0C,
0x15,0xF0,0x99,0x00,0x71,0x00,0x11,0xFC,0x15,0x02,0x13,0x02,0x11,0x8E,0x00,0x00,/*'?',15*/
};
void delay(uint z) // 延时函数
{
uchar x;
for(;z>0;z--)
for(x=30;x>0;x--);
}
void xianshi() // 显示函数,控制LED点阵显示内容
{
uchar aa,i;
for(i=0;i<16;i++)
{
P1=i; // 设置行号
data1=tab[net+aa]; // 显示字符的左半部分
aa++;
data2=tab[net+aa]; // 显示字符的右半部分
aa++;
delay(5); // 延时,控制显示速度
data1=0; // 清除数据
data2=0;
P1=0x00; // 清除行号
if(aa>30) aa=0; // 重置字符索引
}
}
void main()
{
ET1=1; // 开启定时器1中断
EA=1; // 开启总中断
TR1=1; // 启动定时器1
while(1)
{
xianshi(); // 调用显示函数
if(s1==0) // 检测按键s1,用于暂停/继续
{
delay(10); // 去抖
TR1=~TR1; // 暂停/继续定时器
while(!s1)xianshi(); // 等待按键释放
delay(10);
}
if(s2==0) // 检测按键s2,用于切换方向
{
delay(10); // 去抖
fangxiang=~fangxiang; // 切换方向
while(!s2)xianshi(); // 等待按键释放
delay(10);
}
}
}
void timer1() interrupt 3 // 定时器1中断服务函数
{
alt++; // 计数器加1
if(alt==30) // 每30次中断更新一次
{
alt=0; // 重置计数器
if(fangxiang==0) // 如果方向为正向
{
net=net+2; // 更新字符索引
if(net>sl) // 循环显示
net=0;
}
else // 如果方向为反向
{
net=net-2; // 更新字符索引
if(net<2)
net=sl; // 循环显示
}
}
}
程序实现步骤:
- 定义字符数组
tab:包含各个字符的点阵数据,用于在LED点阵屏幕上显示字符。 - 使用定时器
T1控制灯光移动速度:每30次定时器中断,就更新一次LED点阵屏幕上显示的字符内容。 - 使用按键
s1和s2控制灯光方向和暂停/继续:- 按键
s1用于暂停/继续:按下s1会暂停定时器,再次按下会继续。 - 按键
s2用于切换方向:按下s2会切换灯光移动方向。
- 按键
xianshi函数:使用循环显示每一行字符的内容,从而实现跑马灯效果。main函数:不断循环调用xianshi函数,并检测按键状态,根据按键状态来改变灯光的方向和暂停/继续。timer1中断函数:更新LED点阵屏幕上显示的字符内容,同时改变灯光移动的方向和速度。
程序说明:
- 程序使用了51单片机的中断机制和延时函数,需要在头文件中引入
reg51.h和intrins.h。 - 程序定义了一些常量和变量,如
uchar、uint、data1、data2、s1、s2、fangxiang、alt、net和sl等。 tab数组中存储的是每个字符的点阵数据,每个字符占 16 个字节。net变量用于控制显示字符的起始位置,通过timer1中断函数不断更新。fangxiang变量用于控制灯光移动的方向,通过按键s2来切换。alt变量用于控制更新显示字符的频率。sl变量用于控制跑马灯的长度。
总结:
本程序通过定时器中断、按键控制和字符数组的方式,实现了LED点阵屏幕上的跑马灯效果,可以切换方向、暂停/继续,具有较好的可读性和可移植性。
原文地址: https://www.cveoy.top/t/topic/oe1O 著作权归作者所有。请勿转载和采集!