失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 51单片机——LED点阵屏

51单片机——LED点阵屏

时间:2020-05-08 20:55:44

相关推荐

51单片机——LED点阵屏

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点阵屏》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。