欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

自寫單片機按鍵松手檢測思路

作者:小強   來源:本站原創   點擊數:  更新時間:2014年04月09日   【字體:

一直以來,單片機松手檢測用的都是while(key==0);  這樣,不但浪費CPU 資源,還。。。所以,用松手檢測 是非常好的,很時髦的。
下面是我晚上做了個小車總結出來的,可以單獨的按鍵,不影響其他按鍵,幾通道都可以。 貼上程序,最后分析整個程序意思。。

 /*----------------------------------------------------------------
 * 文 件 名:KEY.C
 * 芯    片:STC12C5A60S2
 * 晶    振:11.0592MHz
 * 創 建 者:小強
 * 創建日期:2012.3.23
 * 修 改 者:
 * 修改日期:
 * 聯系作者:lyg407@126.com   QQ:5163-806-35
 * 功能描述:按鍵掃描
-------------------------------------------------------------*/
//按鍵掃描
uchar key_scan()
{
 //前進后退左轉右轉 按鍵
 if(key_up&&(key1==0||key2==0||key3==0||key4==0))   //第一次 key_up=1 那么如果其它按鍵有按下,則為真 執行下面程序
 {
  delay_10ms();         //延時去抖
  if(key_up&&(key1==0||key2==0||key3==0||key4==0))   //再次判斷
  {
   key_up=0;  //松手標志為0 那么下次在檢測, if 結果就為0 則不會則行這里語句
 
   key_down=1;  //按鍵被按下標志。    最后如果 按鍵松手 那么還應該發送一個數據過去,執行關閉
 
   if(key1==0)  //如果按鍵1 按下
    return 1;
   if(key2==0)
    return 2;
   if(key3==0)
    return 3;
   if(key4==0)
    return 4;
  } 
 }
 else
 if(key1==1&&key2==1&&key3==1&&key4==1)   //如果所有按鍵都沒有按下。。注意 所有按鍵都沒按下
 {
  key_up=1;  //必須所有按鍵 沒有按下  松手標志 初始化
     if(key_down==1)   //這里判斷 是否按鍵 按下過, 按下過 就發送一個數據過去, 關閉之前輸出的。
  {
   key_down=0;   //初始化
   return 99;    //返回值  隨意更改
  }
 }
 //第二個 獨立按鍵
 if(flag2_up&&(key5==0))    //意思同上 
 {
  delay_10ms();     //延時去抖
  if(flag2_up&&(key5==0))    //在判斷
  {
   flag2_up=0;
   flag2_down=1;   //意思同上
 
   if(key5==0)
   {
    return 5; 
   }
  }
 }
 else
 if(key5==1)
 {
  flag2_up=1;  //必須所有按鍵為1 沒有按下  松手標志為1
     if(flag2_down==1)
  {
   flag2_down=0;
   return 95;
  }
 }
 //第3個獨立 按鍵
 if(flag3_up&&(key6==0))     //意思同上
 {
  delay_10ms();
  if(flag3_up&&(key6==0))
  {
   flag3_up=0;
   flag3_down=1;   //意思同上
 
   if(key6==0)
   {
    return 6; 
   }
  }
 }
 else
 if(key6==1)
 {
  flag3_up=1;  //必須所有按鍵為1 沒有按下  松手標志為1
     if(flag3_down==1)
  {
   flag3_down=0;  //意思同上
   return 96;
  }
 }
 return 0;
}
// 返回的按鍵 做的處理,執行什么功能。。串口輸出數據
 key_num=key_scan();  //讀取 按鍵掃描返回值
  switch(key_num) //判斷
  {
   case 1:
   UART1_Send_Byte(0x11);  //前進
   break;
   case 2:
   UART1_Send_Byte(0x22);  //后退
   break;
   case 3:
   UART1_Send_Byte(0x33); //左轉
   break;
   case 4:
   UART1_Send_Byte(0x44);  //右轉
   break;
   case 5:
   UART1_Send_Byte(0x55);  //按鍵5  控制輸出1
   break;
   case 6:
   UART1_Send_Byte(0x66);  //按鍵6  控制輸出2
   break;
   case 95:
   UART1_Send_Byte(0x95);  //按鍵5  松手后 發送一個數據過去
   break;
   case 96:
   UART1_Send_Byte(0x96);  //按鍵6  松手后 發送一個數據過去
   break;
   case 99:
   UART1_Send_Byte(0x99);   // 小車 前進后退 左轉 右轉  按鍵松手后 發送一個停止信號   。。。
   break;
  }
//上面是整個發送部分,有按鍵掃描  判斷 發送數據
 
//下面是接收解碼部分
 
value=SBUF; //value等于串口接收的字節;
 
switch(value)  //判斷接收到的數據
  {
   case 0x11:  //執行前進
   go();
   break;
   case 0x22: //執行后退
   back();
   break;
   case 0x33:  //執行左轉函數
   left();
   break;
   case 0x44:  //執行右轉函數
   right();
   break;
   case 0x99: //執行 停止 函數
   stop();
   break;
   case 0x55:  //輸出 控制1  打開
   out1=0;
   break;
   case 0x95: // 控制1 關閉
   out1=1;
   break;
   case 0x66: //輸出控制2 打開
   out2=0;
   break;
   case 0x96:  //控制2 關閉
   out2=1;
   break;
  }
  
 
OK, 下面整個程序意思分析: 遙控檢測按鍵 是否有按鍵 按下,如果有按鍵按下,發送一個前進 0x11過去,接收機 接收到了11 執行前進函數。 那么此時 前進按鍵 一直按著 則后 左 右 按鍵 按不起作用,因為這幾個共用一個按鍵按下標志, 但是 按鍵5 按鍵 6 是在單獨一個松手檢測程序里,所以,此時 按鍵5 按鍵6 隨意觸發的。 當前進 按鍵松手后, 松手down=1 則執行一次 返回99, 這個時候串口又發送一個 99  停止函數過去,小車停止。 。 不知道這樣是不是有點繁瑣,但是目前沒有其它的好思路,解決這樣的幾個獨立按鍵,按下,松手檢測。 這樣好處是,每次只發送一次數據過去,通訊不是那么頻繁,響應能快一些。 這個就是整個思路,如果有什么問題可以提問哦~   ^_^    又忘記要早點睡覺了。。

關閉窗口

相關文章