(二) 單板機監(jiān)控程序簡介
1. 什么是監(jiān)控程序?
單板機的底層管理程序,直接面向硬件,接受鍵盤命令,執(zhí)行基本操作,并向用戶提供子程序模塊。
* 研究監(jiān)控程序,才能深入了解單板機的工作原理。
* 監(jiān)控程序是運用匯編語言的良好實例,分析監(jiān)控程序可以學到許多基本的編程方法和軟硬結(jié)合的系統(tǒng)設(shè)計技術(shù)。
* 了解監(jiān)控程序,以便調(diào)用其中的子程序,提高編程效率,
2. 單板機監(jiān)控程序的基本功能
* 系統(tǒng)初始化。
* 提供人機對話界面,接受鍵盤命令,顯示操作結(jié)果。
* 執(zhí)行鍵盤命令:
1) 狀態(tài)設(shè)置
2) 檢查、修改存儲器的內(nèi)容或I/O端口的輸出。
3) 與上位機進行串行通信,傳送數(shù)據(jù)或下載程序。
4) 存儲器數(shù)據(jù)塊傳送。
5) 運行用戶程序,可單步調(diào)試。
* 提供常用運算、A/D轉(zhuǎn)換及打印驅(qū)動等子程序。
3. 監(jiān)控程序占用的資源
* 監(jiān)控程序存放在2764的前4k,0000H-0FFFH。
* 工作寄存器用0區(qū)
* 監(jiān)控狀態(tài)標志使用內(nèi)部2FH單元。
* 數(shù)據(jù)緩沖區(qū)使用30H-3FH
* 堆棧棧底 40H
* 顯示緩沖區(qū)7EH-79H。
* 使用INT0及T1中斷。
4. 監(jiān)控主程序分析
ORG 0000H
0000 00 NOP
0001 0130 AJMP START
0003 C2A8 CLR EX0 ;INT0入口,用于單步執(zhí)行。
0005 02039C LJMP PUSH_REG ;轉(zhuǎn)去單步現(xiàn)場保護。
ORG 000BH ;T0中斷入口
000B 02200B LJMP 200BH ;轉(zhuǎn)至200BH,向用戶開放。
ORG 0013H ;INT1入口
0013 022013 LJMP 2013H ;轉(zhuǎn)至2013H,向用戶開放。
ORG 001BH ;T1中斷入口
001B 020BB2 LJMP 0BB2H ;監(jiān)控占用,轉(zhuǎn)去打印控制。
ORG 0023H ;串行口中斷入口
0023 022023 LJMP 2023H ;轉(zhuǎn)至2023H,向用戶開放。
;
;***************** 監(jiān)控程序初始化 *********************
ORG 0030H
0030 7879 START: MOV R0,#79H ;監(jiān)控初始化程序段
0032 7601 MOV @R0,#01H ;送“CPU-51”顯示代碼。
0034 08 INC R0
0035 7605 MOV @R0,#05H
0037 08 INC R0
0038 7614 MOV @R0,#14H
003A 08 INC R0
003B 761C MOV @R0,#1CH
003D 08 INC R0
003E 7610 MOV @R0,#10H
0040 08 INC R0
0041 760C MOV @R0,#0CH
0043 758140 MOV SP,#40H ;堆棧指針初值設(shè)為40H。
0046 7400 MOV A,#00H ;監(jiān)控用的存儲單元清零。
0048 F52F MOV 2FH,A ;狀態(tài)標志單元2FH清零。
004A 7830 MOV R0,#30H ;30H—3FH單元清零。
004C 7910 MOV R1,#10H
004E F6 START0: MOV @R0,A
004F 08 INC R0
0050 D9FC DJNZ R1,START0
;**************** 監(jiān)控開始,等待鍵命令 *******************
0052 1204AF MONITOR: LCALL KEY_SCAN ;掃描鍵盤。
0055 7005 JNZ KEY_PROC ;有鍵則轉(zhuǎn)鍵處理。
0057 1204D0 LCALL DISPLAY ;維持顯示。
005A 0152 AJMP MONITOR
005C 120340 KEY_PROC: LCALL OFF_DISP ;鍵命令處理程序。
005F 120460 K_P1:LCALL KEY_GET
0062 20E40D JB ACC.4,COMMAND;功能鍵,轉(zhuǎn)命令處理。
0065 857D7E MOV 7EH,7DH ;數(shù)字鍵,送顯示。
0068 857C7D MOV 7DH,7CH
006B 857B7C MOV 7CH,7BH
006E F57B MOV 7BH,A
0070 015F AJMP K_P1
0072 5407 COMMAND: ANL A,#07H ;命令分析。
0074 F8 MOV R0,A ;命令功能參見附錄五。
0075 23 RL A
0076 28 ADD A,R0
0077 90007B MOV DPTR,#FUNCTION
007A 73 JMP @A+DPTR ;用散轉(zhuǎn)指令轉(zhuǎn)相應(yīng)分支。
007B 02024E FUNCTION: LJMP MOV ;轉(zhuǎn)MOV命令分支。
007E 0200A0 LJMP DOWN ;轉(zhuǎn)MON命令分支。
0081 0201B1 LJMP WRIT ;轉(zhuǎn)WRI命令分支。
0084 020161 LJMP READ ;轉(zhuǎn)RDS命令分支。
0087 0200AF LJMP EXEC ;轉(zhuǎn)EXE命令分支。
008A 0200E6 LJMP EXAM ;轉(zhuǎn)EXA命令分支。
008D 020209 LJMP F ;轉(zhuǎn) [F] 命令分支。
0090 0201FB LJMP UP ;轉(zhuǎn)USE命令分支。
;********************* MON 命令分支 *********************
ORG 00A0H
00A0 11A5 DOWN: ACALL DOWND
00A2 020052 LJMP MONITOR
00A5 120340 DOWND: LCALL OFF_DISP
00A8 757E10 MOV 7EH,#10H
00AB 752F00 MOV 2FH,#00H ;監(jiān)控標志置待命狀態(tài)0。
00AE 22 RET ;即 78H位 = 0 。
;************* EXE 命令分支 *****************
00AF 307803 EXEC: JNB 78H,EXECD ;待命方式0,轉(zhuǎn)連續(xù)執(zhí)行。
00B2 020520 LJMP STEP ;待命方式1,轉(zhuǎn)單步執(zhí)行。
00B5 11BE EXECD: ACALL EXECS
00B7 020052 LJMP MONITOR
轉(zhuǎn)載須保留地址:http://www.torrancerestoration.com/mcu/291.html
;*************** USE 命令分支 ***********************
01FB 5100 UP: ACALL UPS
01FD 020052 LJMP MONITOR
0200 D278 UPS: SETB 78H
0202 120340 LCALL OFF_DISP
0205 757E1B MOV 7EH,#1BH
0208 22 RET
;*************** 取鍵值子程序 ************************
ORG 0460H
KEY_GET:ACALL KEY_SCAN
JNZ K_G1
LCALL DISPLAY
AJMP KEY_GET
K_G1: LCALL DISPLAY
LCALL DISPLAY
LCALL KEY_SCAN
JNZ K_G2
LCALL DISPLAY
AJMP KEY_GET
K_G2: MOV R2,#0FEH
MOV R4,#00H
K_G3: MOV DPTR,#6000H
MOV A,R2
MOVX @DPTR,A
MOV A,P1
JB ACC.0,LINE1
MOV A,#00H
AJMP K_G_END
LINE1: JB ACC.1,LINE2
MOV A,#08H
AJMP K_G_END
LINE2:JB ACC.2,NEXT_COL
MOV A,#10H
K_G_END: ADD A,R4
PUSH ACC
KEY_FREE: LCALL DISPLAY
ACALL KEY_SCAN
JNZ KEY_FREE
POP ACC
RET
NEXT_COL: INC R4
MOV A,R2
JNB ACC.7,KEY_NEXT
RL A
MOV R2,A
AJMP K_G3
KEY_NEXT: AJMP KEY_GET
KEY_SCAN: MOV DPTR,#6000H
MOV A,#00H
MOVX @DPTR,A
MOV A,P1
CPL A
ANL A,#07H
RET
;*************** 顯示掃描子程序 ******************
DIS0000: MOV A,#0FFH ;顯示準備
MOV DPTR,#8000H
MOVX @DPTR,A
MOV R0,#79H
MOV R3,#01H
AJMP DIS0001
ORG 04D0H
DISPLAY: AJMP DIS0000
DIS0001: MOV A,R3
DISPLAY1: MOV DPTR,#6000H
04D6 F0 MOVX @DPTR,A
04D7 E6 MOV A,@R0
04D8 2419 ADD A,#19H
04DA 83 MOVC A,@A+PC
04DB 908000 MOV DPTR,#8000H
04DE F0 MOVX @DPTR,A
04DF 91EB ACALL DELAY
04E1 08 INC R0
04E2 EB MOV A,R3
04E3 20E504 JB ACC.5,DISPLAY2
04E6 23 RL A
04E7 FB MOV R3,A
04E8 81D3 AJMP DISPLAY1
04EA 22 DISPLAY2: RET
;***** 延時子程序
04EB 7F02 DELAY: MOV R7,#02H
04ED 7EFF DELAY1: MOV R6,#0FFH
04EF DEFE DELAY2: DJNZ R6,DELAY2
04F1 DFFA DJNZ R7,DELAY1
04F3 22 RET
;*******字形碼表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H
DB 90H,88H,83H,0C6H,0A1H,86H,8EH,8CH,0DEH
DB 0F3H,91H,0BFH,7FH,0FFH,00H,0AFH,0A3H,00H
DB 0CH,0C1H,40H,79H,24H,30H,19H,12H,02H,78H,00H,10H