700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【51单片机快速入门指南】2.4:74HC595 LED点阵屏及其SPI控制

【51单片机快速入门指南】2.4:74HC595 LED点阵屏及其SPI控制

时间:2018-10-24 08:22:37

相关推荐

【51单片机快速入门指南】2.4:74HC595 LED点阵屏及其SPI控制

目录

硬知识IO 口扩展方式-串转并74HC595 芯片介绍硬件设计测试源码HC74595.cHC74595.hmain.h实验现象SPI控制

普中51-单核-A2

STC89C52

Keil uVision V5.29.0.0

PK51 Prof.Developers Kit Version:9.60.0.0


硬知识

选自《普中51单片机开发攻略_V1.2》

IO 口扩展方式-串转并

使用的芯片是 74HC595。开发板板载 1 个 74HC595 芯片,仅需单片机 3 个 IO 口即可扩展 8 个,如果需要还可以将 2 个 74HC595 级联扩展出 16 个 IO,这就实现用少数 IO 资源控制多个设备。

74HC595 芯片介绍

74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三 态输出(即高电平、低电平和高阻抗)。

15 和 1 到 7 脚 QA–QH:并行数据输出

9 脚 QH 非:串行数据输出

10 脚 SCLK 非( MR) : 低电平复位引脚

11 脚 SCK( SHCP) : 移位寄存器时钟输入

12 脚 RCK( STCP) : 存储寄存器时钟输入

13 脚 G 非( OE) : 输出有效

14 脚 SER( DS) : 串行数据输入

74HC595 具有 8 位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是单独的时钟。数据在 SCK 的上升沿输入,在 RCK 的上升沿进入到存 储器中。如果两个时钟连在一起,则移位寄存器总是比存储器早一个脉冲。移位寄存器有一个串行输入(DS),和一个串行输出(Q7 非),和一个异步的低电 平复位,存储寄存器有一个并行8 位、具有三态的总线输出,当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在 STCP 上升沿输出到并行端口。

硬件设计

74HC595 需要用到的控制管脚 SER、RCLK、SRCLK 直接连接到 51 单片机的 P3.4~P3.6 IO 口上,输出端则是直接连接到 LED 点阵模块的行端口上,即为 LED 发光二极管的阳极,LED 点阵的列则为发光二极管的阴极。

要想控制 LED 点阵,可以将单片机管脚按照 74HC595 芯片的通信时序要求来传输数据,这样即可控制 LED 点阵的数据。根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。因此通过单片机P0 口控制点阵74HC595控制点阵

测试源码

修改自官方例程

stdint.h见【51单片机快速入门指南】1:基础知识和工程创建

HC74595.c

#include <REGX52.H>#include "intrins.h"#include "stdint.h"#define Rows P0uint8_t Mat[8][8] = {1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,};void HC74595_Delay() //10us @11.0592MHz{unsigned char i;i = 2;while (--i);}//定义74HC595控制管脚sbit SRCLK_74595=P3^6;//移位寄存器时钟输入sbit RCLK_74595=P3^5;//存储寄存器时钟输入sbit SER_74595=P3^4; //串行数据输入/******************************************************************************** 函 数 名 : hc595_write_data(uint8_t dat)* 函数功能 : 向74HC595写入一个字节的数据* 输 入 : dat:数据* 输 出 : 无*******************************************************************************/void hc595_write_data(uint8_t dat){uint8_t i=0;for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中{SER_74595=dat>>7;//优先传输一个字节中的高位dat<<=1;//将低位移动到高位SRCLK_74595=0;HC74595_Delay();SRCLK_74595=1;HC74595_Delay();//移位寄存器时钟上升沿将端口数据送入寄存器中}RCLK_74595=0;HC74595_Delay();RCLK_74595=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出}void imshow(uint8_t mat[8][8]){uint8_t i, j, Row_Pix;for(i=0; i<8; ++i){hc595_write_data(0x00);//消除前面寄存器缓存数据for(j = 0, Row_Pix = 0; j < 8; ++j)Row_Pix |= mat[i][j] << (7-j);Rows = ~Row_Pix;hc595_write_data(0x80>>i);//写入新的数据HC74595_Delay();}}

HC74595.h

#ifndef HC74595_H_#define HC74595_H_#include "stdint.h"extern uint8_t Mat[8][8];void hc595_write_data(uint8_t dat);void imshow(uint8_t mat[8][8]);#endif

main.h

#include <REGX52.H>#include "intrins.h"#include "stdint.h"#include "HC74595.h"void main(void){while(1){imshow(Mat);}}

实验现象

如图,成功将Mat中的二值图像打印在8x8的点阵屏上

SPI控制

SPI控制代码见【51单片机快速入门指南】5:软件SPI

SPI使用模式2

#include <STC89C5xRC.H>#include "intrins.h"#include "stdint.h"#include "./Soft_SPI/Soft_SPI.h"#define Rows P0//定义74HC595控制管脚sbit RCLK_74595_CS=P3^5;//存储寄存器时钟输入uint8_t Mat[8][8] = {1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,};void HC74595_Delay() {}/******************************************************************************** 函 数 名 : hc595_write_data(uint8_t dat)* 函数功能 : 向74HC595写入一个字节的数据* 输 入 : dat:数据* 输 出 : 无*******************************************************************************/void hc595_write_data(uint8_t dat){RCLK_74595_CS=0;SOFT_SPI_RW_MODE2(dat);RCLK_74595_CS=1;//存储寄存器时钟上升沿将前面写入到寄存器的数据输出}void imshow(uint8_t mat[8][8]){uint8_t i, j, Row_Pix;for(i=0; i<8; ++i){hc595_write_data(0x00);//消除前面寄存器缓存数据for(j = 0, Row_Pix = 0; j < 8; ++j)Row_Pix |= mat[i][j] << (7-j);Rows = ~Row_Pix;hc595_write_data(0x80>>i);//写入新的数据HC74595_Delay();}}

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