📄 loadprogram.asm
字号:
PUTENTER: MOV A, #0DH ;
LCALL PUTCHAR ;
MOV A, #0AH ;
LCALL PUTCHAR ;
RET
;
;
;****************************************************
;* *
;* 显示查表 *
;* *
;****************************************************
; DPRT 显示信息首址
; A 内容数据
; B 内容长度
DISPMUL: MUL AB ;
LCALL DPTRADDC ;
LCALL DISPINFO ; 显示
RET
;
;
;****************************************************
;* *
;* 显示存储器 ADDER *
;* *
;****************************************************
; R2 内容高地址 R1 内容低地址
; 显示成 XXXX:
DISPADD: LCALL PUTENTER ; 显示回车
MOV A, R2 ;
LCALL DISPHEX ;
MOV A, R1 ;
LCALL DISPHEX ;
MOV A, #3AH ;
LCALL PUTCHAR ; 发送 :
MOV A, #20H ;
LCALL PUTCHAR ;
MOV A, #20H ;
LCALL PUTCHAR ;
RET
;
;
;****************************************************
;* *
;* 显示BIN *
;* *
;****************************************************
; A 内容是 BCD 码
; 显示成 XXXXXXXX 二进制格式
DISPBIN: MOV R3, #08H ; 字节计数
BINRL: RLC A ; 得到每一位
JC ONE ;
MOV A, #30H ;
LCALL PUTCHAR ; 发送 0
LJMP BINRL1 ;
;
ONE: MOV A, #31H ;
LCALL PUTCHAR ; 发送 1
BINRL1: DJNZ R3, BINRL ; 是否结束
MOV A, #42H ;
LCALL PUTCHAR ; 发送 B
RET
;
;
;****************************************************
;* *
;* 单字节十六进制转十进制 *
;* *
;****************************************************
; A: 待转换的单字节十六进制数
; A: 高四位的 ASCII 码 R4: 低四位的ASCII码
HEX2ASC: MOV R4, A ; 暂存待转换的单字节十六进制数
LCALL HEX2ASC1 ; 转换低四位
XCH A, R4 ; 存放低四位的 ASCII 码
SWAP A ; 准备转换高四位
HEX2ASC1: ANL A, #0FH ; 将累加器的低四位转换成 ASCII 码
ADD A, #90H ;
DA A ;
ADDC A, #40H ;
DA A ;
CLR C ;
RET ;
;
;
;****************************************************
;* *
;* 显示HEX *
;* *
;****************************************************
; A 内容是 BCD 码
; 显示成 XX 十六进制格式
DISPHEX: LCALL HEX2ASC ;
LCALL PUTCHAR ;
MOV A, R4 ;
LCALL PUTCHAR ;
RET ;
;
;
;****************************************************
;* *
;* 显示 RAMASC *
;* *
;****************************************************
; 显示 RAM or ROM 内容
; R0 内容是 R2R1 地址的内容
; ASC 方式
; 格式: 0123456789ABCDEF
DISPRAMASC: MOV R6, #08H ;
MOV R0, A ;
RAMSPACE: MOV A, #20H ; 显示 8 个空格
LCALL PUTCHAR ;
DJNZ R6, RAMSPACE ;
MOV A, R0 ;
SUBB A, #10H ; 指针减一列长度
MOV R0, A ;
MOV R6, #10H ; 一列计数
RAMASC: MOV A, B ;
JZ ROMASC ; ROM RAM 处理
MOV A, @R0 ;
LJMP ROMRAMASC ;
;
ROMASC: MOV A, R0 ;
MOVC A, @A+DPTR ;
;
ROMRAMASC: MOV R4, A ;
CLR C ;
SUBB A, #2EH ; 过虑小于 #2EH ASC
MOV A, R4 ;
JNC RAMASC1 ;
RAMASC0: MOV A, #2EH ;
LJMP RAMASC2 ;
;
RAMASC1: CLR C ;
MOV A, R4 ;
SUBB A, #7FH ; 过虑大于 #7FH ASC
MOV A, R4 ;
JNC RAMASC0 ;
RAMASC2: LCALL PUTCHAR ; 显示 ASC
INC R0 ;
DJNZ R6, RAMASC ;
RET
;
;
;****************************************************
;* *
;* 显示 RAM ROM *
;* *
;****************************************************
; 显示 RAM or ROM 内容
; R2 内容高位地址 R1 内容低位地址
; R0 内容是 R2R1 地址的内容
; HEX 方式
; 格式: XXXX: 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F
DISPROMRAM: LCALL DISPADD ; 显示地址
MOV R6, #10H ; 一行计数
READRAMLOOP: MOV A, B ;
JZ READROM ;
MOV A, @R0 ;
LJMP READRAMROMEND ;
;
READROM: MOV A, R0 ;
MOVC A, @A+DPTR ;
READRAMROMEND: INC R0 ;
LCALL DISPHEX ; 显示 HEX
MOV A, R0 ;
MOV A, R6 ;
XRL A, #09H ;
JNZ RAMROM16 ; 8 列处理
MOV A, #2DH ; 显示 -
LCALL PUTCHAR ;
LJMP RAMROM8 ;
;
RAMROM16: MOV A, #20H ; 显示空格
LCALL PUTCHAR ;
RAMROM8: DJNZ R6, READRAMLOOP ;
MOV A, R0 ;
LCALL DISPRAMASC ;
LCALL WATDOG ;
MOV A, R1 ;
ADD A, #10H ;
MOV R1, A ;
JNZ DISPROMRAM ; 是否结束
INC DPH ;
MOV A, DPH ;
MOV R2, A ;
RET
;
;
;****************************************************
;* *
;* 初始化串口(COMMAND) *
;* *
;****************************************************
; 初始化串口数据
INITCOMMAND: CLR A ;
MOV RXBUFFLEN, A ; 初始化
CLR RXCOMMOKFLAG ;
MOV RXBUFFTAIL, #RXBUFFSTART;
CLR RXCOMMFLAG ; 起动 COMMAND 接收
LCALL PUTENTER ; 显示回车
RET
;
;
;****************************************************
;* *
;* 读等待 *
;* *
;****************************************************
; 死读缓冲区一直到有数据
READWAIT: MOV RXBUFFTAIL, #RXBUFFSTART;
CLR A ;
MOV A, RXBUFFLEN ;
READWAIT1: LCALL WATDOG ;
MOV A, RXBUFFTAIL ;
XRL A, #RXBUFFSTART ;
JZ READWAIT1 ; 接收缓冲区空 LOOP
READLOOP: LCALL WATDOG ;
LCALL PUTCOMMSPACE ;
JNB RXCOMMOKFLAG, READLOOP ; 命令接收不成功不处理
MOV R0, #RXBUFFSTART ;
RET ;
;
;
;****************************************************
;* *
;* 比较单个字符 *
;* *
;****************************************************
; R0 内容为地址
; R4 内容为源
; A 内容为零: 成功; 非零: 失败
COMPASC: MOV A, @R0 ;
XRL A, R4 ; 是否大写
JZ COMPASCOUT ;
MOV A, R4 ; 是否小写
ADD A, #20H ;
MOV R4, A ;
MOV A, @R0 ;
XRL A, R4 ;
COMPASCOUT: RET
;
;
;****************************************************
;* *
;* 是否数字 *
;* *
;****************************************************
; R0 内容为地址
; R4 内容为源
; A 内容为零: 成功; 非零: 失败
ISDIGIT: MOV A, @R0 ;
CLR C ;
SUBB A, #30H ;
JC ISDIGITOUT ;
MOV A, @R0 ;
CLR C ;
SUBB A, #3AH ;
JNC ISDIGITOUT ;
CLR A ;
RET ;
;
ISDIGITOUT: CLR A ;
DEC A ;
RET ;
;
;
;****************************************************
;* *
;* DPTR ADDC *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -