目录
源代码
如上图将5个文放在Keli5 中即可,然后烧录在单片机中就行了
烧录软件用的是STC-ISP,不知道怎么安装的可以去看江科大的视频:
【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?p=2&vd_source=ada7b122ae16cc583b4add52ad89fd5e
源代码:
头文件要记得宏定义和重定义,避免重复调用:
#ifndef _Timer0_h_//名字根据文件名定义即可
#define _Timer0_h_
//声明函数……
#endif
main.c
#include <STC89C5xRC.H>
#include "Delay.h"
#include "MatrixLED.h"
unsigned char code Animation[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x7F,0x08,0x08,0x08,0x7F,0x00,0x7F,0x49,
0x49,0x49,0x00,0x7F,0x01,0x01,0x01,0x00,
0x7F,0x01,0x01,0x01,0x00,0x3E,0x41,0x41,
0x41,0x3E,0x00,0x7D,0x00,0x7D,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
void main(){
//分别定义循环次数i(LED点阵屏的行,动画展示初始画面)
//递增的offset,用来移动画面
//动画速度Count
unsigned char i,offset,Count=0;
MatrixLED_Init();//初始化
while(1){
for(i=0;i<8;i++){
MatrixLED_ShowColumn(i,Animation[i+offset]);//展示当前图片,每次循环都会换图片,换的快了,多了就成动画了
}
Count++;//每循环一次逐渐增加
if(Count>10){//每循环10次就换一次图片
Count=0;
offset++;//增加,改变Data,也就是LED点阵屏的行
if(offset>40){//计算组数,防止溢出,本代码中48个数,减去i(也就是8),40
offset=0;
}
}
}
}
Delay.c
//Delay.c
#include <STC89C5xRC.H>
#include <INTRINS.H>
//延时函数
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms){
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--;
}
}
Delay.h
//Delay.h
#ifndef __Delay_H__
#define __Delay_H__
//延时函数头文件
void Delay(unsigned int xms);
#endif
MatrixLED.c
//MatrixLED.c
#include <STC89C5xRC.H>
#include "Delay.h"
sbit RCK=P3^5;//RCLK上升沿锁存,保存数据
sbit SCK=P3^6;//SCLK上升沿移位,往下推送数据
sbit SER=P3^4;//SER数据
//初始化
void MatrixLED_Init(){
SCK=0;//低电平
RCK=0;//低电平
}
//74Hc595写入字节操作(控制点阵屏Data)
void _74Hc595_WriteByte(unsigned char Byte){
unsigned char i;//定义循环次数和移位
for(i=0;i<8;i++){
SER=Byte&(0x80>>i);//右移:1000 0000->0100 0000以此类推
SCK=1;//高电平,高低变化通电,下移数据
SCK=0;//再次低电平
}
RCK=1;//高电平,高低变化通电,保存数据
RCK=0;//再次低电平
}
//控制点阵屏亮灭
void MatrixLED_ShowColumn(unsigned char Column,Data){
_74Hc595_WriteByte(Data);//SER数据,控制LED点阵屏(竖着看),0亮1不亮
P0=~(0x80>>Column);//表示第几列
Delay(1);//间隔,防止行列串起来
P0=0xFF;//列清,防止行列串起来
}
MatrixLED.h
//MatrixLED.h
#ifndef __MatrixLED_H__
#define __MatrixLED_H__
void MatrixLED_ShowColumn(unsigned char Column,Data);
void MatrixLED_Init();
#endif
代码解析与教程:
MatrixLED模块
- 注释解释很清楚。
下面来进行分析
跟昨天的博客一样,只不过将main函数中的SCK=0,RCK=0重新定义到一个初始函数中。
- 第一部分是进行74Hc595初始化定义;
- 第二部分是74Hc595写入数据的函数;
- 第三部分是点阵屏LED的展示函数;
Dealy模块
- 包含源代码与头文件,不需要知道怎么实现的会用即可,后续使用,直接将头文件和源代码拿过来用即可;
xms是定义的毫秒,1000毫秒就是1秒;模版生成的是1毫秒的,因此xms等于1000
74Hc959、LED点阵屏教程
由于单片机系列版本不一样,单片机核心控制可能会有不同,例如:有些单片机的LED的L1是P21,有些就是P2_1,需要看单片机核心,或者头文件:
同理:LED点阵屏的按键就是P0;
可以看到我的STC89C52RC是P0;
74Hc595教程
- 先看原理图:
- 运行之前需要将51单片机上的J24连接2,3;也就是OE,GND,不然点阵屏LED无法显示,想要显示点阵屏LED,必须先配置好74Hc959;
- 由图可知,P35对应的是RCLK,同理可得SRCLK,SER的地址,作用如下:
sbit RCK=P3^5;//RCLK上升沿锁存,保存数据 sbit SCK=P3^6;//SCLK上升沿移位,往下推送数据 sbit SER=P3^4;//SER数据
- 下面来看一张图
- 图中可以知道,SER是写入数据的,然后通过SERCLK(SRCLK)来进行向下移位,再然后通过RCLK来锁定数据,以此类推;在填满8个数据后,整体向右移位赋值,这些Q开头的值,就是LED点阵屏对应的行值;需要注意的是,先填的数在最下面!!!!
- 听不懂没关系,看图:
- 由图可知,Q开头的值就是对应D开头的行值,;例如QH=D0;
- 了解上述知识点之后,下面开始初始化:
//MatrixLED.c #include <STC89C5xRC.H> #include "Delay.h" sbit RCK=P3^5;//RCLK上升沿锁存,保存数据 sbit SCK=P3^6;//SCLK上升沿移位,往下推送数据 sbit SER=P3^4;//SER数据 //初始化 void MatrixLED_Init(){ SCK=0;//低电平 RCK=0;//低电平 } //74Hc595写入字节操作(控制点阵屏Data) void _74Hc595_WriteByte(unsigned char Byte){ unsigned char i;//定义循环次数和移位 for(i=0;i<8;i++){ SER=Byte&(0x80>>i);//右移:1000 0000->0100 0000以此类推 SCK=1;//高电平,高低变化通电,下移数据 SCK=0;//再次低电平 } RCK=1;//高电平,高低变化通电,保存数据 RCK=0;//再次低电平 } //控制点阵屏亮灭 void MatrixLED_ShowColumn(unsigned char Column,Data){ _74Hc595_WriteByte(Data);//SER数据,控制LED点阵屏(竖着看),0亮1不亮 P0=~(0x80>>Column);//表示第几列 Delay(1);//间隔,防止行列串起来 P0=0xFF;//列清,防止行列串起来 }
先定义SER,SRLCK,RLCK的地址,因为头文件中有了,所以这里用其他名字表示;根据上述图片看,SER是P35,同理得到其他的。
然后先在初始化函数中将SRCLK和RCLK初始化成低电平的0,这样在将他们定义成1后,就会产生电位差,从而通电,之后重新定义成0(低电平),为下次的填写数据进行准备,一共填写8次,8次填满后,就会右移,然后作为Byte(就是数据)使用,也就是LED点阵屏的Data(行)。
现在有了行了,要定义列;列的话就是P0,P0=0111 1111,就是P07=0,以此类推。P06就是1011 1111。代码中,P0=~(0x80>>Column);就是通过右移来改变P0的值;例如:Column=1时,P0=0111 1111>>1011 1111,以此类推,就可以通过Column来定义列了。
LED点阵屏教程
- 在此之前,必须要了解74Hc959的相关知识,然后知道行列后,再看下面的
- 先看原理图:
LED点阵屏是高电位,设定为0就是通电
- P0就是16进制的LED点阵屏灯总控制,听不懂没关系,看图:
- 满足上面的两个条件,才能亮,比如图中的D6=1,P06等于0,这个灯就会亮了
main模块
- 昨天学了展示图片,想要实现动画,首先就要了解,动画是很多的图片连续播放得到的,知道这一点后,对代码进行相应的修改即可。先看代码:
#include <STC89C5xRC.H> #include "Delay.h" #include "MatrixLED.h" unsigned char code Animation[]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7F,0x08,0x08,0x08,0x7F,0x00,0x7F,0x49, 0x49,0x49,0x00,0x7F,0x01,0x01,0x01,0x00, 0x7F,0x01,0x01,0x01,0x00,0x3E,0x41,0x41, 0x41,0x3E,0x00,0x7D,0x00,0x7D,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; void main(){ //分别定义循环次数i(LED点阵屏的行,动画展示初始画面) //递增的offset,用来移动画面 //动画速度Count unsigned char i,offset,Count=0; MatrixLED_Init();//初始化 while(1){ for(i=0;i<8;i++){ MatrixLED_ShowColumn(i,Animation[i+offset]);//展示当前图片,每次循环都会换图片,换的快了,多了就成动画了 } Count++;//每循环一次逐渐增加 if(Count>10){//每循环10次就换一次图片 Count=0; offset++;//增加,改变Data,也就是LED点阵屏的行 if(offset>40){//计算组数,防止溢出,本代码中48个数,减去i(也就是8),40 offset=0; } } } }
第一,定义一个数组,用本篇文章最下面的软件进行画图,生成代码。看视频
文字取模
生成代码后将这些代码放进数组中,为了动画流畅,我们在前面定义8个空的,实现图片从最右面出来,然后在最左边出去,因此后面也定义8个空
code是将这个数组存在flash中,防止占用内存,当然把code删掉就可以正常存在寄存器中了。
- 再看下面的代码
举个例子:当代码刚开始运行的时候,i=0,对应的行就是第一行,此时i+offset=0,也就是数组的第一个0x00,然后往下运行,隔了一段时间后,offset加一;i+offset=1,就是数组的第二个,然后i++;以此类推。
软件介绍:
因为每次想要点亮灯,都要计算,非常难算;因此介绍一个软件:
通过上面标识的来操作,就可以自动生成代码,软件使用的教程在江科大的视频里有:
【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?p=21&vd_source=ada7b122ae16cc583b4add52ad89fd5e
软件在:
软件安装包、开发板资料、课件及程序源码下载链接:https://jiangxiekeji.com/download.html
效果视频:
LED点阵屏显示动画
注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!