?? 綜合實驗.asm
字號:
;系統晶振是 11.0592 MHz
Z8279 EQU 7fffH ;8279 狀態/命令口地址
D8279 EQU 77ffH ;8279 數據口地址
LEDMOD EQU 00H ;左邊輸入 八位字符顯示
;外部譯碼鍵掃描方式,雙鍵互鎖
LEDFEQ EQU 2FH ;掃描速率
LEDCLS EQU 0C1H ;清除顯示 RAM
LEDWR0 EQU 80H ;設定的將要寫入的顯示RAM地址
READKB EQU 40H ;讀 FIFO RAM 地址 0 的命令字
ORG 0000H
AJMP START
ORG 001BH ;INT T1 入口地址
AJMP INT_T1
ORG 0040H
START: MOV 30H,#00H
MOV 31H,#1H
MOV 32H,#0FH
MOV 34H,#00H
MOV SP,#60H
LCALL INIT8279 ;初始化8279
MOV R3,#0H ;時
MOV R2,#0H ;分
MOV R1,#0H ;秒
MOV R0,#0H ;10毫秒
MOV R6,#0FFH ;標志
MOV TMOD,#10H
MOV TL1,#00H ;10毫秒的時間常數
MOV TH1,#0DCH
LCALL DIS_mS
SETB ET1
SETB EA ;允許中斷
WAIT:
LCALL GETKEY ;讀鍵盤
CJNE A,#0FFH,CONT ;判斷是否有鍵輸入
MOV A,B
CJNE A,#0H,KEY_G ;輸入鍵是'0',轉CLEAR_T
LCALL CLEAR_T
KEY_G: CJNE A,#0aH,KEY_D ;輸入鍵是'*',轉START_T
LCALL START_T
KEY_D: CJNE A,#0bH,KEY_P ;輸入鍵是'#',轉STOP_T
LCALL STOP_T
KEY_P: CJNE A,#1H,KEY_E ;輸入鍵是'1',轉SET_T
LCALL SET_T
KEY_E: CJNE A,#2H,CONT ;輸入鍵是'2',轉MONITOR
LCALL MONITOR
CONT: CJNE R6,#0FFH,WAIT ;若無秒標志則循環
LCALL DENG
LCALL DISPLAY ;顯示時間
MOV R6,#0 ;清標志
SJMP WAIT ;循環
MONITOR: PUSH ACC
MOV A,34H
CPL A
MOV 34H,A
pop acc
RET
CLEAR_T: ;時間清零子程序
CLR TR1 ;關計數器
MOV R3,#0H ;小時清零
MOV R2,#0H ;分鐘清零
MOV R1,#0H ;秒清零
MOV 32H,#0FH
MOV R0,#0H ;10毫秒清零
MOV R6,#0FFH ;置秒標志
LCALL DIS_mS ;顯示毫秒
RET
START_T: ;電子鐘計時子程序
SETB TR1
RET
STOP_T: ;電子鐘停止計時子程序
CLR TR1
RET
SET_T: ;設置初值子程序
CLR TR1 ;關計數器
MOV R4,#7
LCALL GETWORD ;讀小時數
CJNE A,#0FFH,INVALID ;判斷輸入合法性
MOV A,B
ADD A,#232
JC INVALID ;判斷輸入小時值 < 24
MOV A,B
MOV B,#10
DIV AB
SWAP A
ADD A,B
MOV R3,A ;保存輸入的值
MOV R4,#5
LCALL GETWORD ;讀分鐘數
CJNE A,#0FFH,INVALID ;判斷輸入合法性
MOV A,B
ADD A,#196
JC INVALID ;判斷輸入分鐘數 < 60
MOV A,B
MOV B,#10
DIV AB
SWAP A
ADD A,B
MOV R2,A ;保存輸入的值
MOV R4,#3
LCALL GETWORD ;讀秒
CJNE A,#0FFH,INVALID ;判斷輸入合法性
MOV A,B
ADD A,#196
JC INVALID ;判斷輸入分鐘值 < 60
MOV A,B
MOV B,#10
DIV AB
SWAP A
ADD A,B
MOV R1,A ;保存輸入的值
;MOV R4,#1
; LCALL GETWORD ;讀10毫秒數
;CJNE A,#0FFH,INVALID ;判斷輸入合法性
;MOV A,B
;MOV B,#10
;DIV AB
;SWAP A
; ADD A,B
; MOV R0,A ;保存輸入的值
AJMP SET_TOK
INVALID:
LCALL CLEAR_T ;時間清零
SET_TOK:LCALL DIS_mS ;顯示10毫秒
LCALL DISPLAY ;顯示時間
RET
GETWORD: ;讀數子程序
WKEY1: LCALL GETKEY ;讀鍵盤
CJNE A,#0FFH,WKEY1 ;無鍵輸入,則再讀
MOV A,B
ADD A,#0f6H
JC ERROR1 ;判斷輸入是否大于9
MOV A,B
; SUBB A,#30H
;JC ERROR1 ;判斷輸入是否小于0
MOV R5,A
LCALL DISLED ;顯示輸入的字符
MOV B,#10
MUL AB
PUSH ACC ;保存輸入的值
WKEY2: LCALL GETKEY ;讀鍵盤
CJNE A,#0FFH,WKEY2 ;無鍵輸入則再讀
MOV A,B
ADD A,#0f6H ;判斷輸入是否大于9
JC ERROR2
MOV A,B
; SUBB A,#30H ;判斷輸入是否小于0
;JC ERROR2
DEC R4
MOV R5,A
LCALL DISLED ;顯示輸入的字符
MOV B,A
POP ACC
ADD A,B
MOV B,A ;把得到的值存在B
MOV A,#0FFH ;置合法輸入標志
AJMP KEYOK
ERROR2: POP ACC
ERROR1: MOV A,#0 ;置非法輸入標志
KEYOK: RET
INIT8279: ;8279初始化子程序
PUSH DPH ;保存現場
PUSH DPL
PUSH ACC
LCALL DELAY ;延時
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置鍵盤掃描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除 LED 顯示
MOVX @DPTR,A
POP ACC ;恢復現場
POP DPL
POP DPH
RET
;讀取鍵盤子程序
;輸入: 無 ; 輸出: B: 讀到的鍵碼 A: 按鍵的標志
GETKEY: PUSH DPH ;保存現場
PUSH DPL
PUSH PSW
MOV DPTR,#Z8279
MOVX A,@DPTR ;讀8279狀態
ANL A,#07H ;屏蔽D7-D3
JNZ GETVAL ;判斷是否有鍵輸入
MOV A,#0H ;置標志(無鍵輸入)
SJMP NKBHIT
GETVAL: MOV A,#READKB ;讀 FIFO RAM 命令
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR ;讀鍵
ANL A,#3FH ;屏蔽 SHIFT 和 CTRL 鍵
MOV DPTR,#KEYCODE ;鍵碼表起始地址
MOVC A,@A+DPTR ;查表
MOV B,A ;置返回鍵值
MOV A,#0FFH ;置標志(有鍵輸入)
NKBHIT: POP PSW ;恢復現場
POP DPL
POP DPH
RET
;顯示字符子程序
;輸入: R4,位置 R5,值
DISLED: PUSH DPH ;保存現場
PUSH DPL
PUSH ACC
MOV A,#LEDWR0 ;置顯示起始地址
ADD A,R4 ;加位置偏移量
MOV DPTR,#Z8279
MOVX @DPTR,A ;設定顯示位置
MOV DPTR,#LEDSEG ;置顯示常數表起始位置
MOV A,R5
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;顯示數據
POP ACC ;恢復現場
POP DPL
POP DPH
RET
DELAY: ;延時子程序
PUSH 0 ;保存現場
PUSH 1
MOV 0,#0H
DELAY1: MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢復現場
POP 0
RET
DIS_mS:
MOV A,R0
ANL A,#0FH
MOV R5,A
MOV R4,#0
; LCALL DISLED ;顯示10毫秒低位
MOV A,R0
SWAP A ;高低半字節交換
ANL A,#0FH
MOV R5,A
MOV R4,#1
; LCALL DISLED ;顯示10毫秒高位
RET
INT_T1: ;INT_T1中斷服務子程序
PUSH DPH ;保護現場
PUSH DPL
PUSH ACC
PUSH PSW
CLR TR1
MOV TL1,#00H ;10毫秒定時常數
MOV TH1,#0DCH
SETB TR1
MOV A,R0
ADD A,#1 ;10毫秒數加 1
DA A
MOV R0,A
LCALL DIS_mS ;顯示10毫秒
CJNE R0,#0,EXIT ;判斷10毫秒=0
MOV R6,#0FFH ;置秒標志
CJNE R1,#59H,SECOND ;判斷秒=59
MOV R1,#99H
CJNE R2,#59H,MINUTE ;判斷分=59
MOV R2,#99H
CJNE R3,#23H,HOUR ;判斷時=23
MOV R3,#99H
HOUR:
MOV A,R3
ADD A,#1 ;時加1
DA A
MOV R3,A
MINUTE:
MOV A,R2
ADD A,#1 ;分加1
DA A
MOV R2,A
SECOND:
MOV A,R1
ADD A,#1 ;秒加1
DA A
MOV R1,A
EXIT:
POP PSW ;恢復現場
POP ACC
POP DPL
POP DPH
RETI ;中斷返回
DISPLAY:
MOV A,R3
ANL A,#0FH
ADD A,#10H
MOV R5,A
MOV R4,#6
LCALL DISLED ;顯示小時低位
MOV A,R3
SWAP A
ANL A,#0FH
MOV R5,A
MOV R4,#7
LCALL DISLED ;顯示小時高位
MOV A,R2
ANL A,#0FH
ADD A,#10H
MOV R5,A
MOV R4,#4
LCALL DISLED ;顯示分鐘低位
MOV A,R2
SWAP A
ANL A,#0FH
MOV R5,A
MOV R4,#5
LCALL DISLED ;顯示分鐘高位
MOV A,R1
ANL A,#0FH
ADD A,#10H
MOV R5,A
MOV R4,#2
LCALL DISLED ;顯示秒低位
MOV A,R1
SWAP A
ANL A,#0FH
MOV R5,A
MOV R4,#3
LCALL DISLED ;顯示秒高位
MOV A,33H
ANL A,#0FH
ADD A,#10H
MOV R5,A
MOV R4,#0
LCALL DISLED ;顯示倒計時低位
MOV A,33H
SWAP A
ANL A,#0FH
MOV R5,A
MOV R4,#1
LCALL DISLED ;顯示倒計時高位
RET
DENG:
PUSH ACC
PUSH DPH
PUSH DPL
PUSH PSW
MOV A,#0ffH
CJNE A,34H,PASS
MOV P1,#0FH
LJMP BACK
PASS: MOV A,#0H
DJNZ 32H,PASS0
MOV 32H,#0EH
PASS0: ADD A,32H
DA A
MOV 33H,A
MOV R7,31H
DJNZ R7,PASS2
MOV A,30H
MOV DPTR,#LIST
MOVC A,@A+DPTR
CJNE A,#0FFH,PASS1
MOV 30H,#0H
MOV 31H,#1H
LJMP BACK
PASS1: MOV P1,A
MOV A,30H
INC A
MOV 30H,A
MOVC A,@A+DPTR
MOV R7,A
MOV A,30H
INC A
MOV 30H,A
PASS2:
MOV 31H,R7
BACK: POP PSW
POP DPL
POP DPH
POP ACC
RET
LIST:
DB 96H, 7H,9fH, 1H,96H, 1H,9fH, 1H,96H, 1H,9FH, 1H,6H,2H
DB 69H,7H,6fH,1H,69H,1H,6FH,1H,69H,1H,6FH,1H,09H,2H,0FFH
;LED顯示常數表
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,087H ;'0.,1.,2.,3.,4.,5.,6.,7.'
DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H ;'8.,9.,A.,B.,C.,D.,E.,F.'
DB 6DH,02H,08H,00H,59H,0FH,76H ;'U,-,_, ,I,O,P, '
;鍵盤鍵碼表
KEYCODE:DB 1H,4H,7H,0aH,0ffH,0ffH,0ffH,0ffH
DB 2H,5H,8H,0H, 0ffH,0ffH,0ffH,0ffH
DB 3H,6H,9H,0bH,0ffH,0ffH,0ffH,0ffH
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -