自勉工作室
设为首页  |  加入收藏
 网站首页  关于工作室  产学研用  师生团队  技能创新  升学就业  通知公告  学校首页 

【嵌入式】

当前位置: 网站首页>>技能创新>>技术园地>>嵌入式>>正文
嵌入式按键测试思路(旧)
2025-01-13 13:04  

 

单击函数

int s_key()

{

if(!K)

 {

delay(10);

if(!K)

   {

while(!K);

return 1;

   }

 }

return 0;

}

 

双击函数

int d_key()

{

if(s_key()==1)

 {

   times=0;

while(times<2)

   {

if(s_key()==1)

     {

return 2;

     }

   }

return 1;

 }

return 0;

}

主函数和中断服务函数

void main(void)

{

halBoardInit();

init();

while(1)

   {

switch(d_key())

     {

case 1:

       L1=!L1;

break;

case 2:

       L2=!L2;

     }

   }

}

 

HAL_ISR_FUNCTION(T1_ISR, T1_VECTOR)

{

   T1STAT &=~0x20;

   times++;

}

 

延时函数呼吸灯 双击呼吸/暂停 暂停后触发按键重置呼吸灯

void keep_b(uint16 a,uint16 i)//保持亮度函数

{

while(flag)

  {

     L1=1;

bdelay(a-i);

     L1=0;

bdelay(i);

if(!K)

     {

       flag=0;

     }

  }

}

 

void breath(uint16 a)//延时函数呼吸灯

{

 L2=0;

for(uint16 i=0;i<a;i++)

 {

   L1=1;

bdelay(a-i);

if(d_key()==2)

   {

keep_b(a,i);

   }

   L1=0;

bdelay(i);

if(d_key()==2)

   {

keep_b(a,i);

   }

 }

for(uint16 i=a;i>0;i--)

 {

   L1=1;

bdelay(a-i);

if(d_key()==2)

   {

keep_b(a,i);

   }

   L1=0;

bdelay(i);

if(d_key()==2)

   {

keep_b(a,i);

   }

 }

}

 

/********************MAIN************************/

void main(void)

{

halBoardInit();

init();

while(1)

   {

if(d_key()==2)

     {

       break_flag=0;

       flag=1;

     }

while(flag)

     {

breath(1000);

     }

   }

}

 

HAL_ISR_FUNCTION(T1_ISR, T1_VECTOR)

{

   T1STAT &=~0x20;

   times++;

}

上面的修改版,双击呼吸/暂停,暂停后双击恢复呼吸灯,可重复实现功能,只用修改保持呼吸函数

void keep_b(uint16 a,uint16 i)

{

while(flag)

  {

     L1=1;

bdelay(a-i);

     L1=0;

bdelay(i);

if(d_key()==2) //把按键触发的!K,改成双击判断

     {

       flag=0;

     }

  }

  flag=1; //再加个这个,让它继续跑呼吸循环

}

 

单双击长按三个效果,单击L1亮/灭,双击呼吸灯,再双击暂停,第三次双击退出,长按L1亮,L2灭,松开L1L2都亮

int s_key()//单击

{

if(!K)

 {

delay(10);

if(!K)

   {

     L1=!L1; //单击开关L1不能while(!K)兜住,不然长按不好判断

return 1;

   }

 }

return 0;

}

 

int d_key()

{

if(s_key()==1)

 {

   times=0;

while(!K)

   {

if(times>5)

     {

return 3;

     }

   }

   times=0;

while(times<2)

   {

if(s_key()==1)

     {

return 2;

     }

   }

return 1;

 }

return 0;

}

 

void bdelay(uint16 t)

{

while(t--)

 {

if(break_flag==1||flag==0)

   {

     flag=0;

break;

   }

 }

}

 

void keep_b(uint16 a,uint16 i)

{

while(flag)

  {

     L1=1;

bdelay(a-i);

     L1=0;

bdelay(i);

if(d_key()==2)

     {

       flag=0;

     }

  }

//flag=1;

}

 

void breath(uint16 a)

{

 L2=0;

for(uint16 i=0;i<a;i++)

 {

   L1=1;

bdelay(a-i);

if(d_key()==2)

   {

keep_b(a,i);

   }

   L1=0;

bdelay(i);

if(d_key()==2)

   {

keep_b(a,i);

   }

 }

for(uint16 i=a;i>0;i--)

 {

   L1=1;

bdelay(a-i);

if(d_key()==2)

   {

keep_b(a,i);

   }

   L1=0;

bdelay(i);

if(d_key()==2)

   {

keep_b(a,i);

   }

 }

}

 

/********************MAIN************************/

void main(void)

{

halBoardInit();

init();

while(1)

   {

switch(d_key())

     {

case 2:

       L2=0;

       break_flag=0;

       flag=1;

break;

case 3:

while(!K)

       {

         L1=1;

         L2=0;

       }

       L1=1;L2=1;

break;

default:

break;

     }

if(d_key()==2)

     {

       break_flag=0;

       flag=1;

     }

while(flag)

     {

breath(1000);

     }

   }

}

 

HAL_ISR_FUNCTION(T1_ISR, T1_VECTOR)

{

   T1STAT &=~0x20;

   times++;

}

 

按键改进,一个函数单双击长按

int s_key()

{

if(!K)

   {

     times=0;

while(!K)

     {

if(times>5)

       {

return 3;

       }

     }

     times=0;

while(times<2)

     {

if(!K)

       {

return 2;

       }

     }

     L1=!L1;

   }

return 0;

}

再改,单,双,三,长按,1是单击,2是双击,3是三击,4是长按

按键按下用一个while兜住,时间超过0.5s视为长按,否则视为单击,清空计时变量times,如果在0.3秒内检测到按键按下,并在0.3秒内没有再次按下,视为双击,否则视为三连击。单击的判断是在所有按键效果之后,如果没有触发其他效果自然而然就是单击,因为最开始的if(!K)

int s_key()

{

if(!K)

   {

     times=0; //清空计时变量

while(!K)//长按,并作为兜住单击

     {

if(times>5)

       {

return 4;

       }

     }

     times=0;//清空计时变量

while(times<3)//0.3秒的循环来判断双击

     {

if(!K)//判断双击,否则视为单击

       {

while(!K);//兜住按键

         times=0;//清空计时变量

while(times<3)//0.3秒的循环判断三连击

         {

if(!K)//判断三击,否则视为双击

           {

while(!K);

return 3;//三连击

           }

         }

return 2;//双击

       }

     }

return 1;//单击

   }

return 0;

}

 

湖北城市建设职业学院,copyright ucvc_xxzhx,鄂ICP备案号:13016952,鄂公网安备:42018502000645号

信息产业部备案管理系统网址:https://beian.miit.gov.cn/