?? ledh.asm
字號:
; 使用獨立按鍵K1,K2,K4,K4實現流水燈花樣變化
; P1.4 開始按此鍵則燈開始流動(由左向右)
;P1.5 停止按此鍵則停止流動所有燈為滅
; P1.6 向左按此鍵則燈反向流動由右向左
;1.7 向右按此鍵則燈正向流動由左向右
UpDown EQU 00H ;上下行標志
StartEnd EQU 01H ;起動及停止標志
LAMPCODE EQU 21H ;存放流動的數據代碼
ORG 0000H
AJMP MAIN
ORG 30H
MAIN:
MOV SP,#5FH
MOV P0,#0FFH
CLR UpDown ;啟動時處于向上的狀態
CLR StartEnd ;啟動時處于停止狀態
MOV LAMPCODE,#0FEH ;單燈流動的代碼
LOOP:
ACALL KEY ;調用鍵盤程序
JNB F0,LNEXT ;如果無鍵按下,則繼續
ACALL KEYPROC ;否則調用鍵盤處理程序
LNEXT:
ACALL LAMP ;調用燈顯示程序
AJMP LOOP ;反復循環,主程序到此結束
;---------------------------------------
DELAY:
MOV R7,#100
D1: MOV R6,#100
DJNZ R6,$
DJNZ R7,D1
RET
;----------------------------------------延時程序,鍵盤處理中調用
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 ;設置有鍵按下的標志
K_RET:
ORL P1,#11110000B ;此處循環等待鍵的釋放
MOV A,P1
ORL A,#00001111B
CPL A
JZ K_RET1 ;直到讀取的數據取反后為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 ;否則關閉所有顯示,返回
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
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -