一个按键控制一个LED,搞不定
{:cry:}/******************** IO¿ÚÅäÖÃ ********************/
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //½á¹¹¶¨Òå
GPIO_InitStructure.Pin= GPIO_Pin_3|GPIO_Pin_7; //Ö¸¶¨Òª³õʼ»¯µÄIO, GPIO_Pin_0 ~ GPIO_Pin_7, »ò²Ù×÷
GPIO_InitStructure.Mode = GPIO_PullUp; //Ö¸¶¨IOµÄÊäÈë»òÊä³ö·½Ê½,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //³õʼ»¯
P0_PULL_UP_ENABLE(S1);
}
void main(void){
EAXSFR(); /* À©Õ¹¼Ä´æÆ÷·ÃÎÊʹÄÜ */
GPIO_config();
while(1)
{
if(S1==0&&key_flag==0)
{delay_ms(5);
if(S1==0&&key_flag==0)
{
key_flag=1;
P33=0;
}
}
if(!S1&&key_flag==1)
{
delay_ms(5);
if(!S1&&key_flag==1)
{
key_flag=0;
P33=1;
}
}
}
}
现在出现问题,有时候按键抬起等灭,有时候抬起按键等不灭,简单不能在简单的程序了{:cry:},
本帖最后由 soma 于 2024-6-15 18:18 编辑
用else if判断 S1==0 与 !S1 是相同的功能,都是判断 S1 是否为 0
建议用相同的用法 if(S1==0) 与 if(S1==1)
或者:if(!S1) 与 if(S1) 没有按键释放检测,如果按键差会造成重复触发,可以在if判断完后面加个while(!S1);等待按键释放在执行判断。不然一直卡在等待按键释放。 觉得可能还是抖动的锅 你这是用的库函数吧{:5_278:} 寄存器会玩了???? stc32库我还真不会 本帖最后由 lezjin 于 2024-6-17 18:38 编辑
while(1)
{
if(S1==0&&key_flag==0)
{ delay_ms(5);
if(S1==0&&key_flag==0)
{
key_flag=1;
P33=0;
}
}
if(!S1&&key_flag==1)
{
delay_ms(5);
if(!S1&&key_flag==1)
{
key_flag=0;
P33=1;
}
}
}
你的代码缩进看着有点晕,S1是定义的管脚吗?
你的逻辑有点问题, if(S1==0&&key_flag==0)判断后 key_flag=1;
随后跳进if(!S1&&key_flag==1),然后 key_flag=0;
然后再循环 if(S1==0&&key_flag==0)判断后 key_flag=1;
再跳进if(!S1&&key_flag==1),然后 key_flag=0;
..........如此循环,程序到哪里停,全靠运气
不知道你的按键目的是啥,给两个代码给你参考
while(1)
{
P33=S1;//按下亮,放手灭
}
while(1)
{
if(!S1)
{
delay_ms(5);
if(!S1)
{
if(key_flag==0)
{
key_flag=1;
P33=!P33;//按下取反
}
}
}else{
key_flag=0;
}
} Lkck8210 发表于 2024-6-18 13:28
不知道你的按键目的是啥,给两个代码给你参考
这段代码也有点问题,竟然按下按键取反就没必要标识位了。也就是else也可以去掉。然后最后加while(!S1)等待按键释放。不然还是很容易连击。
页:
[1]