电赛中由于移动设备受限制,所以按键就成了我们比赛中比较常用的外设,在此备赛期间记录一下如何正确使用按键。
首先,我使用的板子是无名创新家的板子,板载了一个五向按键,以及五个普通按键,所以比赛时应该是不需要再去接按键了。
话不多说上代码!(用的是例程加以学习)
#include "ti_msp_dl_config.h"
void delay_ms(uint16_t ms)
{
while(ms--)
delay_cycles(CPUCLK_FREQ/1000);
}
int main(void)
{
SYSCFG_DL_init(); //芯片资源初始化,由SysConfig配置软件自动生成
while(1)
{
if(DL_GPIO_readPins(KEY_PORT,KEY_S1_PIN))//按下为高电平
{
delay_ms(10);
if(DL_GPIO_readPins(KEY_PORT,KEY_S1_PIN))//延时之后再次检测
{
while(DL_GPIO_readPins(KEY_PORT,KEY_S1_PIN));//等待按键释放
DL_GPIO_togglePins(PORTB_PORT,PORTB_RGB_R_PIN);//电平翻转驱动LED
}
}
// if(!DL_GPIO_readPins(PORTB_PORT,PORTB_S2_PIN))//按下为低电平
// {
// delay_ms(10);
// if(!DL_GPIO_readPins(PORTB_PORT,PORTB_S2_PIN))//延时之后再次检测
// {
// while(!DL_GPIO_readPins(PORTB_PORT,PORTB_S2_PIN));//等待按键释放
// DL_GPIO_togglePins(PORTB_PORT,PORTB_RGB_G_PIN);//电平翻转驱动LED
// }
// }
if( DL_GPIO_readPins(PORTB_PORT, PORTB_S2_PIN) > 0 )
{
DL_GPIO_clearPins(PORTB_PORT,PORTB_RGB_G_PIN); //LED控制输出高电平
}
else//如果PA18引脚为低电平
{
DL_GPIO_setPins(PORTB_PORT,PORTB_RGB_G_PIN);//LED控制输出低电平
}
if(!DL_GPIO_readPins(PORTB_PORT,PORTB_S3_PIN))//按下为低电平
{
delay_ms(10);
if(!DL_GPIO_readPins(PORTB_PORT,PORTB_S3_PIN))//延时之后再次检测
{
while(!DL_GPIO_readPins(PORTB_PORT,PORTB_S3_PIN));//等待按键释放
DL_GPIO_togglePins(PORTB_PORT,PORTB_RGB_B_PIN);//电平翻转驱动LED
}
}
delay_ms(100);
DL_GPIO_togglePins(GPIO_LEDS_PORT,GPIO_LEDS_USER_TEST_PIN);//电平翻转驱动LED
}
}
在这里我分别实验了几种按键的扫描方式,值得注意的是在图形化配置中的几个小细节,比如说在配置五向按键的时候不同普通按键需要下拉电阻,而是上拉电阻。(由于五向按键板载在PB口)
还有一点就是电平的读取,使用函数 uint32_t DL_GPIO_readPins(GPIO_Regs* gpio, uint32_t pins)
可以读取引脚的状态。
需要输入两个参数:
gpio:
读取的GPIO端口。G3507芯片有GPIOA,GPIOB两个端口,这里按键一(BSL)选择GPIOA,按键二(K1)是连接PB21,五向按键之一的上按键连接PB12,由于都是板载资源不多解释
。
pins:
读取的引脚号。根据我们sysconfig配置的引脚名称,写入。
它会返回的参数:
类型为uint32_t
,返回的是对应引脚的状态位。所以我们就可以通过他的返回值是否大于0来判断,例程中使用的是通过普通的方法也可以实现。 个人认为这么写更加严谨:
if( DL_GPIO_readPins(PORTB_PORT, PORTB_S2_PIN) > 0 )
OK