STM32學習第一週之 按鍵矩陣

添加一個矩陣鍵盤,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;
	}
}

RGBLED_Display();這個函數在上一篇筆記中
https://blog.csdn.net/qq_43313535/article/details/90343426
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190519161146933.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMzEzNTM1,size_16,color_FFFFFF,t_70)
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/2019051916120029.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMzEzNTM1,size_16,color_FFFFFF,t_70)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章