时序图入门74HC165
# 74HC165
- 并入串出的芯片(可以让并行的数据串行输出)
DS
: 串行输入
D0-D7
: 并行数据输入
当
PL
引脚为低时 ,D0-D7
的数据进入位移寄存器当
PL
引脚为高时 , 数据从DS
引脚串行进入寄存器当
CE
引脚为低时 , 使能时钟,数据在时钟CP
上升时进行数据位移当
CE
引脚为高时 , 失能时钟,时钟输入无效
# 时序图
简单引脚作用说明
PL
: 控制并行还是串行输入
CP
: 时钟输出
CE
: 时钟控制
DS
: 串行输入入口
D0-D7
: 并行输入入口
Q7
: 输出出口
# 真值表
# 运行原理
asynchronous parallel load input : 异步并行
移位寄存器
PL
为高电平时 通过串行输入 DS
入口 ,CE
使时钟有效
移位寄存器
# 代码实现
仿真图
#include <reg52.h>
sbit v_PL = P2^5; // 控制串行还是并行输入
sbit v_CLK = P2^7; // CP时钟 上升沿触发
sbit v_OUT = P2^4; // Q7输出数据
sbit v_CE = P2^6; // 时钟使能,低电平有效
void init_74hc165(){
v_CE = 0; //使能时钟
v_PL = 1; //拉高未连接 DS 情况下是禁止使用
v_CLK = 1; //拉高时钟以便于产生上升沿
}
uchar getDAT(){
uchar i; uchar dat;
v_PL = 0; // 等待读取按键状态
_nop_();
v_PL = 1; // 禁止读取按键状态(此时数据已经存储到了寄存器)
_nop_();
/*if(v_out == 1){ //有按键输入
temp |= 0x01;//赋值
}*/
//依次将剩下的
for(i= 0;i<8;i++){
dat = dat<<1;//向左移位
v_CLK = 0;
_nop_();
dat = dat|v_OUT; //获取数据
v_CLK = 1; // 时钟没次发生上升沿是数据向左移一位
_nop_();
}
return dat;
}
void main(){
uchar leds;
while(){
leds = getDAT();
P1 = leds;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
编辑 (opens new window)
上次更新: 2023/02/07, 14:51:48