[問題]8051的一個開關控制程式
各位大大,小弟正在看有關8051的書,剛好看到了這個開關程式的寫法
不是很了解他在寫什麼?麻煩各位大大幫我一下了?感謝~
他的硬體接線是P1接8個LED燈,P2接八個按鈕開關
輸入和輸出"1"都是沒有動作,要是"0"才代表有發送或接收到訊號
而開關是按鈕開關需要除彈跳
程式如下:
ZERO EQU 30H ;連續偵測按鍵被按下的次數
ONE EQU 31H ;連續偵測按鍵以釋放的次數
KEYTEMP EQU 32H ;未除彈跳的鍵值
KEYDATA EQU 33H ;以除彈跳的鍵值
STATUS EQU 34H ;按鍵狀態
ORG 00H
MOV P1,#FFH
MOV KEYTEMP,#FFH
MOV KEYDATA,#FFH
LOOP:
ACALL KEYSCAN
MOV A,#FFH
XCH A,KEYDATA
CJNE A,#FFH,CHG
SJMP LOOP
CHG:
XRL P1,A
SJMP LOOP
KEYSCAN:
PUSH A
MOV P2,#FFH
MOV A,P2
CPL A
MOV STATUS,A
CJNE A,#0,KEYIN
INC ONE
MOV A,ONE
CJNE A,#5,K3
MOV ZERO,#0
MOV KEYTEMP,#FFH
MOV KEYDATA,#FFH
SJMP K3
KEYIN:
MOV ONE,#0
MOV A,STATUS
CJNE A,KEYTEMP,K2
MOV A,ZERO
CJNE A,#5,K1
SJMP K3
K1:
INC ZERO
MOV A,ZERO
CJNE A,#5,K3
MOV A,KEYTEMP
MOV KEYDATA,A
SJMP K3
K2:
MOV KEYTEMP,A
MOV ZERO,#1
K3:
POP A
RET
END
動作要求:
按鈕開關輸入,按一次對應的LED燈亮,再按同一顆開關的話LED燈會暗
上面的程式是直接從書上抄下來的,也做過測試了!可以正確的動作
而我的問題如下:
1.問什麼再KEYSCAN程式段中要寫一個 CPL A 在這取補數有什麼用意嗎?
2.在程式中ZERO和ONE這兩個暫存器到底是在做什麼事情,為什麼要判斷他們兩個的
值是不是等於5,為何是5不是別的數字?
3.這支程式是怎麼解決彈跳問題的?
4.這個程式因該還有其他比較簡單的寫法吧?麻煩能不能稍微指導小弟一下?
謝謝各位大大把我的問題看完了!這是我第一次PO文!所以不知道什麼叫做作業文!
假如我的文章有違反板規的地方,麻煩告訴我一聲!我會自D的!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.166.162.21
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章