獨立按鍵控制程序分享
大小:0.11 MB 人氣: 2017-09-06 需要積分:0
標(biāo)簽:匯編語言(34963)獨立按鍵(11385)
1、獨立按鍵控制流水燈花樣
; 使用獨立按鍵K1,K2,K4,K4實現(xiàn)流水燈花樣變化; P1.4? 開始按此鍵則燈開始流動(由左向右)?
;P1.5? 停止按此鍵則停止流動所有燈為滅?
; P1.6? 向左按此鍵則燈反向流動由右向左?
;1.7? 向右按此鍵則燈正向流動由左向右
UpDown EQU 00H ;上下行標(biāo)志
StartEnd EQU 01H ;起動及停止標(biāo)志
LAMPCODE EQU 21H ;存放流動的數(shù)據(jù)代碼
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P0,#0FFH
CLR UpDown ;啟動時處于向上的狀態(tài)
CLR StartEnd ;啟動時處于停止?fàn)顟B(tài)
MOV LAMPCODE,#0FEH ;單燈流動的代碼?
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
;----------------------------------------延時程序,鍵盤處理中調(diào)用
KEYPROC:
MOV A,B ;從B寄存器中獲取鍵值
JB ACC.4,KeyStart ;分析鍵的代碼,某位被按下,則該位為1(因為在鍵盤程序中已取反)
JB ACC.5,KeyOver
JB ACC.6,KeyUp
JB ACC.7,KeyDown
AJMP KEY_RET
KeyStart:
SETB StartEnd ;第一個鍵按下后的處理
AJMP KEY_RET
KeyOver:
CLR StartEnd ;第二個鍵按下后的處理
AJMP KEY_RET
KeyUp: SETB UpDown ;第三個鍵按下后的處理
AJMP KEY_RET
KeyDown:
CLR UpDown ;第四個鍵按下后的處理
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 ;否則延時去鍵抖
ORL P1,#11110000B
MOV A,P1
ORL A,#00001111B
CPL A
JZ K_RET
MOV B,A ;確實有鍵按下,將鍵值存入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: ;流水燈的延遲時間
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,則啟動
MOV P0,#0FFH
AJMP LAMPRET ;否則關(guān)閉所有顯示,返回
LampStart:
JB UpDown,LAMPUP ;如果UpDown=1,則向上流動
MOV A,LAMPCODE
RL A ;實際就是左移位而已
MOV LAMPCODE,A?
MOV P0,A
LCALL D500MS
AJMP LAMPRET
LAMPUP:
MOV A,LAMPCODE
RR A ;向下流動實際就是右移
MOV LAMPCODE,A
MOV P0,A
LCALL D500MS
LAMPRET:?
RET
END
2、去抖動獨立按鍵實驗
;按壓(P1.4),D00交替亮滅。按壓(P1.5),D01交替亮滅,加入去抖動功能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)用延時程序,去除抖動
JB P1.4,L1??????????? ;p1.4為0,說明此鍵被按下了
CPL P0.0????????????? ;取反P0.0
L3: JNB P1.4,L3?????? ;直到P1.4釋放后去判斷第二個鍵
L2: JB P1.5,L1??????? ;P1.5為1,返回去繼續(xù)處理P1.4
LCALL D10MS?????????? ;調(diào)用延時程序,去除抖動
? 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???? ;延時的時間一般為5-20ms
???? D1:MOV R6,#100
???? D2:DJNZ R6,D2
???? DJNZ R7,D1
???? RET
?END
3、獨立按鍵實驗
;按壓(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直控鍵盤按鈕流水燈加11CODE_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??; 初始點亮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???; 延時10ms
?ACALL?DELAYMS???; 延時去抖
?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:
; 延時子程序
; 傳入?yún)?shù):R7 --- 延時值(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%