学习日志-C51-点阵LED显示动画
现象:点阵LED区流动显示字符/逐帧显示
1.开发板原理图
74HC595:
输入端:OE:13号引脚,低电平可使能。所以使用时需要将OE与GND连接使用。
SER:14号引脚,数据输入端。
SRCLK:11号引脚,上升沿时数据寄存器的数据移位,QA>>QH。
RCLK:12号引脚,上升沿时移位寄存器的数据进入数据存储寄存器。
因而先将SER赋值,SRCLK每经过一个上升沿,数据寄存器存入一位,先输入的为高位,经过8次后,经过一个RCLK的上升沿,将寄存器的数据输出到QH~QA,使得点阵LED的行数据可以选中,然后进行列扫描即可。
2.编程实现
(1)点阵LED配置
#include <REGX52.H>
#include "delay.h"
sbit SCK=P3^6;//SRCLK为方便自己设计电路,进行重新定义,后续若使用其他板子可以直接更改此处即可
sbit RCK=P3^5;//RCLK
sbit SER=P3^4;//SER
#define MATRIX_LED_PORT P0//便于自己设计电路,更改P0即可
/*初始化函数,将其置0,方便后续产生上升沿*/
void Matrixled_Init()
{
SCK=0;
RCK=0;
}
void _74HC595_WriteByte(unsigned char Byte)//74HC595写入数据并输出
{
unsigned char j;
for(j=0;j<8;j++)//j<8时,循环加1,输出8位数据
{
SER=Byte&(0x80>>j);
/*Byte为8位数据,0x80为1000 0000,Byte与0x80相与,结果赋值给SER,若Byte首位为1,则相与后的结果不为0,不为0即SER被赋值为1,将Byte的首位输入给SER。若Byte首位为0,则相与后的结果为0,为0即SER被赋值为0,将Byte的首位输入给SER。*/
SCK=1;//上升沿将数据读入寄存器
SCK=0;//复位
}//完成8位数据写入
RCK=1;//上升沿,将8位数据输出
RCK=0;//复位
}
void Matrixled_Show(unsigned char Column,Data)
{
_74HC595_WriteByte(Data);//得到行数据
MATRIX_LED_PORT=~(0x80>>Column);//选取列
Delay(1);//延时清影
MATRIX_LED_PORT=0xff;
}
(2)流动显示字符主函数
#include <REGX52.H>
#include "matrixled.h"
unsigned char code Animation[]={
0x00,0x04,0x5D,0xF6,0x5C,0xF6,0x5D,0x04,0x00,
0x00,0x04,0x5D,0xF6,0x5C,0xF6,0x5D,0x04,0x00,
};//由字模提取软件自动获得
void main()
{
unsigned char i,shift,count;
Matrixled_Init();//初始化
while(1)
{
for(i=0;i<8;i++)
{
Matrixled_Show(i,Animation[i+shift]);//显示8列数据
}
count++;
if(count>10)//扫描10个周期后向左移动
{
count=0;
shift++;
if(shift>9)
{shift=0;}
}
}
}
(3)逐帧显示动画主程序
#include <REGX52.H>
#include "matrixled.h"
unsigned char code Animation[]={
0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,
0x3C,0x42,0xA9,0x8D,0x8D,0xA9,0x42,0x3C,
0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C,
};//每8个为1帧
void main()
{
unsigned char i,shift,count;
Matrixled_Init();
while(1)
{
for(i=0;i<8;i++)
{
Matrixled_Show(i,Animation[i+shift]);
}
count++;
if(count>30)
{
count=0;
shift+=8;//更改此处即可,改为加8,即可到下一帧
if(shift>16)
{shift=0;}
}
}
}
(4)取字模软件使用
在改变图像大小处设置高度为8,宽度根据想显示的字符长短自行设定。
在其他选项处按如图所示配置。
然后就可以绘制自己想要的图形,绘制结束之后在取模方式处选择C51即可,则在下方点阵生成区得到对应数据,填到Animation处即可。