点阵屏介绍
类似于数码管,要用到肉眼视觉效应。扫描,才能把每一个LED都能选中,从而显示我们想要的图形,否则, 只能一次点亮一个LED,
LED使用
51单片机点阵屏电路图:
实际连接顺序如下图:D0~D7控制行。P07~P00控制列
D0~D7连接到74HC595上。
OE:OutputEnable,代表输出使能
在介绍 74HC595模块时,首先介绍一下J24模块,要是想使用74HC595模块,就必须要将OE端接到GND端,如图所示,因为OE是低电平有效,所以OE需要接到GND端才能控制点阵屏。
接高电平是控制LED模块,
SRCLR:低电平有效,清空数据,把存入的数据清空,硬件一直把它置1,不需要清空。
SERCLK:上电默认为高电平,初始化时设为低电平。每来一个上升沿移一次位,所以我们移完一次要置0,再置1.这样就可以给一次上升沿。
RCLK:同理,上电默认为高电平,初始化时设为低电平。每来一次上升沿,把数据并行输出
可以多片级联,把QH'连到下一个74HC595SER上,就实现的输出16位。
Byte&0x80 即取出Byte的最高位。SER是一位,Byte&0x80是8位数据。所以单片机有这样的操作
如果SER是一位,给的值不是0,就是1,即非0即1.给2566,也是1.
爱心的代码:
#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 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,0x30);
MatrixLED_ShowColumn(1,0x78);
MatrixLED_ShowColumn(2,0x7C);
MatrixLED_ShowColumn(3,0x3E);
MatrixLED_ShowColumn(4,0x7C);
MatrixLED_ShowColumn(5,0x78);
MatrixLED_ShowColumn(6,0x30);
MatrixLED_ShowColumn(7,0x00);
}
}
数码管消隐的目的是为了避免动态显示时出现数字不清晰或出现亮阴影的问题。动态显示利用了人眼的暂留效应,通过快速切换数码管的显示状态来实现多位数字的显示。在动态显示过程中,单片机通过IO口控制数码管的段码,先进行位选,然后发送段码,接着进行延时(通常在1到3毫秒之间),最后关闭位选。这个延时的过程就是消隐作用,它确保了当前位选关闭后,下一位选的段码发送时,当前位的段码不会继续显示,从而避免了显示混乱的情况。如果没有进行消隐,下一位的段码在发送时,当前位的段码仍然会显示,导致视觉上的干扰和不清晰。
实现动态:
#include <REGX52.H>
#include "Delay.h"
#include "MatrixLED.h"
// 通过数组来实现动态效果
unsigned char Animation[] = {
0x30,0x78,
0x7C,0x3E,
0x7C,0x78,
0x30,0x00,
0x30,0x78,
0x7C,0x3E,
0x7C,0x78,
0x30,0x00,
};
void main(){
unsigned char i,Offset = 0, Count = 0;
MatrixLED_Tnit(); // 初始化
while(1){
for(i = 0; i < 8; i++){
MatrixLED_ShowColumn(i, Animation[i + Offset]); // 带偏移量的显示数据,实现动态效果
}
Count++;
if(Count > 10){ // 防止越界出现乱码
Count = 0;
Offset++;
if(Offset > 8){
Offset = 0;
}
}
}
}
MatrixLED.c
//MatrixLED.c的代码,.h 的代码应该能够轻易写出
#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 要写入的字节
* @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 LED点阵屏显示一列数据
* @param Column 要显示的列 , 范围:0~7,0在最左边
Data选择列要显示的数据,高位在上,1为亮,0为灭
* @retval 无
*/
void MatrixLED_ShowColumn(unsigned char Column, unsigned char Data)
{
_74HC595_WriteByte(Data);
MATRIX_LED_PORT = ~(0x80>>Column);
Delay(2);
MATRIX_LED_PORT = 0xFF;
}
/**
* @brief 点阵屏初始化
* @param 无
* @retval 无
*/
void MatrixLED_Tnit()
{
SCK = 0;
RCK = 0;
}
MatrixLED.h
#ifndef __MatrixLED_H__
#define __MatrixLED_H__
void _74HC595_WriteByte(unsigned char Byte);
void MatrixLED_ShowColumn(unsigned char Column, unsigned char Data);
void MatrixLED_Tnit();
#endif