久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3708|回復: 5
打印 上一主題 下一主題
收起左側

三行按鍵 單片機程序分析

[復制鏈接]
跳轉到指定樓層
樓主
今天寫一個進階級的帖子分享一下,記錄過程。
三行按鍵由煙臺南山學院-零點工作室原創,如轉載,請標明出處,并附本鏈接。
我看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口,四個按鍵進行舉例的。


完整的pdf格式文檔51黑下載地址:
三行按鍵.pdf (128.32 KB, 下載次數: 30)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:56665 發表于 2019-9-9 08:30 | 只看該作者
有沒有人在項目中用到這個按鍵
回復

使用道具 舉報

板凳
ID:66287 發表于 2019-9-9 08:37 | 只看該作者
第二種方法我一直在用,實用性較高。
回復

使用道具 舉報

地板
ID:66287 發表于 2019-9-9 08:43 | 只看該作者
void ThreeKey()
  {
    ReadData = ~ReadData;      // 1
    Trg  = ReadData & ~Cont;  // 2 注“~”優先級高于& ;ReadData為本次鍵狀態,Cont為上次鍵狀態
    Cont = ReadData;               // 3
  }
這是改進版,更好理解。編譯后代碼量一樣。
回復

使用道具 舉報

5#
ID:609746 發表于 2019-9-9 21:54 | 只看該作者
優秀啊
回復

使用道具 舉報

6#
ID:59423 發表于 2019-11-16 09:30 | 只看該作者
在實際項目中,實際使用下。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩久久 | 一区二区三区国产好 | 欧美一区二区三区在线 | 99成人| 成人网视频 | 国产精品呻吟久久av凹凸 | 久久久男人的天堂 | 日韩一级不卡 | 日韩精品在线观看一区二区 | 精品成人免费视频 | 亚洲精品久久久久久久久久久久久 | 国产日韩欧美在线观看 | 国产三级| 日韩一区二区福利 | av大片在线| 国产精品久久久久久 | 精国产品一区二区三区 | 国产久| 国产精品久久久久9999鸭 | 日韩在线观看 | 欧美性生活一区二区三区 | 国产福利视频导航 | www亚洲精品 | 黄a免费看 | 亚洲一二三在线 | 在线国产一区 | 91久久综合亚洲鲁鲁五月天 | 中文字幕乱码一区二区三区 | 欧美日韩高清免费 | 欧美一区二区三区国产 | 国产福利在线播放 | 亚洲精品视频在线 | 羞羞视频在线观看 | 久久精品青青大伊人av | 欧美激情一区二区三区 | 国产一区二区三区色淫影院 | 亚洲成人av在线播放 | 天天天天操| 久久av一区| 免费黄网站在线观看 | 色婷婷综合久久久中文字幕 |