1.LED点阵介绍
2.内部结构图
3.74HC595介绍
跳线帽如此插入
比如我们SER串行数据为10100000,每当SERCLK来一个上升沿,就是低电平向高电平的跳跃,那么SER的高位移入,以此类推,当八位全部移入时,RCLK来一个上升沿,就会将这八位数据全部送入输出端
4.原理图
5.LED点阵屏显示图形
步骤:
1)位声明
2)配置74HC595
3)点阵屏函数
如上,0xAA的话,即1010 1010,高电平有效,高位为A1,以此类推,因此理论上应该为第1、3、5、7行被选中
列为0的话,选择第1列
那么效果应该就是第1列的第1、3、5、7行的LED被点亮
事实确实如此
4)也需要进行消影操作
段选 位选 延时 位清零 段选 位选.....
5)显示多位
在消影的基础上
效果如下:
6)显示图案
代码如下:
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5;//位声明,原理图的RCLK,
//因为会和REGX头文件中的声明冲突
sbit SCK=P3^6;//原理图的SRCLK
sbit SER=P3^4;//SER
void _74HC595_(unsigned char Byte)
//char为一个字节,即Byte为8位
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);//1000 0000,第一次先保留Byte的高位
//然后i=1,1000 0000循环右移,0100 0000
//相当于Byte&0x40,以此类推
SCK=1;//来个上升沿。依次把Byte的八位移入,从最高位为开始
SCK=0;//清零,准备下一个移位
}
RCK=1;//将移入的八位送入输出端
RCK=0;
}
void MatrixLED(unsigned char x,y)//行和列
{
_74HC595_(x);//选择第几行,A1为最高位
P0=~(0x80>>y);//选择第几列,高位即P07为第一列
//y=0,即选择第1列
//消影
Delay(1);//延时
P0=0xFF;//位清零
}
void main()
{
SCK=0;
RCK=0;
while(1)
{
MatrixLED(0x3C,0);
MatrixLED(0x42,1);
MatrixLED(0xA9,2);
MatrixLED(0x85,3);
MatrixLED(0x85,4);
MatrixLED(0xA9,5);
MatrixLED(0x42,6);
MatrixLED(0x3C,7);
}
}
6.模块化
1)MatrixLED.c
#include <REGX52.H>
#include "Delay.h"
sbit RCK=P3^5;//位声明,原理图的RCLK,
//因为会和REGX头文件中的声明冲突
sbit SCK=P3^6;//原理图的SRCLK
sbit SER=P3^4;//SER
void _74HC595_(unsigned char Byte)
//char为一个字节,即Byte为8位
{
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);//1000 0000,第一次先保留Byte的高位
//然后i=1,1000 0000循环右移,0100 0000
//相当于Byte&0x40,以此类推
SCK=1;//来个上升沿。依次把Byte的八位移入,从最高位为开始
SCK=0;//清零,准备下一个移位
}
RCK=1;//将移入的八位送入输出端
RCK=0;
}
void MatrixLED_Init()//点阵屏初始化
{
SCK=0;
RCK=0;
}
void MatrixLED(unsigned char x,y)//行和列
{
_74HC595_(x);//选择第几行,A1为最高位
P0=~(0x80>>y);//选择第几列,高位即P07为第一列
//y=0,即选择第1列
//消影
Delay(1);//延时
P0=0xFF;//位清零
}
2)MatrixLED.h
#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__
void MatrixLED_Init();
void MatrixLED(unsigned char x,y);
#endif
7.LED点阵屏动画
步骤:
1)打开文字取模软件(评论区获取)
图像大小按照自己想法进行调整
直接点击即可绘制
2)创建数组
3)主函数
代码如下:
主函数如下,其他头文件和.c文件评论区领取
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
unsigned char code Animation[]=
//code将数据存放在flash中,内存比不加code的RAM要大
//但是坏处就是在主函数中我们要修改数组中的值是不能更改的
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//间隔,更好的衔接
0xFF,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,
0x15,0x15,0x08,0x00,0x7E,0x01,0x02,0x00,
0x7E,0x01,0x02,0x00,0x0E,0x11,0x11,0x0E,
0x00,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00//同理
};//将取模软件的数据复制
void main()
{
unsigned char i,Offset=0,count=0;//Offset为偏移量,count为扫描次数
MatrixLED_Init();
while(1)
{
for(i=0;i<8;i++)
{
MatrixLED(Animation[i+Offset],i);//取前八个数据
}
count++;
if(count>10)//扫描10遍,前八个数据进行扫描
{
count=0;
Offset++;//往右偏移一位
if(Offset>40)//Offset+8要小于48
{
Offset=0;
}
}
}
}
效果如下:
LED点阵屏显示Hello!的动画