今天寫一個進階級的帖子分享一下,記錄過程。
三行按鍵由煙臺南山學院-零點工作室原創,如轉載,請標明出處,并附本鏈接。
我看CSDN上有三行按鍵相關的分析,但并不是原創作者以及我們工作室相關學長。
三行按鍵從出生到現在已經很多個年頭了,經過幾代優化,現在有兩個版本,今天分析一下,也在本論壇擴充一下資源。
我在本論壇搜索三行按鍵,并沒有相關的帖子。
首先說明一下什么是三行按鍵,有什么用,什么好處,以及弊端。
三行按鍵,顧名思義,代碼只有三行;
用處:在咱日常生活中,運用按鍵時(矩陣按鍵除外),例如四個獨立按鍵甚至八個。完全可以使用。
最大的好處就是,平時按鍵會有長按和短按,不難理解,一個是觸發就松手,另一就是按下不松手,第二個針對按下就執行某個程序,松開就停止執行,比如手表上調時間的按鈕,分鐘在長按0.8s之后自己會自加,當松開按鈕時,停止自加。
好處:代碼簡介,但是分析過程比較困難,接下來會進行分析。
弊端:下面兩種方法都有各自的弊端,在下面有詳細說明。
首先寫出三行按鍵的兩個版本:
void Threekey(uchar *Trg,uchar *Cont)
{
unsigned char ReadData = (P3 & 0x0f) ^ 0xff;
(*Trg) = ReadData & (ReadData ^ (*Cont));
(*Cont) = ReadData;
}
void ThreeKey(void)
{
unsigned char ReadDat = (P3 ^ 0xff) & 0x0f;
Trg = (ReadDat ^ Cont)& ReadDat;
Cont = ReadDat;
}
最大的區別不在指針,而是在相與以及或運算的先后順序。
導致最后當按鍵觸發,運算出來的結果不相同,。
代碼分析如下:
//第一種程序解析 /*******************************************/ void key(void) { unsignedchar ReadData = (P3 & 0x0f)^ 0xff; Trg)=ReadData & (ReadData^ Cont); Cont)=ReadData; } //短按 //沒有按下情況下: ReadData= (0xff & 0x0f) ^ 0xff = 0xf0 Trg= 0xf0 & (0xf0 ^ 0x00) = 0xf0 Cont= 0xf0 //第二次掃描未按下 ReadData= (0xff & 0x0f) ^ 0xff = 0xf0 Trg= 0xf0 & ( 0xf0 ^ 0xf0) = 0x00 Count= 0xf0 //第三次掃描未按下 ReadData= (0xff & 0x0f) ^ 0xff = 0xf0 Trg= 0xf0 & (0xf0 ^ 0xf0) = 0x00 Cont= 0xf0 //當第一個按鍵按下情況 ReadData= (0xfe & 0x0f) ^ 0xff = 0xf1 Trg= 0xf1 & ( 0xf1 ^ 0xf0) = 0x01 Cont= 0xf1 //長按 //當按鍵按下并且不放手情況 ReadData= (0xfe & 0x0f ) ^ 0xff = 0xf1 Trg= 0xf1 & (0xf1 ^ 0xf1 ) = 0x00 Cont= 0xf1 //按鍵松手 ReadData= (0xff & 0x0f) ^ 0xff = 0xf0 Trg= 0xf0 & (0xf0 ^ 0x00) = 0xf0 Cont= 0xf0
以此類推 短按情況下 Trg = 0x01 0x02 0x04 0x08 長按情況下 Count = 0xf1 0xf2 0xf4 0xf8 弊端:當按鍵沒有按下,第一次掃描的Trg第一次會有一個值的變化,Trg= 0xf0;現在還沒有試出來對執行程序有什么影響。 //第二種程序解析 /*******************************************/ void ThreeKey(void) { unsignedchar ReadDat = (P3 ^ 0xff)& 0x0f; Trg= (ReadDat ^ Cont)&ReadDat; Cont= ReadDat; } //短按 //按鍵沒有按下情況 ReadDat= (0xff ^ 0xff) & 0x0f = 0x00 Trg= (0x00 ^ 0x00 ) & 0x00 = 0x00 Cont= 0x00 //按鍵按下情況 第一個按鍵按下 ReadDat= (0xfe ^ 0xff) & 0x0f = 0x01 Trg= (0x01 ^ 0x00) & 0x01 = 0x01 Cont= 0x01 //長按 //按鍵按下沒有松手情況 ReadDat= (0xfe ^ 0xff ) & 0x0f = 0x01 Trg= (0x01 ^ 0x01) & 0x01 = 0x00 Cont= 0x01 //按鍵松手 ReadDat= (0xff ^ 0xff) & 0x0f = 0x00 Trg= (0x00 ^ 0x01) & 0x00 = 0x00 Count = 0x00
以此類推 短按情況下 Trg = 0x01 0x02 0x04 0x08 長按情況下 Count = 0x01 0x02 0x04
0x08
弊端:短按Trg和長按Count運算結果是一樣的,也就是說當執行程序的時候需要分明。第二種比較好用。
附件文件和本文程序一樣。
主要就是講這個算法如何用,而不是拿現成的程序來給你們,這樣這段算法的意義并不大。
說明一下,第二個代碼的Trg以及Count是全局變量,可以在執行按鍵的函數里面進行調用。
這段例程里面,按鍵可以放在P30,P31,P32,P33口,四個按鍵進行舉例的。
0.png (113.8 KB, 下載次數: 52)
下載附件
2019-9-8 22:21 上傳
完整的pdf格式文檔51黑下載地址:
三行按鍵.pdf
(128.32 KB, 下載次數: 30)
2019-9-8 16:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|