单片机 8x16 LED 点阵滚动显示 代码详解
单片机 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溢出中断。中断过程如下:
-
开启中断:
EA=1,ET1=1。 -
定时器初始化:
TR1=1,即开启定时器1。 -
中断函数处理:每当定时器1溢出时,中断函数
timer1()被调用,alt计数器加1。当alt计数器达到 30 时,根据fangxiang变量的值,判断滚动方向,更新显示内容的位置net,同时将alt计数器清零。 -
主函数中的按键检测:当
s1按键被按下时,将定时器1的开启状态取反,从而控制滚动的暂停和继续。当s2按键被按下时,将fangxiang变量取反,从而改变滚动的方向。在按键检测的同时,调用xianshi()函数实现 LED 点阵的显示。
总结
本代码利用单片机定时器中断实现 LED 点阵的滚动显示,通过按键控制滚动的暂停、继续和方向。代码结构清晰,易于理解,方便学习和修改。
原文地址: https://www.cveoy.top/t/topic/okEv 著作权归作者所有。请勿转载和采集!