標(biāo)題:
單片機(jī)獨(dú)立按鍵狀態(tài)機(jī)源程序
[打印本頁]
作者:
練氏
時(shí)間:
2017-11-4 11:36
標(biāo)題:
單片機(jī)獨(dú)立按鍵狀態(tài)機(jī)源程序
分享一個(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
作者:
bhjyqjs
時(shí)間:
2018-2-9 18:14
很好的狀態(tài)機(jī)處理鍵盤例程
作者:
ldh119
時(shí)間:
2020-5-2 16:09
程序不錯(cuò),但是有點(diǎn)小問題。case 0x01: if(P3 != 0x0f) 。。。。。
這個(gè)不能說明是同一個(gè)按鍵產(chǎn)生的狀態(tài),所以有肯能會(huì)誤判。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1