内容
通过74HC595模块控制LED点阵,以一行循环滚动显示
74HC595简介
51单片机IO口非常有限,如果想要连接更多外围设备,可以通过IO扩展来实现;其中一种IO口扩展方式-串转并,使用的芯片是74HC595;
1个74HC595芯片,仅需单片机3个IO口即可扩展8个,如果需要还可以将2个74HC595级联扩展出16个IO,这就实现用少数IO资源控制多个设备;
74HC595具有8位移位寄存器和一个存储器,能够8位串行输入、并行输出,其中并行输出为三态输出(即高电平、低电平和高阻抗)
移位寄存器和存储器是单独的时钟;
管脚说明:
- 15和1到7脚QA-QH:并行数据输出
- 9脚QH非:串行数据输出
- 10脚SRCLR非(MR):低电平复位引脚
- 11脚SRCLK/SCK(SHCP):移位寄存器时钟输入
- 12脚RCLK/RCK(STCP):存储寄存器时钟输入
- 13脚OE非(OE):输出有效
- 14脚SER(DS):串行数据输入
通信时序:数据在SCK的上升沿输入RCK,在RCK的上升沿输出到并行端口;如果两个时钟连在一起,则移位寄存器总是比存储器早一个脉冲;
原理图
由线路图得知,74HC595的控制管脚SER、RCLK、SRCLK连接到51单片机的P34-36口上,输出端则是直接连接到LED点阵模块的行端口上,即为LED发光二极管的阳极,LED 点阵的列则为发光二极管的阴极;
要想控制LED点阵,可以将单片机管脚按照74HC595芯片的通信时序要求来传输数据,这样即可控制LED点阵的行数据;
根据LED发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭,因此可以通过P0口控制列,74HC595口行;
思路
根据通信时序写出数据输入函数;
输出数据的口对应led点阵的行,P0口对应led点阵的列,让P0口全为0,然后根据输出数据循环点亮每一行即可;
编码
main.c
/*
* @Description: 通过74HC595模块控制LED点阵,以一行循环滚动显示
*/
#include "reg52.h"
typedef unsigned int u16; // 对系统默认数据类型进行重定义
typedef unsigned char u8;
// 定义74HC595控制管脚
sbit SCK = P3 ^ 6; // 移位寄存器时钟输入
sbit RCK = P3 ^ 5; // 存储寄存器时钟输入
sbit SER = P3 ^ 4; // 串行数据输入
#define LEDDZ_COL_PORT P0 // 点阵列控制端口
u8 ghc595_buf[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 表示显示第一行到第八行
/**
* @description: 延时函数(循环一次大约10us)
* @param {u16} ten_us
* @return {*}
*/
void delay_10us(u16 ten_us)
{
while (ten_us--)
;
}
/**
* @description: 延时函数(循环一次大约1ms)
* @param {u16} ms
* @return {*}
*/
void delay_ms(u16 ms)
{
u16 i, j;
for (i = ms; i > 0; i--)
for (j = 110; j > 0; j--)
;
}
/**
* @description: 向74HC595写入一个字节的数据
* @param {u8} dat 要写入的数据
* @return {*}
*/
void hc595_write_data(u8 dat)
{
u8 i = 0;
for (i = 0; i < 8; i++) // 循环8次即可将一个字节写入寄存器中
{
SER = dat >> 7; // 优先传输一个字节中的高位
dat <<= 1; // 将低位移动到高位
SCK = 0;
delay_10us(1);
SCK = 1; // 移位寄存器SCK时钟上升沿将端口数据送入存储寄存器RCK中
delay_10us(1);
}
RCK = 1; // 存储寄存器RCK时钟上升沿将前面写入到寄存器的数据输出
delay_10us(1);
RCK = 0;
}
void main()
{
u8 i = 0;
LEDDZ_COL_PORT = 0x00; // 将LED点阵列全部设置为0,即LED阴极为低电平
while (1)
{
for (i = 0; i < 8; i++)
{
hc595_write_data(0x00); // 消除前面寄存器缓存数据
hc595_write_data(ghc595_buf[i]); // 写入新的数据
delay_ms(500); // 延时500ms
}
}
}
编译和结果
按F7编译,无错误,生成.hex文件,使用pz-isp将hex文件下载到单片机
需要把LED点阵旁的J24黄色跳线帽短接到GND一端
结果:led点阵每行依次点亮,且一直循环