高级会员

- 积分
- 935
- 金钱
- 935
- 注册时间
- 2017-12-11
- 在线时间
- 196 小时
|
1金钱
本帖最后由 wlq390934605 于 2018-9-13 14:43 编辑
矩阵键盘, 发现很多坛友在问按键的问题, 就来发个;;
平台STM32 F103, 普中HC6800EM3, 普中最新F103开发板;
;
首先说明矩阵按键原理: 矩阵键盘就像踩泥坛, 一踩一个坑, 每踩必有坑;
;
使用要求: 矩阵键盘不宜, 外接, 内接 任何上, 下拉电阻, 电容, 线路不宜过长(5m, 10m), 触点不宜过大(容性), 不宜过小(针眼那么大), 更不能有漏电流;
;
;
======================================================;
======================================================;
#include "stm32f10x.h"
#include "KEY_Driver.h"
/*******************************************************/
/****delay_key(专用)****/
void delay_key(u16 num)
{
for(num;num>0;num--);
}
/*******************************************************/
/****KEY_SCAN****/
u8 KEY_Scan(void)
{
u8 KEY_SData = 0x00;
GPIOB -> CRL = 0x33333333;GPIOB -> ODR = 0xffff; //GPIOB 复位引脚; 并恢复原状;
GPIOB -> ODR = 0xf0ff;delay_key(300); //置位,等待引脚电荷分布稳定
GPIOB -> CRH = 0x33338888; //PB0-PB3 推挽_50M(0x3); PB4-PB7 浮空_输入(0x4);
// RCC -> APB2RSTR |= 0x0008;RCC -> APB2RSTR &= ~0x0008; //GPIOB 复位 清除复位; (普中方式无法通过测试)
// GPIOB -> ODR = 0xf0ff;delay_key(200); //置位,等待状态判定;
KEY_SData = (((GPIOB->IDR)>>8)&0x0f);
GPIOB -> CRL = 0x33333333;GPIOB -> ODR = 0xffff; //GPIOB 复位引脚; 并恢复原状;
/*****************/
GPIOB -> ODR = 0x0fff;delay_key(300); //置位,等待引脚电荷分布稳定
GPIOB -> CRH = 0x44443333; //PB0-PB3 浮空输入(0x4); PB4-PB7 推挽_50M(0x3);
// RCC -> APB2RSTR |= 0x0008;RCC -> APB2RSTR &= ~0x0008; //GPIOB 复位 清除复位; (普中方式无法通过测试)
// GPIOB -> ODR = 0x0fff;delay_key(200); //置位,等待状态判定;
KEY_SData |= (((GPIOB->IDR)>>8)&0xf0);
GPIOB -> CRL = 0x33333333;GPIOB -> ODR = 0xffff; //GPIOB 复位引脚; 并恢复原状;
return KEY_SData;
}
/*******************************************************/
/***KEY_DOWN***/
u8 KEY_DOWN(void)
{
u8 KEY_Status=0x00;
KEY_Status = KEY_Scan();
if(KEY_Status==0x00);
return KEY_Status;
}
/********************************************************/
/****KEY_****/
|
|