基于51单片机的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*/
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()
{
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;
EA=1;
TR1=1;
while(1)
{
xianshi();
if(s1==0)
{
delay(10);
TR1=~TR1;
while(!s1)xianshi();
delay(10);
}
if(s2==0)
{
delay(10);
fangxiang=~fangxiang;
while(!s2)xianshi();
delay(10);
}
}
}
void timer1() interrupt 3 {
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;
}
}
}
'}
代码分析:
-
程序结构: * 头文件包含:包含了
reg51.h和intrins.h,分别提供 51 单片机的寄存器定义和一些内嵌函数。 * 宏定义:定义了uchar,uint,data1,data2, 简化代码并提高可读性。 * 变量定义:定义了s1,s2,fangxiang,alt,net,sl,mode,用于存储按钮状态、滚动方向、计数器、显示位置、滚动速度和模式。 * 数据数组定义:定义了一个名为tab的数组,存储了 LED 点阵字符的显示数据。 * 延时函数:定义了delay()函数,用于产生延时,控制 LED 点阵的刷新速度。 * 显示函数:定义了xianshi()函数,用于控制 LED 点阵显示字符数据。 * 主函数:初始化定时器中断,并进入一个无限循环,循环调用显示函数,检测按钮状态,并根据按钮状态控制 LED 点阵滚动方向和暂停/继续滚动。 * 定时器中断函数:定义了timer1()函数,用于控制 LED 点阵的滚动,改变显示的字符数据,实现滚动效果。 -
程序功能: * LED 点阵显示:程序使用了 LED 点阵显示字符数据,使用了 16x16 点阵字体。 * 定时器中断控制滚动:定时器中断函数控制 LED 点阵滚动,每隔一定时间改变显示的字符数据,实现滚动效果。 * 按钮控制滚动方向和暂停/继续:通过检测按钮
s1和s2状态,程序可以控制 LED 点阵的滚动方向和暂停/继续滚动。 -
程序细节: *
tab数组:存储了 LED 点阵字符的显示数据,每个字符使用 32 个字节表示,对应 LED 点阵的 16 行 16 列。 *xianshi()函数:使用循环扫描的方式,每次只显示一行数据,通过循环来实现整个字符的显示。 *timer1()函数:根据滚动方向和速度来改变显示的字符数据的位置,实现滚动效果。 *fangxiang变量:控制滚动方向,值为 0 表示向右滚动,值为 1 表示向左滚动。 *net变量:记录当前显示的字符数据的起始位置。 *sl变量:设置滚动的速度,单位是帧数。
优化后的代码:
- 使用
code属性存储代码,方便搜索引擎识别代码块。* 使用单引号替代双引号,提高代码可读性。* 使用 JSON 格式输出,方便机器解析。* 优化标题和描述,增加关键词。
{'title': '基于51单片机的LED点阵模拟时钟程序代码', 'description': '这是一个基于51单片机的LED点阵模拟时钟程序代码,使用了定时器中断来控制LED点阵的显示。程序中还包含了按钮的检测,可以通过按钮来控制LED点阵的滚动方向和暂停/继续滚动。', 'keywords': '51单片机, LED点阵, 模拟时钟, 定时器中断, 按钮检测, 滚动方向, 暂停/继续, 代码', 'content': '```code #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*/
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()
{
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;
EA=1;
TR1=1;
while(1)
{
xianshi();
if(s1==0)
{
delay(10);
TR1=~TR1;
while(!s1)xianshi();
delay(10);
}
if(s2==0)
{
delay(10);
fangxiang=~fangxiang;
while(!s2)xianshi();
delay(10);
}
}
}
void timer1() interrupt 3 {
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;
}
}
}
原文地址: https://www.cveoy.top/t/topic/ogOV 著作权归作者所有。请勿转载和采集!