单片机 8x16 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=60;
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*/
};

void delay(uint z)  
{
   uchar x;
   for(;z>0;z--)
   for(x=30;x>0;x--);
}

void xianshi() // 显示函数
{
 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)   
   {
      delay(10);  
  TR1=~TR1;  // 控制定时器1的开启和关闭,实现滚动暂停和继续
  while(!s1)xianshi();
  delay(10);
   }
   if(s2==0)
   {
       delay(10);
   fangxiang=~fangxiang;  // 改变滚动方向
   while(!s2)xianshi();
   delay(10);
   }
 }
}

void timer1() interrupt 3 // 定时器1中断服务函数
{
   alt++;
   if(alt==30)   
   {
     alt=0;
 if(fangxiang==0) 
 {
 net=net+2; // 滚动显示,更新显示内容的位置
     if(net>sl)  
     net=0;
 }
 else  
 {
     net=net-2;
 if(net<2)
 net=sl; 
 }
   }
   }

中断机制

该代码中只有一个中断函数 timer1(),并且只有一个中断源,即定时器1溢出中断。中断过程如下:

  1. 开启中断:EA=1ET1=1

  2. 定时器初始化:TR1=1,即开启定时器1。

  3. 中断函数处理:每当定时器1溢出时,中断函数 timer1() 被调用,alt 计数器加1。当 alt 计数器达到 30 时,根据 fangxiang 变量的值,判断滚动方向,更新显示内容的位置 net,同时将 alt 计数器清零。

  4. 主函数中的按键检测:当 s1 按键被按下时,将定时器1的开启状态取反,从而控制滚动的暂停和继续。当 s2 按键被按下时,将 fangxiang 变量取反,从而改变滚动的方向。在按键检测的同时,调用 xianshi() 函数实现 LED 点阵的显示。

总结

本代码利用单片机定时器中断实现 LED 点阵的滚动显示,通过按键控制滚动的暂停、继续和方向。代码结构清晰,易于理解,方便学习和修改。


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

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