Re: [問題]8051的一個開關控制程式
※ 引述《waynecone (wayne)》之銘言:
: 各位大大,小弟正在看有關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
;;
;; SUBROUTINE : KEY SCAN
;;
KEYSCAN:
        PUSH    A
        MOV     P2,#FFH         ;; 如果有按下按鍵 , p2 會不等於FFH
        MOV     A,P2            ;;
        CPL     A               ;; if ( (A 反向) != 0)  代表有按下按鍵
        MOV     STATUS,A        ;; else    沒有按鍵被按下
        CJNE    A,#0,KEYIN      ;;
        ;;以下是沒有按鍵的狀況
        INC     ONE             ;; 放開之後的debounce
        MOV     A,ONE           ;; ONE 就是作release key 的debounce 用的
counter
        CJNE    A,#5,K3         ;; 如果要延遲debounce 的時間
        MOV     ZERO,#0         ;; <CJNE    A,#5,K3>  把5 改大一點
        MOV     KEYTEMP,#FFH    ;;
        MOV     KEYDATA,#FFH    ;;
        SJMP    K3
        ;;以下是有按下按鍵的狀況
KEYIN:
        MOV     ONE,#0          ;; 按下按鍵之後的debounce
        MOV     A,STATUS        ;; 等到按鍵真的被按下之後
        CJNE    A,KEYTEMP,K2    ;; 把KEYTEMP 更新
        MOV     A,ZERO          ;; ZERO 就是作PRESS key 的debounce 用的counter
        CJNE    A,#5,K1         ;; 如果要延遲debounce 的時間
        SJMP    K3              ;; <CJNE    A,#5,K1>  把5 改大一點
K1:
        INC     ZERO            ;; 按下按鍵的debounce 做完之後
        MOV     A,ZERO          ;; 將KEYTEMP 的資料更新到 KEYDATA
        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.這個程式因該還有其他比較簡單的寫法吧?麻煩能不能稍微指導小弟一下?
簡單的方法....  google 一下應該有很多
: 謝謝各位大大把我的問題看完了!這是我第一次PO文!所以不知道什麼叫做作業文!
: 假如我的文章有違反板規的地方,麻煩告訴我一聲!我會自D的!
--
※ 發信站: 批踢踢實業坊(ptt.cc) 
◆ From: 61.220.96.229
推
10/03 00:44, , 1F
10/03 00:44, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章