STM32键盘-库函数

版权声明:博主的博客不值钱随便转载但要注明出处 https://blog.csdn.net/easylovecsdn/article/details/81835746

昨天晚上老大回来看我频繁使用寄存器写程序给出指点,告诉我尽量使用库函数,少使用寄存器,毕竟寄存器在后面使用的时候还要一个一个查找手册可能太麻烦了,nice!

这次使用库函数操作键盘,很基础的实验,其中掺杂了之前的蜂鸣器和LED内容。

感觉基础键盘实验比较有价值的还是那个键盘操作函数,以下给出标准模板,mode作为参数时置0为不支持连续摁键,置1时为支持连续摁键。

//摁键函数,0为不支持连摁,1为支持连摁
u8 Key_Scan(u8 mode) 
{
    static u8 flag = 1;
    if(mode) flag = 1;
    if(flag && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 1)) {
        flag = 0;
        if(KEY0 == 0) return 1;
        else if(KEY1 == 0) return 2;
        else if(KEY2 == 0) return 3;
        else if( WK_UP == 1) return 4;
    } else if(KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 0) flag = 1;
    return 0;
}

其余的无非是RCC时钟使能、GPIO初始化、各个功能的初始化、执行相关功能的操作,以下主要给出key.h、key.c、main.c

1.key.h

#ifndef __KEY_H
#define __KEY_H
#include "sys.h"

#define KEY0 PEin(4)
#define KEY1 PEin(3)
#define KEY2 PEin(2)
#define WK_UP PAin(0)

#define KEY0_PRES 1
#define KEY1_PRES 2
#define KEY2_PRES 3
#define WKUP_PRES 4


void key_init(void);

u8 Key_Scan(u8 mode);

#endif

2.key.c

#include "key.h"

void key_init()
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_Init(GPIOE, &GPIO_InitStructure);
    GPIO_SetBits(GPIOE, GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);


    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
}

//摁键函数,0为不支持连摁,1为支持连摁
u8 Key_Scan(u8 mode) 
{
    static u8 flag = 1;
    if(mode) flag = 1;
    if(flag && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 1)) {
        flag = 0;
        if(KEY0 == 0) return 1;
        else if(KEY1 == 0) return 2;
        else if(KEY2 == 0) return 3;
        else if( WK_UP == 1) return 4;
    } else if(KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 0) flag = 1;
    return 0;
}


3.main.c

#include "led.h"
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "beep.h"
#include "key.h"

int main()
{
	u8 temp;
	delay_init(168);
	LED_Init();
	key_init();
	beep_init();
	
	while(1) {
		temp = Key_Scan(0);
		switch(temp) {
			case KEY0_PRES : 
				LED0 = !LED0; 
				break;
			case KEY1_PRES : 
				LED1 = !LED1;
				break;
			case KEY2_PRES :
				LED0 = !LED0; 
				LED1 = !LED1;
				break;
			case WKUP_PRES :
				BEEP = !BEEP;
				break;
			default : 
				delay_ms(20);
				continue;
		}
	}

}

猜你喜欢

转载自blog.csdn.net/easylovecsdn/article/details/81835746