新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2022-1-3
- 在线时间
- 4 小时
|
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;
}
这是调试时候的标志位情况

|
|