51 微控制器彙編程式設計 記錄按鍵

2021-07-09 15:01:56 字數 3264 閱讀 8752

;有個題目,要求記錄按下的鍵的編號。

;使用器件:

;51微控制器,8個編號為「1~8」的數字鍵,1個功能鍵,1個數碼管,其他晶振電阻電容。

;實現功能:

;按下功能鍵後,10s內,檢測被按下的數字鍵,

;10s後,結束檢測,並用數碼管迴圈顯示被按下過的鍵編號。

;做而論道據此畫出的電路如下:

;電路中的數碼管,不僅用於顯示按下過的鍵編號,還能顯示 9~0 的倒計時。

;在電路中,還安裝了乙個 led,用來表示按鍵的狀態。

;當有鍵按下,10ms 後仍然按下時,led 將發光,表示按鍵確實按下了。

;當按鍵釋放後,再令 led 熄滅。

;另外,在顯示按下的按鍵編號時,也令 led 持續發光。

;當 led 熄滅後,再次按下 func 鍵,可以重新進行下一輪的按鍵記錄。

;組合語言編寫的程式如下:

org   0000h

sjmp  start

org   000bh

sjmp  t0_int

;---------------------------------------

start:

mov   tmod, #01h

mov   ie, #82h

mov   dptr, #d_tab

wait_f:

jb    p3.6, $  ;等待按下功能鍵

call  delay10ms

jb    p3.6, wait_f

clr   p3.2       ;led發光

jnb   p3.6, $    ;等待釋放

setb  p3.2

;----------------------------------

mov   r0, #30h

mov   th0, #(65536 - 62500) / 256

mov   tl0, #(65536 - 62500) mod 256

mov   r7, #16

mov   r6, #9

call  display

setb  tr0

;----------------------------------

wait_n:              ;迴圈檢測按鍵

jnb   tr0, stop     ;到10s退出

call  key_n

jz    wait_n

mov   b, a

call  delay10ms     ;延時

call  key_n

cjne  a, b, wait_n  ;消抖

mov   @r0, a     ;儲存按鍵數值

inc   r0

clr   p3.2       ;led發光

wait_s:

call  key_n

jnz   wait_s     ;等待釋放

setb  p3.2

sjmp  wait_n     ;迴圈檢測按鍵

;----------------------------------

stop:

mov   a, r0

clr   c

subb  a, #30h

mov   r2, a

clr   p3.2       ;led發光

mov   r0, #30h

echo:

mov   a, @r0

inc   r0

mov   r6, a

call  display    ;回放

mov   r3, #100

call  delay10ms

djnz  r3, $ - 2

djnz  r2, echo   ;迴圈

setb  p3.2

mov   r6, #0

call  display

sjmp  wait_f

;---------------------------------------

t0_int:

mov   th0, #(65536 - 62500) / 256

mov   tl0, #(65536 - 62500) mod 256

djnz  r7, t0_end

mov   r7, #16

dec   r6

cjne  r6, #255, disp

clr   tr0

reti

disp:

call  display

t0_end:

reti

;---------------------------------------

display:

mov   a, r6

movc  a, @a + dptr

mov   p2, a

retd_tab:                 ;共陽段碼

db    0c0h, 0f9h, 0a4h, 0b0h, 099h

db    092h, 082h, 0f8h, 080h, 090h

;---------------------------------------

key_n:

clr   a

jnb   p1.0, k1

jnb   p1.1, k2

jnb   p1.2, k3

jnb   p1.3, k4

jnb   p1.4, k5

jnb   p1.5, k6

jnb   p1.6, k7

jnb   p1.7, k8

ret               ;沒有按鍵,返回0

k8: inc   a

k7: inc   a

k6: inc   a

k5: inc   a

k4: inc   a

k3: inc   a

k2: inc   a

k1: inc   a

ret;---------------------------------------

delay10ms:

mov   r4, #20

djnz  r5, $

djnz  r4, $ - 2

ret;---------------------------------------

end;經過**實驗證明,本程式可以穩定工作。

51微控制器按鍵燈實驗

要完成的效果是第一次按鍵燈快閃3次,第二次按鍵燈慢閃3次 定義了flag變數來標誌第一二次按鍵,這裡先給flag賦值1,用flag flag來表示一二次按鍵的變化 結果可行。然而用flag flag卻實現不了,按一次直接慢閃3次,按第二下沒有反應,再按一下又慢閃,求解 include define ...

51微控制器按鍵消抖

二 矩陣鍵盤 define key state 0 0 判斷按鍵是否按下 define key state 1 1 判斷按鍵是否抖動 define key state 2 2 判斷按鍵是否彈起 define key input p3 define key mask 0x0f void key rea...

51微控制器按鍵的掃瞄

include sbit addr0 p1 0 sbit addr1 p1 1 sbit addr2 p1 2 sbit addr3 p1 3 sbit enled p1 4 sbit key1 p2 4 sbit key2 p2 5 sbit key3 p2 6 sbit key4 p2 7 un...