標(biāo)題: 旋轉(zhuǎn)編碼開(kāi)關(guān)在單片機(jī)方面使用 附程序 [打印本頁(yè)]

作者: geige    時(shí)間: 2015-7-26 01:36
標(biāo)題: 旋轉(zhuǎn)編碼開(kāi)關(guān)在單片機(jī)方面使用 附程序
         旋轉(zhuǎn)編碼開(kāi)關(guān),比如數(shù)碼電位器  驅(qū)動(dòng)程序      具有左轉(zhuǎn)、右轉(zhuǎn)和按下三個(gè)功能,有五個(gè)腳,它的外形如下圖所示:

                    


(1) 1、3腳要外接上拉電阻,一般10K就足矣;
(2) 2腳一般接地就行;
(3) 4、5腳是下按鍵的開(kāi)關(guān)接線(按下時(shí),4腳為低電平);
實(shí)物接線示意圖為:



                                       

     判斷正轉(zhuǎn) 和反轉(zhuǎn)的關(guān)鍵就是:當(dāng)BMA為低電平時(shí),BMB的跳變沿是怎樣的——上升沿表示正轉(zhuǎn),下降沿表示反轉(zhuǎn)。只要用代碼把這itP27=P2^7;
sbit P26=P2^6;
sbit P25=P2^5;
uchar codetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar count=0;
uchar flag;
ucharLast_BMB_status;
ucharCurrent_BMB_status;
//************************************************
void delay(uchar z)   //大約1ms的延時(shí)
{
   uchar x,y;
   for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
//************************************************
void display()//顯示子程序
{
   P0=table[count];   //個(gè)位
   P27=0;
   delay(10);
   P27=1;
   P0=table[count0/10];   //十位
   P26=0;
   delay(10);
   P26=1;
   P0=table[count/100];   //百位
   P25=0;
   delay(10);
   P25=1;
}
//************************************************
void main()
{
   TMOD="0x01";   //定時(shí)器0,工作方式1
   TH0=0xD8;
   TL0=0xF0;    //給定時(shí)器裝上初值,10ms中斷一次
   ET0=1;   //打開(kāi)定時(shí)器中斷
   EA =1;   //打開(kāi)總中斷
   TR0=1;   //啟動(dòng)定時(shí)器0



   while(1)
   {
      Last_BMB_status=BMB;


      while(!BMA)   //BMA為低電平時(shí)
      {
         Current_BMB_status=BMB;
          flag="1";   //標(biāo)志位置為1說(shuō)明編碼開(kāi)關(guān)被旋轉(zhuǎn)了
      }


      if(flag==1)
      {
          flag="0";   //時(shí)刻要注意這一點(diǎn)!給標(biāo)志位清零
         if((Last_BMB_status==0)&&(Current_BMB_status==1))//BMB上升沿表示正轉(zhuǎn)
          {
             count++;
             if(count==255)
             {
                count="0";
             }
          }
         if((Last_BMB_status==1)&&(Current_BMB_status==0))//BMB下降沿表示反轉(zhuǎn)
          {
             count--;
             if(count==0)
             {
                count="255";
             }
          }
      }
   }
}
//************************************************
void timer0() interrupt 1   //定時(shí)器0的中斷服務(wù)程序
{
   TH0=0xD8;
   TL0=0xF0;   //再次裝入初值
   display();  //每隔10ms顯示一次
   if(!BMC)    //按下旋轉(zhuǎn)編碼開(kāi)關(guān)則計(jì)數(shù)清零
   {
      count="0";
   }
}


-------------------------------------------------------------------------------------------------



作者: 怪怪愛(ài)玩    時(shí)間: 2018-9-15 10:06
正在研究這個(gè),學(xué)習(xí)了
作者: Wprogrammer    時(shí)間: 2019-11-18 16:15
我試過(guò)了  樓主的方法不錯(cuò) 贊
作者: Wprogrammer    時(shí)間: 2019-11-21 09:33
樓主在嗎 有的時(shí)候編碼開(kāi)關(guān)會(huì)卡死while(!BMA)   //BMA為低電平時(shí)  
作者: Wprogrammer    時(shí)間: 2019-11-21 10:04
我覺(jué)得可能用外部中斷的辦法做比較好
作者: qianlong999    時(shí)間: 2021-7-17 16:20
Wprogrammer 發(fā)表于 2019-11-18 16:15
我試過(guò)了  樓主的方法不錯(cuò) 贊

這程序多垃圾啊,你說(shuō)好用?
作者: 潘香亦鴻    時(shí)間: 2022-6-17 21:58
qianlong999 發(fā)表于 2021-7-17 16:20
這程序多垃圾啊,你說(shuō)好用?

兄臺(tái),這用詞好像有點(diǎn)過(guò)。。。其實(shí)技術(shù)論壇最好的狀態(tài)是談?wù)摚瘩g別人不好不是不可以。盡量也把自己的思路拿出來(lái)對(duì)比更好。
作者: 新昌小徐    時(shí)間: 2022-6-18 13:41
從其它網(wǎng)站復(fù)制過(guò)來(lái)的,那個(gè)count="0",怎么加了個(gè)雙引號(hào),其它網(wǎng)站就如此。復(fù)制過(guò)來(lái)也得改改錯(cuò)誤
作者: xiexugang    時(shí)間: 2022-6-19 15:12
A相低電平時(shí),根據(jù)B相的上升沿和下降沿,來(lái)判斷旋轉(zhuǎn)方向.確是是簡(jiǎn)單有效的方法.




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1