51单片机IO扩展(并转串)–74HC165
——8位移位寄存器(并行输入,互补串行输出)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xrz5MNRO-1575257894743)(https://i.loli.net/2019/11/30/XT3VPmCSJzLQrOb.jpg)]
双列直插封装 PLCC封装
说明
当移位/置入控制端(SH/L__D__)为低电平时,并行数据(A-H)被置入寄存器,而时钟(CLK,CLK INH)及串行数据(SER)均无关。当 SH/L__D__为高电平时,并行置数功能被禁止。
CLK和CLK INK在功能上是等价的,可以交换使用。当CLK和CLK INK有一个为低电平并且SH/L__D__为高电平时,另一个时钟可以输入。当CLK和CLK INK有一个为高电平时,另一个时钟被禁止。只有在CLK为高电平时CLK INK才可变为高电平。
引出端符号
CLK,CLK INH 时钟输入端(上升沿有效)
A-H 并行数据输入端
SER 串行数据输入端
QH 输出端
Q__H 互补输出端
SH/L__D__ 移位控制/置入控制(低电平有效)
#####过程理解:
74HC165 A-H 并行数据输入端 输入8位电平信息存到芯片内,通过QH输出端传到51芯片中
真值表
H-高电平 L-低电平 X-任意电平 ↑-低到高电平跳变
时序图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QBfTW6jq-1575257894744)(时序图.jpg)]
根据时序编程
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//函 数 名: Read74HC165
//函数功能: 使用165读取一个字节数据
u8 Read74HC165(void)
{
u8 i;
u8 indata;
IN_PL = 0;
_nop_(); //短暂延时 产生一定宽度的脉冲
IN_PL = 1; //将外部信号全部读入锁存器中
_nop_();
indata=0; //保存数据的变量清0
for(i=0; i<8; i++)
{
indata = indata<<1; //左移一位
SCK = 0; //时钟置0
_nop_();
indata |= IN_Data;
SCK = 1; //时钟置1
}
return(indata);
}
案例
/**************************************************************************************
单片机IO扩展--74HC165实验
实现现象:下载程序后,按下独立按键可以点亮对应的led
K1--led1
K2--led2
K3--led3
...
K8--led8
注意事项:必须将74HC165模块的JP165短接片短接,否则不会出现现象
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//--定义使用的IO口--//
#define GPIO_LED P0
sbit IN_PL = P1^6;
sbit IN_Data = P1^7; //数据通过P1.7脚移进单片机内处理
sbit SCK = P3^6;
/*******************************************************************************
* 函 数 名 : Read74HC165
* 函数功能 : 使用165读取一个字节数据
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
u8 Read74HC165(void)
{
u8 i;
u8 indata;
IN_PL = 0;
_nop_(); //短暂延时 产生一定宽度的脉冲
IN_PL = 1; //将外部信号全部读入锁存器中
_nop_();
indata=0; //保存数据的变量清0
for(i=0; i<8; i++)
{
indata = indata<<1; //左移一位
SCK = 0; //时钟置0
_nop_();
indata |= IN_Data;
SCK = 1; //时钟置1
}
return(indata);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 h165Value;
GPIO_LED = 0;
while(1)
{
h165Value = Read74HC165();
if(h165Value != 0xFF)
{
GPIO_LED = ~h165Value;
}
}
}