51单片机——LED点阵屏
- LED点阵屏
- LED点阵屏原理
- 74HC595串转并芯片
- 源代码
- 例程一:静态笑脸
- 效果展示
- 例程二:笑脸->平脸->哭脸
- 效果展示
LED点阵屏
c51的LED点阵屏其实就是一个8*8像素的屏幕,一共有64个发光二极管。如下图
LED点阵屏原理
其实这个原理和数码管是一样的,都是利用人的视觉暂留,不停扫描LED点阵,依次点亮每一盏灯,只不过数码管扩引脚采用的是38译码器,点阵屏采用的是74HC595串转并芯片。参考数码管
原理图如下:
他的DPa~DPh其实就是上图的D0-D7
74HC595串转并芯片
- 跳线帽OE:OutputEnable,代表输出使能,此位必须置1该芯片才可以输出,所以跳线帽J24必须拔下来,点阵才可以被点亮。因为跳线帽相当于一根导线把VCC,OE,GND连接起来,这种情况下,OE会被GND强制拉成0。(文中第一张图J24跳线帽已拔)
- 输出端:DPa-DPh正好对应LED点阵,QH’是用来做多个led点阵级联的。
- 输入端(简写部分单词)
P34-SER:代表串行输入,我们串行输入就是把数据放到这。
P35-SCK :上升沿移位,即RCK从0-1电位变化会让数据往下移一位
P36-RCK:上升沿锁存,搬运工,即SCK从0-1电位变化会把数据搬运到芯片输出端
这样可能还是理解不清楚,看下图:
源代码
例程一:静态笑脸
#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5; //RCLK ,上升沿锁存,搬运工
sbit SCK=P3^6; //SRCLK,上升沿移位
sbit SER=P3^4; //SER,串行输入的每个bit#define MATRIX_LED_PORT P0/*** @brief 74HC595写入一个字节* @param Byte 要写入的字节* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);SCK=1;//给一个上升沿(之前是0),让他把数据往下移SCK=0;//复位0}RCK=1;//上升沿锁存,搬运RCK=0;//复位0
}/*** @brief LED点阵屏显示一列数据* @param Column 要选择的列,范围:0~7,0在最左边* @param Data 选择列显示的数据,高位在上,1为亮,0为灭* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT=~(0x80>>Column);Delay(1);MATRIX_LED_PORT=0xFF;
}void main()
{SCK=0;RCK=0;while(1){MatrixLED_ShowColumn(0,0x3C);//第一列MatrixLED_ShowColumn(1,0x42);//第二列MatrixLED_ShowColumn(2,0xA9);MatrixLED_ShowColumn(3,0x85);MatrixLED_ShowColumn(4,0x85);MatrixLED_ShowColumn(5,0xA9);MatrixLED_ShowColumn(6,0x42);MatrixLED_ShowColumn(7,0x3C);}
}
效果展示
表情有点折磨啊。。。
例程二:笑脸->平脸->哭脸
MatrixLed.h
#ifndef __MATRIX_LED_H__
#define __MATRIX_LED_H__
void MatrixLED_Init();
void MatrixLED_ShowColumn(unsigned char Column,Data);
#endif
MatrixLed.c
#include <REGX52.H>
#include "Delay.h"sbit RCK=P3^5; //RCLK
sbit SCK=P3^6; //SRCLK
sbit SER=P3^4; //SER#define MATRIX_LED_PORT P0/*** @brief 74HC595写入一个字节* @param Byte 要写入的字节* @retval 无*/
void _74HC595_WriteByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){SER=Byte&(0x80>>i);SCK=1;SCK=0;}RCK=1;RCK=0;
}/*** @brief 点阵屏初始化* @param 无* @retval 无*/
void MatrixLED_Init()
{SCK=0;RCK=0;
}/*** @brief LED点阵屏显示一列数据* @param Column 要选择的列,范围:0~7,0在最左边* @param Data 选择列显示的数据,高位在上,1为亮,0为灭* @retval 无*/
void MatrixLED_ShowColumn(unsigned char Column,Data)
{_74HC595_WriteByte(Data);MATRIX_LED_PORT=~(0x80>>Column);Delay(1);MATRIX_LED_PORT=0xFF;
}
main.c
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"//动画数据,三帧
unsigned char code Animation[]={0x3C,0x42,0xA9,0x85,0x85,0xA9,0x42,0x3C,0x3C,0x42,0xA1,0x85,0x85,0xA1,0x42,0x3C,0x3C,0x42,0xA5,0x89,0x89,0xA5,0x42,0x3C,
};void main()
{unsigned char i,Offset=0,Count=0;MatrixLED_Init();while(1){for(i=0;i<8;i++) //循环8次,显示8列数据{MatrixLED_ShowColumn(i,Animation[i+Offset]);}Count++; //计次延时if(Count>15){Count=0;Offset+=8; //偏移+8,切换下一帧画面if(Offset>16){Offset=0;}}}
}
效果展示
51单片机led点阵屏动画