在串转并操作中,串行数据首先经由一个串行转并行转换器,该转换器将串行数据拆分为多个并行数据。这些并行数据同时传输到并行数据吸收器,每个并行数据吸收器卖力吸收并处理个中的一部分数据。末了,这些处理后的并行数据再通过并行数据输出端口一起输出,形成并行数据流。
二、74HC595先容74HC595是一种串行输入/并行输出(SIPO)移位寄存器,常用于扩展微掌握器的输出端口:
DS(串行数据输入):用于吸收串行输入数据。SH_CP(时钟输入):用于吸收时钟脉冲,掌握数据的移位。ST_CP(存储时钟输入):用于吸收存储时钟脉冲,掌握数据的加载到寄存器中。OE(输出使能):用于掌握输出端口的使能状态。Q7’(串行输出):输出从DS端输入的数据,用于级联多个74HC595。Q0-Q7(并行输出):8位并行输出端口。
个中Q7’可以级联下一个74HC595,这样通过3个单片机的IO口,可以掌握更多的外设IO。
3.事情事理:74HC595的事情过程分为两个阶段:移位阶段和存储阶段。移位阶段:在时钟旗子暗记的浸染下,串行输入的数据从DS端依次移位到寄存器中。存储阶段:当存储时钟旗子暗记触发时,寄存器中的数据被加载到并行输出端口,并同时输出到外部设备。4. 开拓板事理图(1)88 LED点阵:通过P0 端口掌握列是否有效,设置P0=0,可以启用全部列。通过 DPa~DPh掌握每一行是否有效,行的数值通过 74HC595传过来。(2)74HC595 串转并:
传送一个数据的过程:
OE 置低使能芯片;SER传一个BIT数据;给SR_CLK 一个上升沿,将SER的数据移到QA;重复第2步,更多数据移入寄存器,先移入的数据放入A,其它B、C、D…依次向后移动;传完8个bit数据,给 R_CLK一个上升沿,将数据推到DPn的并口输出。三、代码示例1. LED 滚动显示程序本代码实验征象是: LED 点阵从最下行向上,每次滚动显示一行。显示到第一行后,改从最右列向左,每次滚动显示一列。
(1)led_matrix_utils.c#include "led_matrix_utils.h"#include "common_utils.h"// 时钟输入引脚,用于掌握数据的移位操作sbit SR_CLK = P3^6;// 数据数据推到输出寄存器的引脚sbit R_CLK = P3^5;// 串行数据输入sbit SER = P3^4;u8 gc595_buf[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};// 低电平有效,开启列#define LED_MATRIX_PORT P0void hc595_show_data(u8 show_data){ u8 i = 0; for (i = 0; i < 8; i++) { SER = show_data >> 7 ; show_data <<= 1; // 移位寄存器时钟上升沿,进行移位操作 SR_CLK = 0; delay_10us(1); SR_CLK = 1; delay_10us(1); } // 输出寄存器时钟上升沿,将移位寄存器的数据复制到输出寄存器 R_CLK = 0; delay_10us(1); R_CLK = 1; delay_10us(1);}void hc595_show_row(void){ u8 i=0; LED_MATRIX_PORT = 0; for(i=0;i<8;i++){ hc595_show_data(0x00); hc595_show_data(gc595_buf[i]); delay_ms(500); }}void hc595_show_column(void){ u8 i=0; hc595_show_data(0xFF); for(i=0;i<8;i++){ LED_MATRIX_PORT = ~gc595_buf[i]; delay_ms(500); }}
(2)main.c
#include <reg52.h>#include "led_utils.h"#include "common_utils.h"#include "led_matrix_utils.h"/ @brief 主函数/main(){// 关闭所有ledled_all_off();while(1){hc595_show_row();hc595_show_column();}}1234567891011121314151617181920
2. 显示一个点
void hc595_show_point(u8 x, u8 y){ // 把 LED_MATRIX_PORT 对应的x位置设置为0 x = 8-x; y = 8-y; LED_MATRIX_PORT = ~(0x01 << x); hc595_show_data(gc595_buf[x]); delay_ms(1000);}
3. 显示字符程序(1) led_matrix_utils.c
#include "led_matrix_utils.h"#include "common_utils.h"#include <reg52.h>// 时钟输入引脚,用于掌握数据的移位操作sbit SR_CLK = P3^6;// 数据数据推到输出寄存器的引脚sbit R_CLK = P3^5;// 串行数据输入sbit SER = P3^4;u8 gled_column[8] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};// 低电平有效,开启列#define LED_MATRIX_PORT P0void led_matrix_init(void){ LED_MATRIX_PORT = 0x00;}void hc595_show_data(u8 show_data){ u8 i = 0; for (i = 0; i < 8; i++) { SER = show_data >> 7 ; show_data <<= 1; // 移位寄存器时钟上升沿,进行移位操作 SR_CLK = 0; delay_10us(1); SR_CLK = 1; } // 输出寄存器时钟上升沿,将移位寄存器的数据复制到输出寄存器 R_CLK = 0; delay_10us(1); R_CLK = 1;}void hc595_show_char(u8 gled_row){ u8 i =0; for(i=0;i<8;i++){ LED_MATRIX_PORT = gled_column[i]; hc595_show_data(gled_row[i]); delay_10us(280); hc595_show_data(0x00); }}
(2)main.c
#include <reg52.h>#include "led_utils.h"#include "common_utils.h"#include "led_matrix_utils.h"#include "types.h"// 数据0u8 gled_row[8] = {0x00, 0x7c, 0x82, 0x82, 0x82, 0x7c, 0x00, 0x00};/ @brief 主函数/main(){// 关闭所有ledled_all_off();led_matrix_init();while(1){hc595_show_char(gled_row);}}