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; // 循环显示
 }
   }
   }

程序实现步骤:

  1. 定义字符数组 tab:包含各个字符的点阵数据,用于在LED点阵屏幕上显示字符。
  2. 使用定时器 T1 控制灯光移动速度:每30次定时器中断,就更新一次LED点阵屏幕上显示的字符内容。
  3. 使用按键 s1s2 控制灯光方向和暂停/继续
    • 按键 s1 用于暂停/继续:按下 s1 会暂停定时器,再次按下会继续。
    • 按键 s2 用于切换方向:按下 s2 会切换灯光移动方向。
  4. xianshi 函数:使用循环显示每一行字符的内容,从而实现跑马灯效果。
  5. main 函数:不断循环调用 xianshi 函数,并检测按键状态,根据按键状态来改变灯光的方向和暂停/继续。
  6. timer1 中断函数:更新LED点阵屏幕上显示的字符内容,同时改变灯光移动的方向和速度。

程序说明:

  • 程序使用了51单片机的中断机制和延时函数,需要在头文件中引入 reg51.hintrins.h
  • 程序定义了一些常量和变量,如 ucharuintdata1data2s1s2fangxiangaltnetsl 等。
  • tab 数组中存储的是每个字符的点阵数据,每个字符占 16 个字节。
  • net 变量用于控制显示字符的起始位置,通过 timer1 中断函数不断更新。
  • fangxiang 变量用于控制灯光移动的方向,通过按键 s2 来切换。
  • alt 变量用于控制更新显示字符的频率。
  • sl 变量用于控制跑马灯的长度。

总结:

本程序通过定时器中断、按键控制和字符数组的方式,实现了LED点阵屏幕上的跑马灯效果,可以切换方向、暂停/继续,具有较好的可读性和可移植性。

51单片机LED点阵跑马灯程序实现解析

原文地址: https://www.cveoy.top/t/topic/oe1O 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录