2017.07.26 程式筆記
今天思考乙個關於按鍵的程式:結構體如下
if(pc_get_key(&key)==ture)
}
思考了一下,這個可以作為電堆按鍵檢測的乙個大體的框架,結合基本的按鍵處理程式,就可以實現功能
if(0 == io_keyenter) //如果有鍵按下了
else
while(0 == io_keyenter) ; //等待按鍵釋放
}
下面是基本的c51處理按鍵的一部分
因為51微控制器i/o口內部結構的限制,在讀取外部引腳狀態的時候,
需要向埠寫1,在51微控制器復位後,不需要進行此操作也可以進行讀
取外部引腳的操作。因此,在按鍵的埠沒有復用的情況下,可以省略此
步驟。而對於其它一些真正雙向i/o口的微控制器來說,將引腳設定成輸入
狀態,是必不可少的乙個步驟。
//初始化引腳為輸入
void keyinit(void)
//根據按鍵硬體連線定義按鍵鍵值
#define key_value_1 0x0e
#define key_value_2 0x0d
#define key_value_3 0x0b
#define key_value_4 0x07
#define key_null 0x0f
下面我們來編寫按鍵的硬體驅動程式。
根據第一章所描述的按鍵檢測原理,我們可以很容易的得出如下的**:
static uint8 keyscan(void)
其中io_key_1等是我們按鍵埠的定義,如下所示:
sbit io_key_1 = p3 ^ 0 ;
sbit io_key_2 = p3 ^ 1 ;
sbit io_key_3 = p3 ^ 2 ;
sbit io_key_4 = p3 ^ 3 ;
keyscan()作為底層按鍵的驅動程式,為上層按鍵掃瞄提供乙個介面,這樣我們編寫的上層按鍵掃瞄函
數可以幾乎不用修改就可以拿到我們的其它程式中去使用,使得程式復用性大大提高。同時,通過有意識
的將與底層硬體連線緊密的程式和與硬體無關的**分開寫,使得程式結構層次清晰,可移植性也更好。
對於微控制器類的程式而言,能夠做到函式級別的**重用已經足夠了。
在編寫我們的上層按鍵掃瞄函式之前,需要先完成一些巨集定義。
//定義長按鍵的tick數,以及連發間隔的tick數
#define key_long_period 100
#define key_continue_period 25
//定義按鍵返回值狀態(按下,長按,連發,釋放)
#define key_down 0x80
#define key_long 0x40
#define key_continue 0x20
#define key_up 0x10
//定義按鍵狀態
#define key_state_init 0
#define key_state_wobble 1
#define key_state_press 2
#define key_state_long 3
#define key_state_continue 4
#define key_state_release 5
接著我們開始編寫完整的上層按鍵掃瞄函式,按鍵的短按,長按,連按,釋放等等狀態的判斷均是在
此函式中完成。對照狀態流程轉移圖,然後再看下面的函式**,可以更容易的去理解函式的執行流程。
完整的函式**如下:
void getkey(uint8 *pkeyvalue)
} break;
case key_state_wobble: //消抖
break;
case key_state_press:
else
} break;
case key_state_long:
} else
} break;
case key_state_continue:
} else
} break;
case key_state_release:
break;
default:
break;
} *pkeyvalue = keytemp; //返回鍵值
} 關於這個函式內部的細節我並不打算花過多筆墨去講解。對照著按鍵狀態流程轉移圖,然後去看程式
**,你會發現其實思路非常清晰。最能讓人理解透徹的,莫非就是將整個程式自己看懂,然後想象為什
麼這個地方要這樣寫,抱著思考的態度去閱讀程式,你會發現自己的程式水平會慢慢的提高。所以我更希
望的是你能夠認認真真的看完,然後思考。也許你會收穫更多。
不管怎麼樣,這樣的乙個程式已經完成了本章開始時候要求的功能:按下,長按,連按,釋放。事實
上,如果掌握了這種基於狀態轉移的思想,你會發現要求實現其它按鍵功能,譬如,多鍵按下,功能鍵等
等,亦相當簡單,在下一章,我們就去實現它。
乙個小程式引發的思考
既然是乙個小程式引發的思考,那麼我們就先看看這個小程式,看看他有何神奇之處 i s.val,i mymethod s,i console.writeline s.val i s.val,i console.read static void mymethod myclass f1,int f2 cla...
乙個程式設計師的思考
讀書筆記系列鏈結位址 最近被一件事情虐的不行,晚上想著跑個步散散心,跑著跑著腦子裡就有了那麼一點小想法,遂將其記錄下來。乙個正常人的一生或者做一件事情就像乙個ln函式,ln函式是乙個凸函式,雖然一次導數是大於0的,但是二次導數卻是小於0,意味著一次導數一直在減小,帶來的結果就是值增加的越來越緩慢。以...
乙個程式設計師的哲學思考
關於程式設計 1.和世界格局一樣,軟體開發裡也是多維力量 商業 公司政治 技術等 在衝突,單純地鬥爭和避讓其實都不太行。2.很多時候人們爭論是因為都不清楚問題自身。比如 軟體工廠可能麼?軟體和工廠都是巨大且模糊的概念,a或b的理解中又為之注入了各自色彩,所以即使討論激烈,卻可能說的根本不是乙個東西。...