|
(二) 單板機(jī)監(jiān)控程序簡(jiǎn)介 1. 什么是監(jiān)控程序? 單板機(jī)的底層管理程序,直接面向硬件,接受鍵盤(pán)命令,執(zhí)行基本操作,并向用戶提供子程序模塊。 * 研究監(jiān)控程序,才能深入了解單板機(jī)的工作原理。 * 監(jiān)控程序是運(yùn)用匯編語(yǔ)言的良好實(shí)例,分析監(jiān)控程序可以學(xué)到許多基本的編程方法和軟硬結(jié)合的系統(tǒng)設(shè)計(jì)技術(shù)。 * 了解監(jiān)控程序,以便調(diào)用其中的子程序,提高編程效率, 2. 單板機(jī)監(jiān)控程序的基本功能 * 系統(tǒng)初始化。 * 提供人機(jī)對(duì)話界面,接受鍵盤(pán)命令,顯示操作結(jié)果。 * 執(zhí)行鍵盤(pán)命令: 1) 狀態(tài)設(shè)置 2) 檢查、修改存儲(chǔ)器的內(nèi)容或I/O端口的輸出。 3) 與上位機(jī)進(jìn)行串行通信,傳送數(shù)據(jù)或下載程序。 4) 存儲(chǔ)器數(shù)據(jù)塊傳送。 5) 運(yùn)行用戶程序,可單步調(diào)試。 * 提供常用運(yùn)算、A/D轉(zhuǎn)換及打印驅(qū)動(dòng)等子程序。 3. 監(jiān)控程序占用的資源 * 監(jiān)控程序存放在2764的前4k,0000H-0FFFH。 * 工作寄存器用0區(qū) * 監(jiān)控狀態(tài)標(biāo)志使用內(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)場(chǎng)保護(hù)。 ORG 000BH ;T0中斷入口 000B 02200B LJMP 200BH ;轉(zhuǎn)至200BH,向用戶開(kāi)放。 ORG 0013H ;INT1入口 0013 022013 LJMP 2013H ;轉(zhuǎn)至2013H,向用戶開(kāi)放。 ORG 001BH ;T1中斷入口 001B 020BB2 LJMP 0BB2H ;監(jiān)控占用,轉(zhuǎn)去打印控制。 ORG 0023H ;串行口中斷入口 0023 022023 LJMP 2023H ;轉(zhuǎn)至2023H,向用戶開(kāi)放。 ; ;***************** 監(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)控用的存儲(chǔ)單元清零。 0048 F52F MOV 2FH,A ;狀態(tài)標(biāo)志單元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)控開(kāi)始,等待鍵命令 ******************* 0052 1204AF MONITOR: LCALL KEY_SCAN ;掃描鍵盤(pán)。 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 ;命令功能參見(jiàn)附錄五。 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)控標(biāo)志置待命狀態(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.51hei.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 ;顯示準(zhǔn)備 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 ;***** 延時(shí)子程序 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 |