分享一個獨立按鍵控制的狀態機程序,賺點幣。 有詳細的注解,請看附錄
單片機源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit LED = P1^0;//繼電器(P1.0)接口定義 P1口的其他口可以接LED,也可以接LED,反正效果一樣
- /**************************************/
- /**************定時器中斷**************/
- /**************************************/
- void Timer0_init()
- {
- TMOD = 0x01;//定時器定時模式,16位定時
- TH0 = 0xf8;//設定定時器初值2ms
- TL0 = 0xcc;
- TR0 = 1;//開啟定時器
- ET0 = 1;//定時器中斷
- EA = 1;//總中斷
- }
- /**************************************/
- /*********狀態機按鍵掃描函數***********/
- /*********返回值: 按鍵碼值************/
- /**************************************/
- uchar Key_Scan(void)
- {
- static uchar State_Cnt=0;//靜態變量,用于改變狀態過程
- uchar Key_State = 0;//用于存儲鍵值碼
- switch(State_Cnt)
- {
- case 0x00:P3 = 0x0f;//先往P3(1到4獨立按鍵)口送0000 1111
- if(P3 != 0x0f)//有無按鍵被按下
- {
- State_Cnt = 0x01;//改變狀態
- break;
- }
- case 0x01:
- if(P3 != 0x0f)//經過定時器延時后,再次判斷按鍵是否按下
- {
- State_Cnt = 0x02;//改變狀態
- Key_State = P3;//把鍵值保存下來
- P3 = 0x0f;//恢復P3,以便下次按下重新保存鍵值
- break;
- }
- else
- {
- State_Cnt = 0x00;//改變狀態
- break;
- }
- case 0x02:
- if(P3 == 0x0f)//判斷按鍵釋放
- {
- State_Cnt = 0x00;//改變狀態
- break;
- }
- default:break;
- }
- return Key_State;//返回鍵值
- }
- /**************************************/
- /************按鍵功能函數**************/
- /***********參數:按鍵鍵碼*************/
- /**************************************/
- void Display_Key(uchar key_value)
- {
- switch(key_value)
- {
- case 0x0e:LED = 1;break;//鍵值改變時,做出相應的動作(用戶自定義動作)
- case 0x0d:LED = 0;break;
- case 0x0b:P1 = 0x00;break;
- case 0x07:P1 = 0xff;break;
- }
- }
- void main()
- {
- Timer0_init();
- while(1);
- }
- /************定時器0中斷函數**************/
- void Timer0() interrupt 1
- {
- static Time_Counter = 0;//定義變量,以便計數
- TH0 = 0xf8;//重新放入中斷初值
- TL0 = 0xcb;
- Time_Counter++;//中斷一次,值加1
- if(Time_Counter == 5)//累計10ms的延時,以便消抖
- {
- Time_Counter = 0;
- Display_Key(Key_Scan());//按鍵按下,鍵值碼送入函數,以便做相應動作
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
狀態機按鍵程序.rar
(14.62 KB, 下載次數: 86)
2017-11-4 11:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|