#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.hintrins.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 点阵滚动,每隔一定时间改变显示的字符数据,实现滚动效果。 * 按钮控制滚动方向和暂停/继续:通过检测按钮 s1s2 状态,程序可以控制 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; } } }

基于51单片机的LED点阵模拟时钟程序

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

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