按键实验里,例程是用位带操作控制LED的翻转,请问直接用库函数怎么操作呢??

2019-07-21 03:41发布

int main(void)
{
        u8 a,b;
         vu8 key=0;        
        delay_init();                     //延时函数初始化         
         LED_Init();                             //LED端口初始化
        KEY_Init();          //初始化与按键连接的硬件接口
        BEEP_Init();                 //初始化蜂鸣器端口
        LED0=0;                                        //先点亮红灯
        while(1)
        {
                 key=KEY_Scan(0);        //得到键值
                   if(key)
                {                                                   
                        switch(key)
                        {               
                                
                                case WKUP_PRES:        //控制蜂鸣器
                                //        BEEP=!BEEP;
                                a=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8);
                                if(a)        
                              GPIO_ResetBits(GPIOB,GPIO_Pin_8);        
                              else
                              GPIO_SetBits(GPIOB,GPIO_Pin_8);                                 
                                        break;
                        
                        
                                case KEY2_PRES:        //控制LED0翻转
                                        //LED0=!LED0;
                                 b=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5);
                                   if(b)        
                                GPIO_ResetBits(GPIOB,GPIO_Pin_5);        
                                 else
                                 GPIO_SetBits(GPIOB,GPIO_Pin_5);
                                  break;
                        
                        
                        
                                case KEY1_PRES:        //控制LED1翻转         
                                        LED1=!LED1;
                                        break;
                                case KEY0_PRES:        //同时控制LED0,LED1翻转
                                        LED0=!LED0;
                                        LED1=!LED1;
                                        break;
                        }
                }else delay_ms(10);
        }         
}

在历程里使用BEEP=!BEEP;LED0=!LED0;这样的位带操作LED和蜂鸣器的翻转。那么在没有正点原子SYS文件夹的情况下,只能用固件库里的函数,怎么控制状态翻转呢?
我再上面的主函数里写了前面两个,先读状态,再判断用SET 和RESET,试了下也能实现,但是感觉挺笨的,请问有没有更简洁的写法呢??~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
xuande
1楼-- · 2019-07-21 06:29
 精彩回答 2  元偷偷看……
caijie0513
2楼-- · 2019-07-21 09:33
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_5);

这样stm32f10x_gpio.c文件夹的函数。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  
  GPIOx->BSRR = GPIO_Pin;
}
xioajin
3楼-- · 2019-07-21 12:48
表示也是在考虑这个问题,不知道你解决了没?期待回答
nashui_sx
4楼-- · 2019-07-21 17:36
xioajin 发表于 2019-3-31 15:56
表示也是在考虑这个问题,不知道你解决了没?期待回答

GPIO_WriteBit (LED_PORT, LED_PIN, (BitAction)((1-GPIO_ReadOutputDataBit(LED_PORT, LED_PIN))))

一周热门 更多>