衡阳派盒市场营销有限公司

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>匯編編程>

獨立按鍵控制程序分享

大小:0.11 MB 人氣: 2017-09-06 需要積分:0

1、獨立按鍵控制流水燈花樣

; 使用獨立按鍵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

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,不做處理,轉P1.5,否則說明有鍵按下
LCALL D10MS?????????? ;調用延時程序,去除抖動
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,返回去繼續處理P1.4
LCALL D10MS?????????? ;調用延時程序,去除抖動
? 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????? ;按下按鍵開關K1,取反一次P0.0(燈亮),再按一下滅
JNB P1.5,L3????????? ;按下按鍵開關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)??; 設置棧指針
?MOV?P0,#0FEH??; 初始點亮LED P00
?MOV?KEY_V,#03H??; 初始鍵值
KEY_CHKSW:????; 循環檢測按鍵是否按下?????
?ACALL?SCAN_KEY??; 輸入按鍵狀態
?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??; 保存按鍵狀態
?ACALL?PROC_KEY??;
?SJMP?KEY_CHKSW
;===============================================================================
SCAN_KEY:????
; 掃描按鍵
; 傳入參數:無
; 返回值:A --- 按鍵狀態
?CLR?A
?MOV?C,K1
?MOV?ACC.0,C
?MOV?C,K2
?MOV?ACC.1,C
?RET
;===============================================================================?
PROC_KEY:
; 按鍵處理子程序
; 傳入參數: 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:
; 延時子程序
; 傳入參數: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%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      肯博百家乐的玩法技巧和规则 | 百家乐官网游戏机说明书| 怎么看百家乐的路| 澳门百家乐官网游戏下| 百家乐官网如何视频| 大发888黄金版| 百家乐龙虎的投注法| 百家乐官网笑话| 赌场风云主题曲| 大发888娱乐场下载 df888ylc3403 | 来博| 7位百家乐扑克桌| 百家乐最稳妥的打法| 试用的百家乐官网软件| 西青区| 百家乐赌场| 百家乐高手的心得| 多伦多百家乐官网的玩法技巧和规则 | 金冠娱乐城网站| 大发888扑克| 中华百家乐官网娱乐城| 饶平县| 88娱乐城网址| 哪家百家乐最好| 百家乐中P代表| 百家乐官网好不好| 金杯百家乐官网的玩法技巧和规则| gt百家乐官网平台假吗| 百家乐官网下注瀛钱法| 塔城市| 阿瓦提县| 大家赢娱乐城| 新世纪娱乐| 大地娱乐城| 如皋市| 百家乐官网算号软件| 浦北县| 百家乐官网棋牌技巧| 精英百家乐官网现金网| 百家乐官网网络赌博地址| 百家乐官网赌博破解方法|