【野火启明6M5开发板体验】流水灯 - 野火科技 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)
前面介绍了如何新建工程、烧录等。今天使用按键来改变灯的方向。
工程配置
按键原理图:
根据上图,按键分别接到了P004、P005上。
将P004,P005配置为输入模式。
代码书写
在src目录下面新建 key、led两个文件夹。
分别新建bsp_led.c、bsp_led.h、bsp_key.c、bsp_ke.h,并引入工程,添加相应的头文件。
四个文件代码如下:
bsp_key.c:
#include "bsp_key.h"
#include "bsp_led.h"
void KEY_Init(void)
{
}
uint32_t R_key_read(bsp_io_port_pin_t key)
{
bsp_io_level_t state;
R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
return state;
}
uint32_t Key_Scan(bsp_io_port_pin_t key)
{
if(R_key_read(key) == BSP_IO_LEVEL_HIGH)
{
return KEY_OFF;
}
else if(R_key_read(key) == BSP_IO_LEVEL_LOW)
{
do
{
R_key_read(key);
} while (BSP_IO_LEVEL_LOW == R_key_read(key));
}
return KEY_ON;
}
bsp_key.h:
#ifndef __BSP_KEY_H
#define __BSP_KEY_H
#include "hal_data.h"
#define KEY_ON 1
#define KEY_OFF 0
#define KEY_SW2_PIN BSP_IO_PORT_00_PIN_04
#define KEY_SW3_PIN BSP_IO_PORT_00_PIN_05
void KEY_Init(void);
uint32_t R_key_read(bsp_io_port_pin_t key);
uint32_t Key_Scan(bsp_io_port_pin_t key);
#endif
bsp_led.c
#include "bsp_led.h"
void LED_Init(void)
{
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
bsp_led.h:
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "hal_data.h"
#define LED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW)
#define LED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_LOW)
#define LED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW)
#define LED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH)
#define LED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_LEVEL_HIGH)
#define LED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH)
#define LED1_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF)
#define LED2_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_03 & 0xFF)
#define LED3_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_04 & 0xFF)
void LED_Init(void);
#endif
注 以上的代码为野火开发板的例程。
添加hal_entry的代码如下:
void hal_entry(void)
{
int key_sta = 0;
while(1)
{
if( Key_Scan(KEY_SW2_PIN) == KEY_ON )
{
key_sta=0;
}
if( Key_Scan(KEY_SW3_PIN) == KEY_ON )
{
key_sta =1;
}
if(key_sta =0)
LED1_ON;
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED2_ON;
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED3_ON;
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED1_OFF;
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED2_OFF;
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED3_OFF;
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
} else{
LED1_ON;LED2_ON;LED3_ON;
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
LED1_OFF;LED2_OFF;LED3_OFF;
R_BSP_SoftwareDelay(100, BSP_DELAY_UNITS_MILLISECONDS);
}
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
下载到开发板后,按sw2,就会走流水灯,按sw3就会闪灯。
注意 由于这个程序是阻塞式的流水灯,所以按键有时要按很久才有效果,所以这个程序只是检测一下检测按键的输入。需要灵敏的检测需要用的按检的外部中断来实现。下一集将引入中断检测。