?? 鍵盤.asm
字號:
鍵盤子程序
;;;;;;;;;;;;;;;;;;;;;
INPUT_DATE EQU P1.2
INPUT_CLOCK EQU P1.3
CHECK_1 EQU P1.4
CHECK_2 EQU P3.3
DATE_6 EQU 55H ;替換R6
DATE_7 EQU 56H ;替換R7
;使用到寄存器R0,R1 作為間接尋址
ORG 0013H ;中斷1的調用
LJMP LOOP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:
MOV R1,#09H ;
PACE: CLR INPUT_DATE ;初始化74LS164使它的Q0~Q7電位為0
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE
CLR RS1 ;選擇工作寄存器組
CLR RS0
SETB IT1 ;設置為中斷1為跳沿觸發
SETB EA ;打開總中斷開關
SETB EX1 ;打開中斷1
CLR EX0
CLR ET0
CLR ET1
MOV SP,#60H
SJMP START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LOOP1: CLR EX1 ;關閉中斷
MOV R0,#30H ;初始化R0
SETB CHECK_2 ;;為CHECK_2輸入數據做準備
LCALL WAIT ;延時消抖
JB CHECK_2,STATION1 ;判斷是否按下鍵
MOV R1,#09H
PACE5: SETB INPUT_DATE ;初始化74LS164使它的Q0~Q7電位為1
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE5
CLR A ;清零的目的是用A做計數
SETB CHECK_2 ;;為CHECK_2輸入數據做準備
CLR INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
JNB CHECK_2,LOOP2 ;;;;;;;;;;;;JNB CHECK_2,LOOP2;;;;;;;;;;;;;;;
SETB CHECK_2 ;;為CHECK_2輸入數據做準備
LOOP3:SETB INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
SETB CHECK_2 ;;為CHECK_2輸入數據做準備
JNB CHECK_2,LOOP2
SJMP LOOP3
LOOP2: MOV DATE_6,A ;使用到DATE_6寄存器
XRL A,#08H ;功能鍵識別區
JZ KEY14
MOV A,DATE_6
XRL A,#01H ;功能區鍵識別按下的是數字鍵
JZ STATION1
MOV A,DATE_6
XRL A,#02H ;功能區鍵識別按下的是數字鍵
JZ STATION1
;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV A,DATE_6 ;此區跳往查表區
XRL A,#03H
JZ X1 ;跳往POCESS處理
MOV A,DATE_6
XRL A,#04H
JZ X2
MOV A,DATE_6
XRL A,#05H
JZ X3
MOV A,DATE_6
XRL A,#06H
JZ X4
MOV A,DATE_6
XRL A,#07H
JZ X5
STATION1:
MOV R1,#09H
PACE_1: CLR INPUT_DATE ;初始化74LS164使它的Q0~Q7電位為0
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE_1
RETI ;返回中斷
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
X1:
RETI
X2:
RETI ;功能鍵區查表
X3:
RETI
X4:
RETI
X5:
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY14: SETB CHECK_2 ;;為CHECK_2輸入數據做準備
JNB CHECK_2,KEY14 ;防止按下數據輸入鍵不放
;LJMP SPEAKE ;;;;;;////////////////////
KEY0:
;此區為輸錄數字區
MOV R1,#09H
SETB CHECK_1
SETB CHECK_2
PACE1: CLR INPUT_DATE ;初始化74LS164使它的Q0~Q7電位為0
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE1
KEY1: SETB CHECK_1 ;;為CHECK_1輸入數據做準備
SETB CHECK_2;;為CHECK_2輸入數據做準備
JNB CHECK_1,KEY2 ;判斷鍵區
JNB CHECK_2,KEY8 ;判斷鍵區
SJMP KEY1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY2: LCALL WAIT ;延時消抖
SETB CHECK_1 ;為CHECK_1輸入數據做準備
JB CHECK_1,KEY1 ;;;;;;;;;;;;;;;;;;;;;;;;;;
;LJMP SPEAKL ;;;;;;;;;;///////////////////////////
MOV R1,#09H
PACE2: SETB INPUT_DATE ;該區使74LS164使它的Q0~Q7電位為1
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE2
KEY3: CLR A ;數字鍵區掃描
SETB CHECK_1
CLR INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
SETB CHECK_1 ;為CHECK_1輸入數據做準備
JNB CHECK_1,KEY17 ;跳往KEY17數字處理區(如果此時CHECK_1為0則A里的數為0)
CLR A
KEY4: SETB INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
SETB CHECK_1 ;為CHECK_1輸入數據做準備
JNB CHECK_1,KEY17 ;跳往KEY17數字處理區
JB CHECK_1,KEY4
KEY17: SETB CHECK_1 ;為CHECK_1輸入數據做準備
JNB CHECK_1,KEY17 ;防止手按在按鍵未放開
JB CHECK_1,KEY7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY8: SETB CHECK_2 ;為CHECK_2輸入數據做準備
LCALL WAIT
JB CHECK_2,KEY1 ;;;;;;;;;;;;;;;;;;;;;;;
MOV R1,#09H
PACE3: SETB INPUT_DATE ;該區使74LS164使它的Q0~Q7電位為1
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE3
KEY9: MOV A,#08H ;功能鍵區數字鍵掃描
SETB CHECK_2
CLR INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
SETB CHECK_2 ;為CHECK_2輸入數據做準備
JNB CHECK_2,KEY18 ;跳往KEY18按鍵處理區(如果此時CHECK_2為0則A里的數為0)
SETB INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
SETB CHECK_2 ;為CHECK_2輸入數據做準備
JNB CHECK_2,KEY18
KEY20: SETB INPUT_DATE
CLR INPUT_CLOCK
SETB INPUT_CLOCK
INC A
SETB CHECK_2 ;為CHECK_2輸入數據做準備
JNB CHECK_2,SAMSUNG
JB CHECK_2,KEY20
KEY21: LJMP KEY0 ;防止按下功能鍵區不是數字鍵
KEY18: SETB CHECK_2 ;為CHECK_2輸入數據做準備
JNB CHECK_2,KEY18 ;防止手按在按鍵未放開
JB CHECK_2,KEY7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SAMSUNG: SETB CHECK_2 ;為CHECK_2輸入數據做準備
JNB CHECK_2,SAMSUNG ;防止手按在按鍵未放開
JB CHECK_2,SAMSUNG10
SAMSUNG10:XRL A,#0FH ;判斷停止輸入數據;
JZ KEY13 ;判斷停止輸入數據;
JNZ KEY21 ;判斷停止輸入數據;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY7: CLR IE1 ;軟件清除中斷1請求標志位 (保險)
MOV @R0,A ;此時@R0里的數據就是所按的數字鍵代表的數字
INC R0 ;使R0指向下一字節
;LCALL LCM ;調用顯示
MOV A,R0
XRL A,#38H ;防止益處///////////////
JZ KEY13
LJMP KEY0
KEY13: CLR IE1 ;軟件清除中斷1請求標志位 (保險)
MOV R1,#040H
MOV A,R0
KEY16: DEC R0
MOV A,@R0 ;倒序存放數據區
MOV @R1,A
INC R1
CJNE R0,#030H, KEY16
MOV R1,#09H
PACE_2: CLR INPUT_DATE ;初始化74LS164使它的Q0~Q7電位為0
CLR INPUT_CLOCK
SETB INPUT_CLOCK
DJNZ R1,PACE_2
RETI ;返回中斷
;;;;;;;;;;;;;;;;;;;;;;;
WAIT: MOV DATE_7,#142 ;延時子程序 (35.074ms)
WAIT1: MOV DATE_6,#122
WAIT2:DJNZ DATE_6,WAIT2
DJNZ DATE_7,WAIT1
RET
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -