×
单片机 > 单片机程序设计 > 详情

STM32学习第一周之 按键矩阵

发布时间:2020-05-30 发布时间:
|

添加一个矩阵键盘,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;

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会