簡單的定時器實現按鍵消抖,還望大家多指點!

來源:互聯網
上載者:User

標籤:c51單片機

/********************************按獨立按鍵使數位管加1********************************/ #include <reg52.h> #define uchar unsigned char  sbit KEY = P1 ^ 0; //定義獨立按鍵 bit KEYSTA = 1; //按鍵的初始狀態 uchar code DispCode[] = {0xc0,0xf9,0xa4,0xb0, //共陽數位管                          0x99,0x92,0x82,0xf8,                          0x80,0x90,0x88,0x83,                          0xc6,0xa1,0x86,0x8e};void Timer0Init();//定時器初始化函數void KeyProcess();//按鍵處理函數void main(){Timer0Init();KeyProcess();}void Timer0Init(){TMOD |= 0x01;TH0 = 0xF8;  //定時2MSTL0 = 0xCD;EA =1;ET0 = 1;TR0 = 1;}void KeyProcess(){bit lasttime = 1; //定義前一次按索引值,初始化為1;uchar count = 0; //計數值初始化為0;KEY = 0x01; //按鍵初始化;P0 =  DispCode[count]; //數位管初始化;while(1){if (KEYSTA != lasttime) //如果“當前按鍵狀態”與“前一次按鍵狀態”不同,說明按鍵有動作;{if (lasttime == 1) //如果按鍵有動作了,那麼前一次按鍵狀態為“彈起”(lasttime == 1),說明按鍵按下時,會響應動作;{count++;if (count >= 16) //計數加到16清零,只用一個共陽數位管;{count = 0;}P0 =  DispCode[count]; //共陽數位管顯示相應的值;}lasttime = KEYSTA; //如果按鍵有動作,就更新前一次按鍵的值;}}}void Timer0IRQ() interrupt 1//2MS中斷一次{static keybuf = 0xFF;//定義一個靜態按金鑰快取變數,且值為FF;主要是暫存按鍵狀態;TH0 = 0xF8;                    //重新寫入初值;TL0 = 0xCD;keybuf = (keybuf << 1) | KEY;    //左移一位,使當前的按鍵狀態移到按金鑰快取中;if (keybuf == 0)//如果移8次,按鍵狀態都為0,說明按鍵真正按下;{KEYSTA = 0;    //確定按鍵狀態為按鍵;}else if (keybuf == 0xFF)//如果移8次,按鍵狀態都為1,說明按鍵未按下{KEYSTA = 1;}}


本文出自 “陽子” 部落格,請務必保留此出處http://9832751.blog.51cto.com/9822751/1834589

簡單的定時器實現按鍵消抖,還望大家多指點!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.