一、功能简介
本项目使用Proteus8仿真51单片机控制器,使用8*8LED点阵、按键模块等。
系统运行后,默认以静态模式显示,此时点阵左右循环切换图像。
当按下K1键,点阵从下往上滚动显示图像;
当再次按下K1键,点阵从上往下滚动显示图像;
当再次按下K1键,点阵从左往右滚动显示图像;
当再次按下K1键,点阵从右往左滚动显示图像;
如此循环。
二、软件设计
/*
作者:嗨小易(QQ:3443792007)
*/
//全局变量定义
//扫描每列,对应行数据,用于静态显示、左右滚动显示
//LED点阵显示图像的行数据(取模软件获取:纵向取模、字节不倒序)
code u8 gled_row_lr[24]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//额外增加的无显示数据
0x38,0x7C,0x7E,0x3F,0x3F,0x7E,0x7C,0x38,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//额外增加的无显示数据
//LED点阵显示图像的列数据(每一列扫描数据)
code u8 gled_col_lr[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//扫描每行,对应列数据,用于上下滚动显示
//LED点阵显示图像的列数据(取模软件获取:横向取模、字节不倒序)
code u8 gled_col_ud[24]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//额外增加的无显示数据
0x00,0x66,0xFF,0xFF,0xFF,0x7E,0x3C,0x18,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//额外增加的无显示数据
//LED点阵显示图像的行数据(每一行扫描数据)
code u8 gled_row_ud[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//定时器0中断函数
void time0() interrupt 1
{
static u8 i=0;
u8 key=0;
TH0=0XDC; //给定时器赋初值,定时10ms
TL0=0X00;
i++;
if(i==5)//间隔50mS
{
i=0;
key=key_scan(0);
if(key==KEY1_PRESS)
{
leddz_struct.mode++;
if(leddz_struct.mode==5)leddz_struct.mode=0;
if(leddz_struct.mode==MODE_DOWN_UP_SHOW||leddz_struct.mode==MODE_RIGHT_LEFT_SHOW)
leddz_struct.data_cnt=0;
else if(leddz_struct.mode==MODE_UP_DOWN_SHOW||leddz_struct.mode==MODE_LEFT_RIGHT_SHOW)
leddz_struct.data_cnt=16;
}
}
}
//LED花样显示
void leddz_trick_show(void)
{
u8 i=0;
u16 time=0;
while(1)
{
//静态显示
if(leddz_struct.mode==MODE_STATIC_SHOW)
{
for(time=0;time<SPEED_ROLL;time++)
{
for(i=0;i<8;i++)//循环8次扫描8行、列
{
LEDDZ_COL_PORT=gled_col_lr[i];//传送列选数据
hc595_write_data(gled_row_lr[i+8]);//传送行选数据
delay_10us(10);//延时一段时间,等待显示稳定
hc595_write_data(0x00);//消影
}
}
for(time=0;time<SPEED_ROLL;time++)
{
for(i=0;i<8;i++)//循环8次扫描8行、列
{
LEDDZ_COL_PORT=gled_col_lr[i];//传送列选数据
hc595_write_data(gled_row_lr[i+7]);//传送行选数据
delay_10us(10);//延时一段时间,等待显示稳定
hc595_write_data(0x00);//消影
}
}
}
//从下往上滚动显示
else if(leddz_struct.mode==MODE_DOWN_UP_SHOW)
{
for(time=0;time<SPEED_ROLL;time++)
{
for(i=0;i<8;i++)//点阵扫描
{
LEDDZ_COL_PORT=~gled_col_ud[i+leddz_struct.data_cnt];//传送列选数据
hc595_write_data(~gled_row_ud[i]);//传送行选数据
delay_10us(10);//延时一段时间,等待显示稳定
hc595_write_data(0x00);//消影
}
}
leddz_struct.data_cnt++;
if(leddz_struct.data_cnt==16)leddz_struct.data_cnt=0;
}
//从上往下滚动显示
else if(leddz_struct.mode==MODE_UP_DOWN_SHOW)
{
for(time=0;time<SPEED_ROLL;time++)
{
for(i=0;i<8;i++)//点阵扫描
{
LEDDZ_COL_PORT=~gled_col_ud[i+leddz_struct.data_cnt];//传送列选数据
hc595_write_data(~gled_row_ud[i]);//传送行选数据
delay_10us(10);//延时一段时间,等待显示稳定
hc595_write_data(0x00);//消影
}
}
leddz_struct.data_cnt--;
if(leddz_struct.data_cnt==0)leddz_struct.data_cnt=16;
}
//从左往右滚动显示
else if(leddz_struct.mode==MODE_LEFT_RIGHT_SHOW)
{
for(time=0;time<SPEED_ROLL;time++)
{
for(i=0;i<8;i++)//点阵扫描
{
LEDDZ_COL_PORT=gled_col_lr[i];//传送列选数据
hc595_write_data(gled_row_lr[i+leddz_struct.data_cnt]);//传送行选数据
delay_10us(10);//延时一段时间,等待显示稳定
hc595_write_data(0x00);//消影
}
}
leddz_struct.data_cnt--;
if(leddz_struct.data_cnt==0)leddz_struct.data_cnt=16;
}
//从右往左滚动显示
else if(leddz_struct.mode==MODE_RIGHT_LEFT_SHOW)
{
for(time=0;time<SPEED_ROLL;time++)
{
for(i=0;i<8;i++)//点阵扫描
{
LEDDZ_COL_PORT=gled_col_lr[i];//传送列选数据
hc595_write_data(gled_row_lr[i+leddz_struct.data_cnt]);//传送行选数据
delay_10us(10);//延时一段时间,等待显示稳定
hc595_write_data(0x00);//消影
}
}
leddz_struct.data_cnt++;
if(leddz_struct.data_cnt==16)leddz_struct.data_cnt=0;
}
}
}
//LED点阵花样显示系统
void leddz_control_sys(void)
{
time0_init();//初始化定时器0
time0_start();//开启定时器0
while(1)
{
leddz_trick_show();
}
}
三、实验现象
演示视频:https://space.bilibili.com/444388619
联系作者
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。