一、引脚说明:
Pair引脚为P11引脚
二、设计思路:
1、硬件设计思路:
硬件电路说明:该电路是是外部上拉电路。
当按键抬起时,单片机采集到的电平为高电平(1)。
当按键按下时,单片机引脚采集到的电平为低电平(0)。
2、软件设计思路:
采取时间片轮询的方式,每10ms轮询一次。
三、程序设计:
1、引脚初始化:
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;//定义结构体对象
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;//选择引脚 这里是pin1
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;//选择模式为输入
GPIO_InitStruct.GPIO_Ctrl = GPIO_Control_DIG;//设置为数字量
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//不进行上下拉,电平取决于外部电压
GPIO_Init(GPIO_PORT1, &GPIO_InitStruct);//对GPIO进行设置
}
2、按键识别程序
#define KEY (GPIO_ReadInputDataBit(GPIO_PORT1,GPIO_Pin_1) == 0)//按键按下标识
unsigned int key_low = 0;//用来装载按键按下的时间
unsigned int key_task_time = 0;//用来处理按键任务的时间
unsigned char key = 0;//用来存放按键是否按下有效
unsigned char key_scan(void)
{
if(time_ms(key_task_time ,10))//10ms读取一次按键状态
{
key_task_time = get_time();//更新时间
if(KEY)//如果按键被按下
{
key_low++;//低电平的时间自增
if(key_low >= 20)//低电平的时间大于200ms,认定此次按键按下有效
{
key = 1;//按键按下有效
}
else
{
key = 0;
}
}
else key_low = 0;//低电平时间清0
}
return key;
}
3、定时器设定
这里用到的时钟是TIM41。
unsigned int task_time = 0;
void Tim41_IntervalTimer(void)//定时器设置1ms
{
TIM_InitTypeDef TIM_InitStructure;
TIM_InitStructure.TIM = TIM41; //specify the 8 channels TIM
TIM_InitStructure.TIM_Channel = TTM_Channel_0;
TIM_InitStructure.TIM_ClkDivision = TIM_CLK0_Div32768; // specify the operation clk=1khz of tim for 32Mhz fclk
TIM_InitStructure.TIM_Period[TIM_CH0_Counter] = 2; //specify the time =1*(1/1000) =1ms
TIM_InitStructure.TIM_Trigger = TIM_Trigger_Software; //specify the software trigger
TIM_InitStructure.TIM_Mode = TIM_Mode_Interval; // external event
TIM_InitStructure.TIM_StartInt = TIM_StartInt_Disable;
TIM_Init(&TIM_InitStructure);
ISR_Register(TM10_IRQn, tim41_channel0_interrupt);
}
void tim41_channel0_interrupt(void *msg)
{
task_time++;
INTC_ClearPendingIRQ(TM10_IRQn); // clear INTTM00 interrupt flag
}
unsigned char time_ms(unsigned int start, unsigned int timeout)
{
return ((unsigned int)(task_time - start) > timeout);
}
4、引用的头文件
#include "gpio.h"//引用系统的GPIO库
#include "tim.h"//引用系统的时钟库
5、main函数调用
int main()
{
unsigned char key = 0;
key_init();
Tim41_IntervalTimer();
while(1)
{
key = key_scan();
}
}