一、主要功能
LED点阵显示初始信息,可通过K3键切换显示模式,可实现RTC时钟显示、滚动字符显示 、滚动汉字显示,项目中以实现常用绘图API函数,如画点、线、圆、框、填充、显示字符、汉字等。代码中可简单修改MAX7219点阵级联个数实现不同尺寸的兼容。
二、硬件资源
1.硬件准备
项目所需要的硬件资源如下:
①51单片机开发板1个
②MAX7219 点阵模块1个(可根据自身财力购买点阵大小)
③USB线1条(用于供电和程序下载)
④杜邦线若干
2.硬件连接
独立按键模块-->单片机IO
K3-->P32
MAX7219 LED点阵模块-->单片机IO
CLK-->P22
CS-->P21
DIN-->P20
VCC-->5V
GND-->GND
三、软件设计
1.软件结构
2.主要代码
#include "app_demo.h"
#include "time.h"
#include "max7219.h"
#include "exti.h"
#include "key.h"
#include "string.h"
#include "stdio.h"
//定义全局结构体变量
_leddz_struct leddz_struct;
//定时器0中断函数
void time0() interrupt 1
{
static u8 i=0;
TH0=0XDC; //给定时器赋初值,定时10ms
TL0=0X00;
i++;
if(i==100)//1S
{
leddz_struct.sec++;
if(leddz_struct.sec>=60)
{
leddz_struct.sec=0;
leddz_struct.min++;
if(leddz_struct.min>=60)
{
leddz_struct.min=0;
leddz_struct.hour++;
if(leddz_struct.hour==24)leddz_struct.hour=0;
}
}
}
}
void exti0(void) interrupt 0 //外部中断0中断函数
{
delay_10us(1000);//消斗
if(KEY3==0)//再次判断K3键是否按下
{
leddz_struct.mode++;
if(leddz_struct.mode==4)leddz_struct.mode=0;
leddz_clear();
leddz_show_reflash();
}
}
void sys_parm_init(void)
{
leddz_struct.mode=0;
leddz_struct.hour=12;
leddz_struct.min=59;
leddz_struct.sec=23;
}
//静态显示汉字
void static_show_hz(void)
{
u8 i=0;
while(leddz_struct.mode==0)
{
for(i=0;i<4;i++)
{
leddz_show_fonthz(i*16,0,i,16,1);//显示“欢迎观看”
}
leddz_show_reflash();
}
}
//显示RTC
void rtc_show(void)
{
u8 i=0;
xdata u8 buf[8];
while(leddz_struct.mode==1)
{
i++;
if(i%1==0)
{
buf[0]=leddz_struct.hour/10+0x30;
buf[1]=leddz_struct.hour%10+0x30;
buf[2]=':';
buf[3]=leddz_struct.min/10+0x30;
buf[4]=leddz_struct.min%10+0x30;
buf[5]=':';
buf[6]=leddz_struct.sec/10+0x30;
buf[7]=leddz_struct.sec%10+0x30;
leddz_clear();
leddz_show_string(0,0,buf,16);
leddz_show_reflash();
}
delay_ms(1);
}
}
//字符滚动显示
void roll_char_show(void)
{
u8 i=0;
char sx=LEDDZ_WIDTH;
xdata u8 buf[]="Hai.XiaoYi,QQ:3443792007,Thanks!";
while(leddz_struct.mode==2)
{
i++;
if(i%10==0)
{
leddz_clear();
leddz_show_string(sx,0,buf,12);
leddz_show_reflash();
sx--;
if(sx<=-strlen(buf)*6)sx=LEDDZ_WIDTH;
}
delay_ms(1);
}
}
//汉字滚动显示
void roll_show_hz(void)
{
u8 i=0;
char sx=LEDDZ_WIDTH;
xdata u8 buf[]="深圳加油!嗨小易";
while(leddz_struct.mode==3)
{
i++;
if(i%10==0)
{
leddz_clear();
leddz_show_fonthz_ex(sx,0,buf);
leddz_show_reflash();
sx--;
if(sx<=-strlen(buf)*8)sx=LEDDZ_WIDTH;
}
delay_ms(1);
}
}
//LED点阵花样显示系统
void leddz_control_sys(void)
{
time0_init();//初始化定时器0
time0_start();//开启定时器0
exti0_init();
sys_parm_init();
max7219_init();
//清屏
leddz_clear();
leddz_show_reflash();
while(1)
{
static_show_hz();//静态显示汉字
rtc_show();//RTC时钟显示
roll_char_show();//字符滚动显示
roll_show_hz();//汉字滚动显示
}
}
四、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
作者B站链接:https://space.bilibili.com/444388619
可提供手把手教学服务,资料获取请联系作者QQ:3443792007
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。