-
你能說得更具體一點嗎,我以前用的C51程式還沒儲存,現在是MSP430,你要嗎?
-
請新增詳細說明:
每個引腳的外圍都布置好了,四個LED顯示屏都連線到該埠,無論是共陰極還是共陽極連線2鍵盤連線到該埠。
3.每個相應鍵的含義。
-
它。。。。。。太亂了吧? 你能理清這整堆邏輯,我真的很佩服你。 你按住它,短按立刻生效,長按等於無。
既然用了定時器,就不要耽擱了,那個東西只出現在教科書上,很少在實際應用中使用。 使用定時器,設定乙個基準時間,如200us乙個中斷,然後設定乙個10ms的按鈕掃瞄時間,即50個中斷,並使用兩個連續的按鈕掃瞄低電平來判斷按鈕的有效性,延遲可以是88,教條主義要人命。 按鈕生效後,我會立即“計算中斷”,對吧?
按下加按鈕,鬆開清除0,下次重新計數,2秒就是20000次中斷,表示長按有效,不統計這個數字短按有效,這樣就可以單獨處理了,就這麼簡單,不要一直拿著計時器開機關。 理清思路,不要說長按短按,連雙擊都可以。
-
因為初始值沒有分配給中間和後面,所以它從第一毫秒到毫秒變化,相應地,關鍵時間也發生了變化。
-
1:鍵值記錄。
2:時間記錄。
3:是同乙個鍵嗎?
以上三個條件組合在一起,乙個條件使用乙個變數。
-
每個按鈕設定乙個狀態標誌,當標誌為 1 時函式是什麼,當函式為 2 時函式是什麼,依此類推。
-
定時器可在按下第一按時啟動,然後記錄1s以內的按鍵次數,並可對各種情況進行編碼,實現不同的功能。
-
它是乙個狀態機,它在什麼狀態下使用什麼。
雙擊實際上是一種繁瑣且難以除錯的方法。
使用它的簡單方法是檢視在什麼介面(狀態)中表示什麼函式。
-
你可以新增乙個定時器來實現你說的功能,先把矩陣鍵盤掃瞄寫成乙個獨立的函式,比如char keyread(void)(沒有按鍵返回0,否則返回鍵的值),然後設定定時器到1s(根據你需要按的次數來確定時間), 主程式直接呼叫keycan(),當檢測到返回值不為0時,啟動定時器,然後進入while無限迴圈掃瞄金鑰,在定時器達到1s之前,如果再次檢測到該值,則將標記加到1,當定時器到達定時器時,將標記的值讀入金鑰處理程式中,將標記清除為零。
-
檢查您要按下該鍵的時間長度以確定該鍵的功能。
-
網上有很多這樣的例子,所以我給你乙個參考。
while(1)
if(!key2)}}
-
矩陣鍵盤。
#include
#include
unsigned char code table = ;公陽數碼管顯示 0 f
void delay() delay 子例程。
void display(unsigned char s) 顯示子例程。
unsigned char keycan(void) keyscanner for line lines for column lines.
while((p1&0xf0) != 0xf0);等待金鑰被釋放。
return ((rcode) +ccode));返回金鑰編碼。
elsercode = (rcode<<1)|0x01;線掃瞄程式碼向左移動一位}}
return 0;如果按下時沒有鍵,則返回值為 0
void keydispaly(unsigned char key)
int main(void)
return 0;}
-
uchar code act[4]=;
char scan_key(void)}}
if(find==0)return-1;返回值為-1,返回1為正常返回,返回-1為異常返回程式只是程式編寫的標準,即沒有鍵。
return(ini*4+inj);i 是上四位數字的判斷,j 是後四位數字的判斷。
0 1 2 3 為零 0,1,2,3 如果開關 0 開啟,則 p4 為 0,即 1110 1110
4 5 6 7 向右移動補 1,得到 1111 1110,j 為 0
8 9 A b 開關 1 開啟 p5 為 0,即 1101 1110,右移 1111 1101
c d e f 可以判斷 j 為 1,也可以推斷出 1 一樣。
p4 5 6 7
按照這個想法,4個埠只能實現4個開關4*4=16,2*2=4必須改變思維方式,如果是因為埠太緊,可以使用P3埠,或者使用分壓讀取AD判斷按鈕(AD鍵盤)。
-
發一張鍵盤部分的截圖,蚊子描述不容易理解。
鍵盤程式與硬體鏈結有很大關係。
-
哪些系列的MCU有P4埠?
-
只有30分鐘,我想找人教你。
-
主要存在兩個問題:
1. “chuli”命令只能執行一次。
原因:也就是說,程式上電復位後,執行到零迴圈,然後一直在這裡迴圈,無法執行chuli;
已解決:全部跳轉到數字(例如零、一、..九)跳到楚裡;確保中斷後可以執行chuli;
2、中斷時擴散表指標的r1增量模式錯誤。
雖然你的程式中還沒有感覺到這個錯誤,但它是存在的,這個錯誤還有兩點:
一是 r1 的初始值為 0,所以無論怎麼移位,r1 永遠是 0;
第二,你不應該在這裡使用移位(我猜你的意圖應該是從零到一、..九,否則只能執行幾個跳轉,如一、二、四、八等),並且應該使用 add 指令,每次加 2 個位元組(好久沒程式設計了,我忘了 ajmp+ 位址有多少位元組,反正有幾個位元組加幾個位元組)。
試試吧,應該沒什麼大問題!
另外,即使這個程式修改後可以執行,也盡量不要這樣寫。 你的寫作接近於使用作業系統的多工程式設計方法,但作業系統不支援,所以看起來很奇怪,可讀性很差,可以參考 Keil C51 中 Tiny OS 的原理來重寫。 如果你覺得太難了,你可以使用常規方法而不是無限迴圈,例如:
對於每個輸出(零,一、..9)寫乙個子例程,在你的分散中做乙個子例程呼叫,但記得在呼叫後跳出來。
方法有很多,想想看,不要“先試查詢方法,打斷方式”一定要知道為什麼不行,祝你好運!