在keil5中使用五向键,实现五种LED灯并编写代码
时间: 2024-03-23 15:39:18 浏览: 16
好的,下面是使用keil5中的GPIO库和中断实现五向键控制五种LED灯的示例代码:
```c
#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_exti.h>
#include <stm32f10x_rcc.h>
#define LED1_PIN GPIO_Pin_0
#define LED2_PIN GPIO_Pin_1
#define LED3_PIN GPIO_Pin_2
#define LED4_PIN GPIO_Pin_3
#define LED5_PIN GPIO_Pin_4
#define KEY_UP_PIN GPIO_Pin_5
#define KEY_DOWN_PIN GPIO_Pin_6
#define KEY_LEFT_PIN GPIO_Pin_7
#define KEY_RIGHT_PIN GPIO_Pin_8
#define KEY_CENTER_PIN GPIO_Pin_9
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void LED_Control(uint16_t led_pin, uint8_t state);
void Delay(uint32_t nCount);
int main(void)
{
GPIO_Configuration();
EXTI_Configuration();
while (1)
{
// 循环检测五向键状态
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置LED引脚为输出
GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN |
LED4_PIN | LED5_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置五向键引脚为输入
GPIO_InitStructure.GPIO_Pin = KEY_UP_PIN | KEY_DOWN_PIN | KEY_LEFT_PIN |
KEY_RIGHT_PIN | KEY_CENTER_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void EXTI_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// 配置五向键引脚为中断输入
GPIO_InitStructure.GPIO_Pin = KEY_UP_PIN | KEY_DOWN_PIN | KEY_LEFT_PIN |
KEY_RIGHT_PIN | KEY_CENTER_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 EXTI Line5 - Line9
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource7);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource9);
EXTI_InitStructure.EXTI_Line = EXTI_Line5 | EXTI_Line6 | EXTI_Line7 |
EXTI_Line8 | EXTI_Line9;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// 配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void LED_Control(uint16_t led_pin, uint8_t state)
{
if (state == 0)
{
GPIO_ResetBits(GPIOA, led_pin);
}
else
{
GPIO_SetBits(GPIOA, led_pin);
}
}
void EXTI9_5_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line5) != RESET)
{
// KEY_UP按下
LED_Control(LED1_PIN, 1);
}
else if (EXTI_GetITStatus(EXTI_Line6) != RESET)
{
// KEY_DOWN按下
LED_Control(LED2_PIN, 1);
}
else if (EXTI_GetITStatus(EXTI_Line7) != RESET)
{
// KEY_LEFT按下
LED_Control(LED3_PIN, 1);
}
else if (EXTI_GetITStatus(EXTI_Line8) != RESET)
{
// KEY_RIGHT按下
LED_Control(LED4_PIN, 1);
}
else if (EXTI_GetITStatus(EXTI_Line9) != RESET)
{
// KEY_CENTER按下
LED_Control(LED5_PIN, 1);
}
EXTI_ClearITPendingBit(EXTI_Line5 | EXTI_Line6 | EXTI_Line7 | EXTI_Line8 | EXTI_Line9);
}
void Delay(uint32_t nCount)
{
for (; nCount != 0; nCount--);
}
```
以上代码仅为示例代码,具体实现可以根据实际需求进行修改。