OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5113|回复: 1

求助,stm32按键不灵敏,有些按键无法识别

[复制链接]

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
发表于 2022-4-25 11:53:28 | 显示全部楼层 |阅读模式
15金钱
如题,这几天调试程序发现按键按下有时候会出现无反应的情况,多按几次后才会有反应,偶尔能立刻反应。另外就是程序里对其中一个按键识别出现了问题,if语句一直进不去。KEY的程序设置是正点原子所给的例程。求助各位大佬。附上代码。//主程序代码

while(1)
        {
        //监测分析功能区
                if((open_flag==1)&&(KEY_Scan(0)==1))                        //抄读指令传送       此处按键识别不灵敏,经常没反应
                {
                        read_enable=1;
                        read();
                        for(i=0;i<8;i++)                                                        //数据发送完毕跳出循环
                        {       
                                if((USART1->SR & 0X40) == 0)
                                ;
                                USART1->DR=Tx_Buffer;
                                while ((USART1->SR & 0X40) == 0); //等待发送结束
                        }
                        read_enable=0;                        //抄读指令传送完毕,置0
                }
                if(receive_finished ==1)        //接收数据完成时,对数据进行分析提取,进入监测页面     这里的标志位是在中断里设定的
                {
                        receive_finished =0;
                        OLED_eledata(Voltage_data,Current_data,Power_data,Pf_data);
//                        input_data(test_app,Voltage_data,Current_data,Power_data,Pf_data);
                        test_app.vol=Voltage_data;
                        test_app.cur=Current_data;
                        test_app.act_power=Power_data;
                        test_app.power_factor=Pf_data;
                        test_app._class=get_class(test_app,example_name);
                        delay_ms(1000);
                        if(test_app._class!=0)
                        {
                                OLED_class(test_app._class);
                                delay_ms(1000);
                //                OLED_Clear();
                //                OLED_eledata(Voltage_data,Current_data,Power_data,Pf_data);
                                delay_ms(1000);
                                OLED_begin();
                        }
                        else
                        {
                                oled_fail();
                                delay_ms(1000);
                                OLED_Clear();
                                OLED_eledata(Voltage_data,Current_data,Power_data,Pf_data);
                                delay_ms(1000);
                                OLED_begin();
                        }
                }
                if((open_flag==1 )&(KEY_Scan(1)==3))//当处在待机页面下,按下KEY2按键。    此处一直无法实现,不知道为什么进不去。
                {
                        int m=1;
                        flag_clear(3);    //这里是将learningflag置1,其他标志位置0
                        while(learning_flag==1)
                        {
                                if(KEY_Scan(0)==4)    //KEY1按下
                                {
                                        m++;
                                        if(m>4)m=1;
                                        learning_page(m);
                                }
                                if(KEY_Scan(0)==2)  //WKUP按下
                                {
                                        m--;
                                        if(m<1)m=4;
                                        learning_page(m);
                                }
                                if((learning_flag==1 )&&(KEY_Scan(0)==3))    //如果在此界面再次按下KEY2
                                {
                                        (*(example_name+m-1))->vol=test_app.vol;
                                        (*(example_name+m-1))->cur=test_app.cur;
                                        (*(example_name+m-1))->act_power=test_app.act_power;
                                        (*(example_name+m-1))->power_factor=test_app.power_factor;
                                        learned_page();
                                        OLED_Refresh();
                                }
                        }
                        delay_ms(100);
                        OLED_begin();
                }
        }



//按键扫描    正点原子例程
void KEY_Init(void)
{
        RCC->APB2ENR|=1<<2;
        RCC->APB2ENR|=1<<4;
        RCC->APB2ENR|=1<<5;
        GPIOA->CRL &=0XFFFFFFF0;
        GPIOA->CRL|=0X00000008;
       
        GPIOC->CRH &=0XFFFFFF00;
        GPIOC->CRH |=0X00000088;
        GPIOC->ODR |=1<<8;
        GPIOC->ODR |=1<<9;
       
        GPIOD->CRL &=0XFFFFF0FF;
        GPIOD->CRL |=0X00000800;
        GPIOD->ODR=1<<2;
}
//按键处理函数
//返回按键值

u8 KEY_Scan(u8 mode)
{
        static u8 key_up=1;
        if(mode)key_up=1;
        if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
        {
                delay_ms(10);
                key_up=0;
                if(KEY0==0)
                        return 1;
                else if(KEY1==0)
                        return 2;
                else if(KEY2==0)
                        return 3;
                else if(WK_UP==1)
                        return 4;
        }
        else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
                return 0;
}

这是调试时候的标志位情况

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-1-3
在线时间
4 小时
 楼主| 发表于 2022-4-25 12:27:43 | 显示全部楼层
主要是想解决这个不灵敏的问题以及后面按键扫描无效的问题,求助大佬们,顶顶顶
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-28 05:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表