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