【51单片机系列】74HC595扩展实验之使用74HC595芯片在LED点阵中显示数字
本实验实现的功能是使用74HC595芯片实在LED点阵中显示数字字符0。
要点亮多个LED灯,需要用到动态数码管的动态扫描原理。
首先如何点亮一行上面的多个灯或一列上面的多个灯,明显就是需要某行或某列有效,同时使多列或多行有效。比如在第一行有效的情况下,有效列与这一行交点上的LED灯就会被点亮。
要实现行列不同位置亮灯,需要使用到动态显示的方法,也要结合扫描的方法。
在第一行亮灯一段时间以后灭掉,点亮第二行一段时间以后灭掉,点亮第三行一段时间后灭掉,如此点亮,直到行全部点亮一次,在第一行点亮到最后一行灭掉的总时间不能超过人肉眼可识别的时间,即24毫秒。在每一行点亮的时候,给列一个新的数据,此时对应列在该行上要点亮的灯的数据。这种方式类似数码管的动态显示一样,不同的是数码管的LED灯是段值,LED点阵是多个LED点亮。
要想在点阵上显示数字等字符,首先要获取在LED点阵上显示数字字符所需的数据,即一个数字字符在LED点阵上显示,对应的每行每列都会有一些灯点亮或者熄灭,这样就会构成一组数据,亦即数字字符的显示数据,将这些数据通过74HC595发送到点阵对应的行或列就能显示数字字符。
数字字符的获取可以使用相关软件获取。这里提供一种文字取模软件,如下:
比如显示数字0,如下:
取模数据为:
u8 ledduan[] = {0x38,0x44,0x44,0x44,0x44,0x44,0x38,0x00}; // 类似于数码管的段选
在proteus中,红色的LED点阵模块采用上列下行的方式,电流通过方向为列->行,所以如果要点亮的话,行设置为0,列设置为1。如下,如果要点亮第一个LED,那么需要P0=0x01,D7-D0 = ~0x01。
显示如下数字0,软件实现如下:
/*
实现功能:74HC595芯片控制LED点阵显示数字0
[2023-12-11] zoya
*/
#include "reg52.h"
#include "intrins.h"
#include "HC595.h"
u8 ledduan = B11111110;
u8 ledwei0[] = {
B00111000, // 0x38
B01000100, // 0x44
B01000100, // 0x44
B01000100, // 0x44
B01000100, // 0x44
B01000100, // 0x44
B00111000, // 0x38
B00000000}; // 列1
// 延时函数,i=1时延时10us
void Delay(u16 i)
{
while(i--);
}
void main()
{
u8 i;
while(1)
{
for(i=0;i<8;i++)
{
HC595SendByte(ledduan); // 发送段选数据
P0 = ledwei0[i];
Delay(100);
ledduan = _crol_(ledduan,1);
}
}
}
其中函数HC595SendByte
实现如下:
/*************************************************************************
* 函数名: HC595SendByte
* 函数功能: 74HC595芯片将输入的一个字节的串行数据转换为并行数据输出
* 输入: dat:74HC595要输出的一个字节的数据
* 输出: void
**************************************************************************/
void HC595SendByte(u8 dat)
{
u8 i;
STCP = 1; // 高电平时存储寄存器数据保持不变
SHCP = 1; // 高电平时移位寄存器数据保持不变
for(i=0;i<8;i++)
{
DS = dat >> 7; // 每次输入最高位数据
dat <<= 1; // 移位后将dat数据左移一位,保证下一次移入的数据在最高位
// 实现移位寄存器的时序,需要SHCP有一个上升沿,所以先将SHCP置0,然后置1
SHCP = 0;
_nop_(); // 空指令,不做任何操作,当做延时使用
_nop_();
SHCP = 1;
}
// 数据已经在移位寄存器了,现在将移位寄存器的数据输出到存储寄存器
// STCP上升沿时将数据从移位寄存器输出到存储寄存器
STCP = 0;
_nop_();
_nop_();
STCP = 1;
}
仿真结果:
如果要显示1,如下
软件设计如下:
/*
实现功能:74HC595芯片控制LED点阵显示数字1
[2023-12-11] zoya
*/
#include "reg52.h"
#include "intrins.h"
#include "HC595.h"
u8 ledduan = B11111110;
u8 ledwei[] = {0x10,0x18,0x10,0x10,0x10,0x10,0x7C,0x00};
// 延时函数,i=1时延时10us
void Delay(u16 i)
{
while(i--);
}
void main()
{
u8 i;
while(1)
{
for(i=0;i<8;i++)
{
HC595SendByte(ledduan); // 发送段选数据
P0 = ledwei[i];
Delay(200);
ledduan = _crol_(ledduan,1);
}
}
}
仿真结果:
文字取模软件链接:
链接:https://pan.baidu.com/s/1k-ND9vJReW_KHMWx8uwpcQ?pwd=gz8w
提取码:gz8w软件使用链接:【C51单片机系列】文字取模软件使用。