前面已介绍过74HC165的工作原理,接下来编写用51单片机来驱动这个片子的代码并用Proteus做了仿真,这次就不使用stm32来驱动了,因为仿真软件里没有ST的单片机。
写74HC165的驱动也不难,只需根据芯片手册中的时序来编写代码,51单片机的代码已贴出,代码的注释也描述很清楚了。
#ifndef _74HC165_H
#define _74HC165_H
#include "allhead.h"
sbit HC165_PL = P2^5; //PL 并行数据输入使能,低电平有效
sbit HC165_CLK = P2^7;//CP 时钟,上升沿触发
sbit HC165_OUT = P2^4; //Q7 串行数据输出
sbit HC165_CE = P2^6;//CE 时钟使能,低电平有效
void _74hc165_init(void);
uchar _74hc165_read_byte(void);
#endif
#include "74hc165.h"
//初始化74hc165
void _74hc165_init(void)
{
HC165_CE = 0; //初始化使能时钟,后面就不需再使能
HC165_PL = 1; //PL拉高,不读取按键状态
HC165_CLK = 1; //时钟拉高,便于产生上升沿
}
//74hc165读取按键状态,并行输入转串行输出
uchar _74hc165_read_byte(void)
{
uchar i;
uchar temp = 0;
HC165_PL = 0; //PL拉低,读取按键状态
HC165_PL = 1; //PL拉高,停止按键读取
if(HC165_OUT == 1)//等于1即并行输入D7引脚的按键被按下
temp |= 0x01; //最低位置1表示按键被按下,反之则按键没被按下
for(i = 0; i < 7; i ++) //循环7次,依次把次高位移到最高位
{
temp = temp << 1;
HC165_CLK = 0; //HC165_CLK = 0 ——> HC165_CLK = 1 产生上升沿,次高位D(n-1)移到高位D(n)
_nop_();
_nop_();
HC165_CLK = 1;
if(HC165_OUT == 1)
temp |= 0x01;
}
return temp; //返回当前按键状态
}
仿真图片:
仿真文件下载:
链接:https://pan.baidu.com/s/1f5y2GUcva1vJzet3ENe1Xg
提取码:4xcu