论坛大神
  
- 积分
- 1850
- 金钱
- 1850
- 注册时间
- 2013-4-15
- 在线时间
- 163 小时
|
5金钱
/*****************************key.c****************************************/
/********************
*按键初始化子函数*
********************/
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*GPIOC时钟使能*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/*初始化GPIOC0/GPIOC1/GPIOC2,推挽输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
/*初始化GPIOC3/GPIOC4/GPIOC5,上拉输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
}
/***********************************************
*按键扫描子函数*
*返回值:键值*
***********************************************/
u8 KEY_Scan(void)
{
u8 KeyVal = 0;
GPIO_Write(GPIOC,0xFFFE);
if((GPIOC->IDR & 0x0038) != 0x0038)
{
delay_ms(5);
if((GPIOC->IDR & 0x0038) != 0x0038)
{
switch((GPIOC->IDR & 0x0038))
{
case 0x0030: KeyVal = 1;break;
case 0x0028: KeyVal = 2;break;
case 0x0018: KeyVal = 3;break;
}
while((GPIOC->IDR & 0x0038) != 0x0038);
}
}
GPIO_Write(GPIOC,0xFFFD);
if((GPIOC->IDR & 0x0038) != 0x0038)
{
delay_ms(5);
if((GPIOC->IDR & 0x0038) != 0x0038)
{
switch((GPIOC->IDR & 0x0038))
{
case 0x0030: KeyVal = 4;break;
case 0x0028: KeyVal = 5;break;
case 0x0018: KeyVal = 6;break;
}
while((GPIOC->IDR & 0x0038) != 0x0038);
}
}
GPIO_Write(GPIOC,0xFFFB);
if((GPIOC->IDR & 0x0038) != 0x0038)
{
delay_ms(5);
if((GPIOC->IDR & 0x0038) != 0x0038)
{
switch((GPIOC->IDR & 0x0038))
{
case 0x0030: KeyVal = 7;break;
case 0x0028: KeyVal = 8;break;
case 0x0018: KeyVal = 9;break;
}
while((GPIOC->IDR & 0x0038) != 0x0038);
}
}
return KeyVal;
}
/********************************key.h**********************************/
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32f10x.h"
#define PC3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
#define PC4 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)
#define PC5 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
#define KEY_UpdateFont 1
#define KEY_Up 2
#define KEY_Plus 3
#define KEY_Left 4
#define KEY_MakeSure 5
#define KEY_Right 6
#define KEY_Cancel 7
#define KEY_Down 8
#define KEY_Subtract 9
//
void KEY_Init(void); //按键初始化子函数
u8 KEY_Scan(void); //按键扫描子函数
#endif
/*************************************time.c********************************/
#include "time.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
#include "led.h"
#include "key.h"
//定时器3中断初始化函数
//arr:自动重装载值(0~65535)
//psc:预分频值(0~65535)
void TIM3_Init(u16 arr, u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //定时器3时钟使能
TIM_TimeBaseInitStructure.TIM_Prescaler = psc; //预分频值
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计时
TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割 tDTS= tCK_INT
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //开定时器3更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //定时器3通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级:0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级:3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE); //开定时器3
}
u8 key;
void TIM3_IRQHandler(void) //定时器3中断服务函数
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //判断是否有更新中断
{
TIM_Cmd(TIM3, DISABLE); //关定时器3
key = KEY_Scan();
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清更新中断标志位
TIM_Cmd(TIM3, ENABLE); //开定时器3
}
/*********************************time.h*******************************/
#ifndef __TIME_H__
#define __TIME_H__
#include "stm32f10x.h"
extern u8 key;
void TIM3_Init(u16 arr, u16 psc); //定时器3中断初始化函数
#endif
|
最佳答案
查看完整内容[请看2#楼]
回复【30楼】flyaab:
---------------------------------
后来用的定时器扫描独立按键,没用定时器扫描矩阵按键了
|