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_PORTP0/*** @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;//RCLKsbit SCK=P3^6;//SRCLKsbit SER=P3^4;//SER#define MATRIX_LED_PORTP0/*** @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点阵屏动画
如果觉得《51单片机——LED点阵屏》对你有帮助,请点赞、收藏,并留下你的观点哦!