STM32三线检测八个按键(74HC165)

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


STM32 使用2个 74HC595 级联控制6位共阳极数码管显示时钟,74HC595三个引脚SH-CP,DS,ST-CP分别连接STM32103C8T6,PAO,PAI,PA2;蜂鸣器电路使用PA10(GPIO口),高电平(5V)截止,低电平(0V)导通;DS1302实时时钟电路通过SPI接口与STM32通信,SCLK、IO、RST引脚分别连接至PC2、PC1、PC0;确保断电后时间数据持续保存。按键电路GPIO口使用PA12,PA13,PA14,NRST(4个独立按键(MODE、ADJ、SET,IWDG)连接至PA12,PA13,PA14,NRST采用10kΩ上拉电阻与0.1μF电容构成硬件消抖电路。功能扩展设计 模式切换与功能分配 短按MODE键:循环切换显示模式(时间 → 日历 → 闹钟时间 → 时间)。 长按MODE键(>1s):进入闹钟开关状态,数码管显示“On”或“Off”,通过ADJ键切换开关。 短按ADJ键:在校时或闹钟设置模式下切换调整位(时→分→秒)。 长按ADJ键(>0.5s):快速递增当前选中位数值。 短按SET键:确认当前设置并退出至正常模式。 长按IWDG键:按下按键电容充电产生低电平脉冲触发复位,按下时强制拉低NRST电平。硬件复位逻辑结合看门狗定时器(IWDG) 闹钟设置流程 步骤1:短按MODE键切换至“闹钟时间”显示模式(显示“AL-HH:MM”)。 步骤2:长按ADJ键进入闹钟时间编辑状态,数码管当前调整位(小时或分钟)闪烁。 步骤3:短按ADJ键切换调整位,长按ADJ键快速调整数值(0-23小时,0-59分钟)。 步骤4:短按SET键保存闹钟时间至DS1302的RAM区域(地址0x10-0x11),退出编辑模式。 时间校准增强 进入校时:长按ADJ键3秒,进入时间校准模式,数码管显示“CAL”提示。 调整逻辑: 短按ADJ键循环选择调整项:年 → 月 → 日 → 时 → 分 → 秒。 长按ADJ键以10为单位快速递增(如月份从1→12循环)。 保存退出:短按SET键将调整后的时间写入DS1302并同步系统时间。 硬件电路实现 按键接口:PA0(MODE)、PA1(ADJ)、PA2(SET)配置为上拉输入,硬件消抖电路(10kΩ上拉电阻 + 0.1μF电容)。 状态指示:通过数码管闪烁(500ms周期)提示当前编辑状态,如闹钟设置时小时位闪烁。
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值