您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>匯編編程>

獨(dú)立按鍵控制程序分享

大?。?/span>0.11 MB 人氣: 2017-09-06 需要積分:0

1、獨(dú)立按鍵控制流水燈花樣

; 使用獨(dú)立按鍵K1,K2,K4,K4實(shí)現(xiàn)流水燈花樣變化
; P1.4? 開始按此鍵則燈開始流動(dòng)(由左向右)?
;P1.5? 停止按此鍵則停止流動(dòng)所有燈為滅?
; P1.6? 向左按此鍵則燈反向流動(dòng)由右向左?
;1.7? 向右按此鍵則燈正向流動(dòng)由左向右
UpDown EQU 00H ;上下行標(biāo)志
StartEnd EQU 01H ;起動(dòng)及停止標(biāo)志
LAMPCODE EQU 21H ;存放流動(dòng)的數(shù)據(jù)代碼
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P0,#0FFH
CLR UpDown ;啟動(dòng)時(shí)處于向上的狀態(tài)
CLR StartEnd ;啟動(dòng)時(shí)處于停止?fàn)顟B(tài)
MOV LAMPCODE,#0FEH ;單燈流動(dòng)的代碼?
LOOP:
ACALL KEY ;調(diào)用鍵盤程序
JNB F0,LNEXT ;如果無鍵按下,則繼續(xù)
ACALL KEYPROC ;否則調(diào)用鍵盤處理程序
LNEXT:
ACALL LAMP ;調(diào)用燈顯示程序
AJMP LOOP ;反復(fù)循環(huán),主程序到此結(jié)束
;---------------------------------------
DELAY:
MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;----------------------------------------延時(shí)程序,鍵盤處理中調(diào)用
KEYPROC:
MOV A,B ;從B寄存器中獲取鍵值
JB ACC.4,KeyStart ;分析鍵的代碼,某位被按下,則該位為1(因?yàn)樵阪I盤程序中已取反)
JB ACC.5,KeyOver
JB ACC.6,KeyUp
JB ACC.7,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartEnd ;第一個(gè)鍵按下后的處理
AJMP KEY_RET
KeyOver:
CLR StartEnd ;第二個(gè)鍵按下后的處理
AJMP KEY_RET
KeyUp: SETB UpDown ;第三個(gè)鍵按下后的處理
AJMP KEY_RET
KeyDown:
CLR UpDown ;第四個(gè)鍵按下后的處理
KEY_RET:RET
KEY:
CLR F0 ;清F0,表示無鍵按下。
ORL P1,#11110000B ;將P1口的接有鍵的四位置1
MOV A,P1 ;取P3的值
ORL A,#00001111B ;將其余4位置1
CPL A ;取反
JZ K_RET ;如果為0則一定無鍵按下
ACALL DELAY ;否則延時(shí)去鍵抖
ORL P1,#11110000B
MOV A,P1
ORL A,#00001111B
CPL A
JZ K_RET
MOV B,A ;確實(shí)有鍵按下,將鍵值存入B中
SETB F0 ;設(shè)置有鍵按下的標(biāo)志
K_RET:?
ORL P1,#11110000B ;此處循環(huán)等待鍵的釋放
MOV A,P1
ORL A,#00001111B
CPL A
JZ K_RET1 ;直到讀取的數(shù)據(jù)取反后為0說明鍵釋放了,才從鍵盤處理程序中返回
AJMP K_RET
K_RET1:?
RET
;-----------------------------------?
D500MS: ;流水燈的延遲時(shí)間
PUSH PSW
SETB RS0
MOV R7,#200
D51: MOV R6,#250
D52: NOP
NOP
NOP
NOP
DJNZ R6,D52
DJNZ R7,D51
POP PSW
RET?
;-----------------------------------
LAMP:
JB StartEnd,LampStart ;如果StartEnd=1,則啟動(dòng)
MOV P0,#0FFH
AJMP LAMPRET ;否則關(guān)閉所有顯示,返回
LampStart:
JB UpDown,LAMPUP ;如果UpDown=1,則向上流動(dòng)
MOV A,LAMPCODE
RL A ;實(shí)際就是左移位而已
MOV LAMPCODE,A?
MOV P0,A
LCALL D500MS
AJMP LAMPRET
LAMPUP:
MOV A,LAMPCODE
RR A ;向下流動(dòng)實(shí)際就是右移
MOV LAMPCODE,A
MOV P0,A
LCALL D500MS
LAMPRET:?
RET
END

2、去抖動(dòng)獨(dú)立按鍵實(shí)驗(yàn)

;按壓(P1.4),D00交替亮滅。按壓(P1.5),D01交替亮滅,加入去抖動(dòng)功能
ORG 000H
AJMP START
ORG 30H
START: MOV SP,5FH
MOV P0,#0FFH
MOV P1,#0FFH
L1: JB P1.4,L2??????? ;P1.4為1,不做處理,轉(zhuǎn)P1.5,否則說明有鍵按下
LCALL D10MS?????????? ;調(diào)用延時(shí)程序,去除抖動(dòng)
JB P1.4,L1??????????? ;p1.4為0,說明此鍵被按下了
CPL P0.0????????????? ;取反P0.0
L3: JNB P1.4,L3?????? ;直到P1.4釋放后去判斷第二個(gè)鍵
L2: JB P1.5,L1??????? ;P1.5為1,返回去繼續(xù)處理P1.4
LCALL D10MS?????????? ;調(diào)用延時(shí)程序,去除抖動(dòng)
? JB P1.5,L2????????? ;p1.5為0,說明此鍵被按下了
? CPL P0.1??????????? ;取反P0.1
L4: JNB P1.5,L4?????? ;直到P1.5釋放為止
LJMP L1?????????????? ;返回
D10MS: MOV R7,#50???? ;延時(shí)的時(shí)間一般為5-20ms
???? D1:MOV R6,#100
???? D2:DJNZ R6,D2
???? DJNZ R7,D1
???? RET
?END

3、獨(dú)立按鍵實(shí)驗(yàn)

;按壓(P1.4),D00交替亮滅。按壓K2(P1.5),D01交替亮滅
ORG 000H
AJMP START
ORG 30H
START: MOV SP,5FH
MOV P0,#0FFH
MOV P1,#0FFH
L1: JNB P1.4,L2????? ;按下按鍵開關(guān)K1,取反一次P0.0(燈亮),再按一下滅
JNB P1.5,L3????????? ;按下按鍵開關(guān)K2,取反一次P0.1(燈亮),再按一下滅
LJMP L1
L2: CPL P0.0
LJMP L1
L3: CPL P0.1
LJMP L1
END
?

4、直控按鍵演示

;按壓P1.4直控鍵盤按鈕流水燈減1,按壓P1.5直控鍵盤按鈕流水燈加11
CODE_SEG?SEGMENT?CODE
DATA_SEG?SEGMENT?DATA
STACK_SEG?SEGMENT?IDATA
?RSEG?DATA_SEG
KEY_S:?DS?1
KEY_V:?DS?1
?RSEG?STACK_SEG
STACK:?DS?20

K1?BIT?P1.4??;?
K2?BIT?P1.5??;

?CSEG?AT?0000H
?JMP?MAIN
;===============================================================================?
?RSEG?CODE_SEG
MAIN:
?MOV?SP,#(STACK-1)??; 設(shè)置棧指針
?MOV?P0,#0FEH??; 初始點(diǎn)亮LED P00
?MOV?KEY_V,#03H??; 初始鍵值
KEY_CHKSW:????; 循環(huán)檢測按鍵是否按下?????
?ACALL?SCAN_KEY??; 輸入按鍵狀態(tài)
?MOV?KEY_S,A
?XRL?A,KEY_V???; 檢查按鍵值是否改變
?JZ?KEY_CHKSW??; 若無鍵被按,則跳回KEY_CHKSW
?
?MOV?R7,#10???; 延時(shí)10ms
?ACALL?DELAYMS???; 延時(shí)去抖
?ACALL?SCAN_KEY??; 再次檢查按鍵值
?MOV?KEY_S,A
?XRL?A,KEY_V
?JZ?KEY_CHKSW
?
?MOV?KEY_V,KEY_S??; 保存按鍵狀態(tài)
?ACALL?PROC_KEY??;
?SJMP?KEY_CHKSW
;===============================================================================
SCAN_KEY:????
; 掃描按鍵
; 傳入參數(shù):無
; 返回值:A --- 按鍵狀態(tài)
?CLR?A
?MOV?C,K1
?MOV?ACC.0,C
?MOV?C,K2
?MOV?ACC.1,C
?RET
;===============================================================================?
PROC_KEY:
; 按鍵處理子程序
; 傳入?yún)?shù): KEY_V --- 按鍵值
; 返回值: 無
?MOV?A,KEY_V
?JNB?ACC.0,PROC_K1
?JNB?ACC.1,PROC_K2
?RET
?
PROC_K1:????; 按鍵K1處理程序
?MOV?A,P0???; 右移
?RR?A
?MOV?P0,A
?RET
?
PROC_K2:????; 按鍵K2處理程序
?MOV?A,P0???; 左移
?RL?A
?MOV?P0,A??
?RET
;===============================================================================?
DELAYMS:
; 延時(shí)子程序
; 傳入?yún)?shù):R7 --- 延時(shí)值(MS)?
; 返回值:無
?MOV?A,R7
?JZ?END_DLYMS?
DLY_LP1:
?MOV?R6,#185
DLY_LP2:
?NOP
?NOP
?NOP
?DJNZ?R6,DLY_LP2
?DJNZ?R7,DLY_LP1
END_DLYMS:
?RET?
?
; END OF DELAYMS
?
?END

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

      用戶評論
      評價(jià):好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?