現在手裡的項目使用到了旋轉編碼器,目前隻使用了旋轉功能,按鈕功能沒用到,電路圖如下:
說一下為什麼這麼畫,原因很簡單,旋鈕并不需要供電,它做的工作是把原來的高電平拉低,或者不改變高電平狀态,這就是為什麼旋鈕有接地接線柱。是以旋鈕的輸出引腳需要一直輸出高電平就好了,我是用的是Mega8單片機,是以PORTD = 0xC3 DDRD = 0xFF,這樣就完成了電平的設定。我按鍵功能暫時并沒有用到。如果直接就把旋鈕接到單片機,當使用的時候,用示波器會看到很大的噪聲。在網上看到,有使用軟體濾波的,我是求助了一個前輩,得到了RC濾波電路,前輩告訴我說,這是很經典的電路。(我是才疏學淺了!!)于是配上0.1uF電容,和10K電阻後,波形非常完美。就算旋轉的很快,也沒有問題。
以上是硬體部分,接下來是軟體部分。軟體部分,之前在網上找的例程,抄一下,稍微改改就可以了。今天在找這個程式,發現丢了

!都怪自己沒有備份,因為知道網上可以找到,是以犯了依賴症,一直找啊找,結果還是徒勞。後來還是自己寫的,(難道程式丢了,是因為我剽竊了??罪過罪過)。程式如下:
ISR(INT1_vect)//INT0中斷服務程式
{
cli();
CodingsWitchPolling2();//(這個名字也是剽竊的,抱歉抱歉)
sei();
}
<pre name="code" class="cpp">nt CodingsWitchPolling1(void)
{
if (PIND & 0x04)//檢測中斷引腳電平
{
if (PIND & 0x10)//檢測另一引腳電平
USART_Transmit('C');
else
USART_Transmit('D');
}
else
{
if( !(PIND & 0x10))
USART_Transmit('C');
else
USART_Transmit('D');
}
return 0;
}
看到這個程式,你又沒有感覺很驚訝,其實沒那麼複雜。現在說一下為什麼是這個樣子的:
看原理時,都知道,旋轉編碼器是輸出兩種波形的,順時針和逆時針的,如圖:
我的硬體電路裡面,連接配接的是PD3(INT0)引腳,另一腳在PD4上面,中斷出發方式是任意電平變化都觸發,是以就是,觸發中斷->檢測中斷引腳電平->檢測另外一腳電平->判斷是順時針還是逆時針。OK就這麼簡單。