历史上的今天
今天是:2025年08月19日(星期二)
2019年08月19日 | STM32学习第一周之 按键矩阵
2019-08-19 来源:eefocus
添加一个矩阵键盘,STM32 检测到不同按键按下,实现不同功能:
键 1-7 按下,依次点亮红、绿、蓝、黄、青、紫、白
键 8-14 按下,依次熄灭红、绿、蓝、黄、青、紫、白
键 15 按下,蜂鸣器响 ; 键 16 按下,蜂鸣器不响
如有好的优化建议,还请不吝赐教
直接上代码
keypad.h
#include "sys.h"
#ifndef _KeyPad_H
#define _KeyPad_H
void KeyInit(void);
//判断是否有键按下u8
u8 KeyDown(void);
//矩阵按键扫描,返回一个键值
u8 KeyCheck(void);
//功能实现
void KeySwitch(void);
#endif`
keypad.c
#include "keypad.h"
#include "stm32f10x.h"
#include "delay.h"
#include "RGBLED.h"
#include "BEEP.h"
void KeyInit(void)//按键初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
u8 KeyDown(void)
{
if((GPIO_ReadInputData(GPIOA) & 0xf0) != 0x0)//判断是否有键按下
{
return 1;//keydown
}
else return 0;
}
u8 KeyCheck(void)
{
if(KeyDown())
{
delay_ms(10);//消抖10ms
if(KeyDown())
{
u8 KeyValue = 0;
GPIO_SetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
if (KeyDown())
{
switch(GPIO_ReadInputData(GPIOA) & 0xf0)
{
case (0x10): KeyValue = 1; break;
case (0x20): KeyValue = 4; break;
case (0x40): KeyValue = 7; break;
case (0x80): KeyValue = '*'; break;
}
}
GPIO_SetBits(GPIOA,GPIO_Pin_1);
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);
if (KeyDown())
{
switch(GPIO_ReadInputData(GPIOA) & 0xf0)
{
case (0x10): KeyValue = 2; break;
case (0x20): KeyValue = 5; break;
case (0x40): KeyValue = 8; break;
case (0x80): KeyValue = 0; break;
}
}
GPIO_SetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);
if (KeyDown())
{
switch(GPIO_ReadInputData(GPIOA) & 0xf0)
{
case (0x10): KeyValue = 3; break;
case (0x20): KeyValue = 6; break;
case (0x40): KeyValue = 9; break;
case (0x80): KeyValue = '#'; break;
}
}
GPIO_SetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_0);
if (KeyDown())
{
switch(GPIO_ReadInputData(GPIOA) & 0xf0)
{
case (0x10): KeyValue = 'A'; break;
case (0x20): KeyValue = 'B'; break;
case (0x40): KeyValue = 'C'; break;
case (0x80): KeyValue = 'D'; break;
}
}
return KeyValue;
}
}
return 20; //这里不能返回0,0已经作为按键的返回值
}
void KeySwitch(void)
{
switch(KeyPad_Check())
{
case 1:RGBLED_Display( RED, 1);break;
case 2:RGBLED_Display( GREEN, 1);break;
case 3:RGBLED_Display( BLUE, 1);break;
case 4:RGBLED_Display( YELLOW, 1);break;
case 5:RGBLED_Display( NAVY, 1);break;
case 6:RGBLED_Display( PURPLE, 1);break;
case 7:RGBLED_Display( WHITE, 1);break;
case 8:RGBLED_Display( RED, 0);break;
case 9:RGBLED_Display( GREEN, 0);break;
case '*':RGBLED_Display( BLUE, 0);break;
case 0: RGBLED_Display( YELLOW, 0);break;
case '#':RGBLED_Display( NAVY, 0);break;
case 'A':RGBLED_Display( PURPLE, 0);break;
case 'B':RGBLED_Display( WHITE, 0);break;
case 'C': BEEP = 0;break;
case 'D': BEEP = 1;break;
}
}
史海拾趣
|
希望高手们帮帮忙先谢谢了!要求如下: 1 能够完成一个人反应速度的测试工作,并将结果显示在LED数字显示屏上。 2 程序开始时亮黄灯进入准备状态,被测试者按一次按钮则黄灯灭,开始进行测试。 3 每一个测试完成 ...… 查看全部问答> |
|
最近在论坛里发现很多帖子的资源包含多个附件,而这些附件都是一个文件分成多个的,下载时会连续扣调芯币,这样的话论坛中大部分人几乎无法负担。 这种情况,建议论坛能不能改一下,在一个帖子里的附件下载只扣一次芯币,其他附件就不用扣了。… 查看全部问答> |
|
串口通信的第一种实现方案:半双工通信方式;这适用于:下位机需要等待上位机的回复之后,方可继续发送下一个数据包的应用场合。在大多数的串口书籍中,串口通信的具体实现均是采用的该方案;但功能太简化、代码不细致。在本书中,全面考虑了菜单 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 刚刚做了下实验,看看调整供电电压对nokia5110液晶显示屏的影响 这个显示屏由于比较便宜,又是点阵的,所以用的比较多,我虽然老早就用了,但是一直有点疑问放在心上,就是其参数设定问题 1 ...… 查看全部问答> |




