嵌入式軟件開(kāi)發(fā)的基礎(chǔ)知識(shí)(3)位移操作-巧妙的計(jì)數(shù)
????在嵌入式開(kāi)發(fā)中,總會(huì)遇到IO口電平需要濾波。常見(jiàn)的方法就是連續(xù)出現(xiàn)N個(gè)高/低電平,才認(rèn)為數(shù)據(jù)有效。
????一般來(lái)說(shuō),常見(jiàn)的操作就是用一個(gè)變量來(lái)計(jì)數(shù)累加。連續(xù)出現(xiàn)到判定閾值就輸出信號(hào)。如下面代碼所示,當(dāng)電平變化(0變1或者1變0),且穩(wěn)定45個(gè)周期才能夠輸出。
位移計(jì)數(shù):
????位移計(jì)數(shù)是將uint類型數(shù)據(jù)看作bit序列。每一次循環(huán),數(shù)據(jù)都會(huì)整體的左移一位(高位拋棄)低位進(jìn)來(lái)一個(gè)數(shù)據(jù)(就是傳進(jìn)來(lái)的IO電平數(shù)據(jù))所以判定方式就是低位是否全1/0。比如閾值為5,那么只要最低的五個(gè)bit全都是1,就可以說(shuō)明連續(xù)進(jìn)來(lái)五個(gè)電平都是1,就可以輸出1。低電平也是同理,檢測(cè)最低的5個(gè) bit是否全是0。(就是閾值在1-32的情況)
????以上就是計(jì)數(shù)的兩種方法。高低電平變化都需要穩(wěn)定一定的時(shí)間(累計(jì)一定的次數(shù))才會(huì)被判定生效。如果只是電平或者按鍵消抖的話,一般常用的方法就可以了。如果是某些信號(hào)需要一個(gè)較長(zhǎng)時(shí)間的脈沖才能夠觸發(fā)。那么可以嘗試使用一下位移計(jì)數(shù)法。(保證讓人看得很迷惑哈哈哈)。
小知識(shí):static關(guān)鍵字。上面定義的局部變量都使用了static關(guān)鍵字,因?yàn)椋孩龠@些變量只在本函數(shù)使用。②而且這個(gè)變量每一個(gè)循環(huán)都會(huì)用到。所以變量只需要申請(qǐng)一次,就可以一直使用它。如果不加這個(gè)static,這些變量每次循環(huán)都會(huì)重新聲明定義這么一個(gè)變量(值會(huì)變成0)。那么這計(jì)數(shù)器是不是得聲明全局變量才能起到作用呢?全局變量滿天飄可不是什么好習(xí)慣。