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