- 打卡等级:偶尔看看III
- 打卡总天数:31
- 最近打卡:2025-12-17 09:44:38
注册会员
- 积分
- 85
|
实验内容
掌握熟悉 165 的使用环境与要求。
掌握 165 的基本编程方法。
先上电路
74HC165 是一款高速 CMOS 器件,74HC165 遵循 JEDEC 标准 no.7A。74HC165 引
脚兼容低功耗肖特基 TTL(LSTTL)系列。
74HC165 是 8 位并行输入串行输出移位寄存器,可在末级得到互斥的串行输出
(QH 和 QH 非),当并行读取(S/L)输入为低时,从 A 到 H 口输入的并行数据将被
异步地读取进寄存器内。而当 S/L 为高时,数据串行进入寄存器,在每个时钟脉冲
的上升沿向右移动一位(A → B → C,等等)。利用这种特性,只要把 QH 输出绑
定到下一级的 SI 输入,即可实现并转串扩展。
74HC165 的时钟输入是一个“门控或”结构,允许其中一个输入端作为低有效
时钟使能(CLKINH)输入。CLK 和 CLKINH 的引脚分配是独立的并且在必要时,为了
布线的方便可以互换。只有在 CLKINH 为低时,才允许 CLK 由低转高,QH 串行输出。
在 S/L 上升沿来临之前,CLK 或者 CLKINH 应当置高,以防止数据在 S/L 的活动状态
发生位移。
上图为 74HC165 芯片的引脚分布,对应上图的真值表如下:
具体时序图如下:
实验测试
连线:P0 口接 JP71 ,P1.1~P1.3 分别接 JP47,JP74 连接到 JP48 的 IN0-IN3
实验现象:四位按键控制,数码管显示哪个按键按下。
代码分析
/********************************************************
* 程序功能:利用165实现四位按键并行输入串行输出到MCU,
* 最终显示到数码管
* 程序连线:P0口接JP71 ,P1.1~P1.3分别接JP47,JP74连接
* 到JP48的IN0-IN3
*******************************************************/
#include <intrins.h>
#include "hal.h"
#ifndef FOSC // 晶振
#define FOSC 12000000L
#endif
#define DATA P0
unsigned char code led[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x00, 0x40
}; // 显示段码值0~F
bit flag;
sbit HC165_CK = P1^1;
sbit HC165_SL = P1^2;
sbit HC165_QH = P1^3;
unsigned char Temp, key, num;
/*******************************************************
* 函数名称:Timer0Init()
* 函数功能:定时器0初始化函数 10毫秒@12MHz
* 入口参数:无
* 返回参数:无
********************************************************/
void Timer0Init(void)
{
TIMER_CLK_DIV(0, 12); // 定时器时钟12T模式
TIMER_TIME(0); // 设置定时器0定时模式
TIMER_MODE(0, 0); // 设置定时器0模式0
TL0 = 0x00; // 设置定时初值
TH0 = 0xDC; // 设置定时初值
CLR_TIMER_FLAG(0); // 清除TF0标志
}
/*******************************************************
* 函数名称:Display()
* 函数功能:数码管显示
* 入口参数:Num
* 返回参数:无
********************************************************/
void Display(unsigned char Num)
{
DATA = led[Num]; // 数码管显示
}
/*******************************************************
* 函数名称:HC165()
* 函数功能:165接收
* 入口参数:无
* 返回参数:Temp,即接收值
********************************************************/
unsigned char HC165(void)
{
unsigned char i;
unsigned char Temp;
HC165_CK = 1;
HC165_SL = 0; // HC165读按键
_nop_(); _nop_(); _nop_();
HC165_SL = 1; // 暂停HC165读按键
Temp = 0;
for (i = 0; i < 8; i++) {
Temp <<= 1;
if (HC165_QH) {
Temp = Temp | 0x01;
}
HC165_CK = 0; // 时钟低
_nop_();
_nop_(); _nop_(); // 先接收高位
HC165_CK = 1; // 时钟高,上升沿下一个数据移出
_nop_();
}
HC165_CK = 0;
return Temp;
}
/*******************************************************
* 函数名称:main()
* 函数功能:程序主函数
********************************************************/
void main()
{
P0M0 = 0xff;
P0M1 = 0x00;
Timer0Init(); // 初始化定时器
TIMER_RUN(0, START); // 定时器0开始计时
TIMER_INT_EN(0, ON); // 开启定时器0中断
INT_GLOBAL_ENABLE(ON); // 开启全局中断
Display(0);
while (1) {
if (flag) {
flag = 0;
if (key == 0x0e) { // 如果第一个按键按下,数码管显示1,下同
Display(1);
} else if (key == 0x0d) {
Display(2);
} else if (key == 0x0b) {
Display(3);
} else if (key == 0x07) {
Display(4);
}
}
}
}
/*******************************************************
* 函数名称:Timer0_ISR()
* 函数功能:定时器0中断服务程序
* 入口参数:无
* 返回参数:无
********************************************************/
void Timer0_ISR() interrupt 1 using 1
{
key = HC165();
flag = 1;
}
流程图
|
|