版权声明:博主的博客不值钱随便转载但要注明出处 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;
}
}
}