历史上的今天
今天是:2025年08月10日(星期日)
2019年08月10日 | STM32三线检测八个按键(74HC165)
2019-08-10 来源:eefocus
STM32三线检测八个按键是典型的IO扩展应用(并转串),思路和学习51单片机时一致,下面直接上图和代码!



简述:
1.74HC165使用1、2、9脚,15脚可直接接地
2.按键低电平为按下
PA1-> SL 并行数据加载
PA2-> CLK 时钟
PA3-> DAT 串行数据输出
代码:
#include "74HC165.h"
#include "delay.h"
void Init_74HC165(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = SL_PIN|CLK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PORT_74HC165, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DAT_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(PORT_74HC165, &GPIO_InitStructure);
}
u8 ReadByte_165(void)
{
u8 i,dat=0;
CLK=1;
Latch_165();
for(i=0;i<8;i++)
{
dat=dat<<1;
if(DAT==1)
dat=dat+1;
CLK=0;
delay_us(1);
CLK=1;
}
CLK=0;
return ~dat;
}
void Latch_165(void)
{
SL=0;
delay_us(1);
SL=1;
}
u8 Scan_Key(void) //该函数仅支持1次按下1个按键
{
u8 key;
key=ReadByte_165();
if(key==0)
;
else
{
switch(key)
{
case 1:
key=1;
break;
case 2:
key=2;
break;
case 4:
key=3;
break;
case 8:
key=4;
break;
case 16:
key=5;
break;
case 32:
key=6;
break;
case 64:
key=7;
break;
case 128:
key=8;
break;
default:
key=0;
break;
}
}
return key;
}
头文件:
#ifndef __74HC165_H
#define __74HC165_H
#include "sys.h"
#define PORT_74HC165 GPIOA
#define SL PAout(1) //SL
#define SL_PIN GPIO_Pin_1
#define CLK PAout(2) //CLK
#define CLK_PIN GPIO_Pin_2
#define DAT_PIN GPIO_Pin_3
#define DAT GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)//DAT
void Init_74HC165(void);
u8 ReadByte_165(void)
void Latch_165(void);
u8 Scan_Key(void);
#endif
史海拾趣
|
我对嵌入式软件开发的时间也不是很长,仅仅只有5年,算不上高手,也不是老手只能算是5岁的老菜鸟 ,在前面的3年里没有高人指点,靠着自己摸索也写了不少的程序吧,那时侯我没有想过要写出容易理解 和维护以及移植的问题,仅仅想着如何把这个功能 ...… 查看全部问答> |
|
目录: 一,集成电路的基本制造工艺 二,集成电路中的晶体管及其寄生效应 三,集成电路中的无源元件 四,晶体管-晶体管逻辑电路 五,发射极耦合逻辑电路 六,集成注入逻辑电路 七,MOS反相器 八,MOS基本逻辑单元 九,MOS逻辑功能部件 ...… 查看全部问答> |
|
这个论坛真的相当不错~~又遇到棘手问题,再次求教各位大哥 我做的是用2812去实现直接转矩控制去控制电机,通过查表方式得到矢量 现在我做了个测试,按我的要求强制输出上桥臂依次是 011,接着输出001,然后101,然后是111,然后是110,然后是0 ...… 查看全部问答> |
|
使用SetDevicePower开启wifi,几秒钟之后自动关闭 string path = \"{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\\\\"; string deviceName=\"SDIO86881\"; DevicePowerNotify(path2 + deviceName, DevicePowerState.FullOn, POWER_NAME); ...… 查看全部问答> |
|
大家好,如题啦! 我把自己搜到点东西说说啊。 1:据说wince5.0自带显示电源电量的,但是我弄不出来啊,有人说是在cplmain.cpl这个文件中修改什么的,他没说清楚,我也没搞懂! 懂的麻烦说具体些哈 2:有些人说AP是自己做的,AP是 ...… 查看全部问答> |
|
怎么这个活动办了这么久,开始见有人驱动MMA7260成功了,也没有见驱动MMA7455驱动成功啊。 另:希望MMA7260驱动成功的同志分享一下代码,多谢了。 … 查看全部问答> |
|
在这里欢迎大家晒出自家的秘集(可以是前人的,更欢迎自创的独门武功),让群雄共舞。 活动主题: 【电容之宝典入库篇】——网友们可以推荐并上传关于电容的优秀文献:制造工艺 (材料,结构,原理,测试原理)、选择应用 (容量,耐 ...… 查看全部问答> |
|
有人用过CCS5.2来开发LaunchPad吗?今天我试了一下,发现点击debug时,报这样的错误: could not find MSP-FET430UIF on specified com port.但是我不知道如何设置端口呢?论坛中的教程很多好像是用4.x版本的吧,求指点!… 查看全部问答> |




