📄 串口调试.asm
字号:
CLR CLK ;
SETB CLK ;
YW_BT6: MOV C,BIT6 ;BIT6
MOV R11,C ;
MOV G11,C
MOV B11,C
CLR CLK ;
SETB CLK ;
YW_BT5: MOV C,BIT5 ;BIT5
MOV R11,C ;
MOV G11,C
MOV B11,C
CLR CLK ;
SETB CLK ;
YW_BT4: MOV C,BIT4 ;BIT4
MOV R11,C ;
MOV G11,C
MOV B11,C
CLR CLK ;
SETB CLK ;
YW_BT3: MOV C,BIT3 ;BIT3
MOV R11,C ;
MOV G11,C
MOV B11,C
CLR CLK ;
SETB CLK ;
YW_BT2: MOV C,BIT2 ;BIT2
MOV R11,C ;
MOV G11,C
MOV B11,C
CLR CLK ;
SETB CLK ;
YW_BT1: MOV C,BIT1 ;BIT1
MOV R11,C ;
MOV G11,C
MOV B11,C
CLR CLK ;
SETB CLK ;
YW_BT0: MOV C,BIT0 ;BIT0
MOV R11,C ;
MOV G11,C
MOV B11,C
CLR CLK ;
SETB CLK ;
INC DPTR
RET ;
;*******************************************************************************
;完成行的开通服务,用74HC163芯片实现行的A;B;C;D信号.
HANG_CE: SETB OE ;CLOSE THE SCREEN
MOV A,HANG_COUNT
CJNE A,HANG,ROW1 ;判断是否是第一行不是的话行加一.是的话行复位一次.
CLR ROW_RST ;行复位
CLR ROW_CLK ;复位脉冲
SETB ROW_CLK ;复位脉冲
RET
ROW1: SETB ROW_RST ;行记数信号.
CLR ROW_CLK
SETB ROW_CLK
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;程序完成单页数据的读入. *
;要求给定文件名:FILE_NAME *
READ_FILE: SETB OE ;CLOSE THE SCREEN *
SETB ROM_CE ; *
CLR ROM_A17 ; *
CLR p4.2 ; *
;MOV AUXR,#02H
MOV DPTR,#000EH ; *
MOV A,FILE_NAME ;将文件名送到A *
MOV B,#04H ;每页有4个控制字节 *
MUL AB ;算出当前文件控制制字节的位置 *
ADD A,DPL ; *
MOV DPL,A ; *
MOV A,B
ADDC A,DPH
MOV DPH,A ;计算好了控制字节的地址 *
MOV R1,#04H ;有四个控制数据 *
MOV R0,#video_mode ;R0指向video_mode地址单元. *
READ_2: MOVX A,@DPTR ; *
MOV @R0,A ; *
INC DPTR ; *
INC R0 ; *
DJNZ R1,READ_2 ;控制字节取完没有. *********************** *
;到此为止已经完成了控制字节的读取.由DPTR0完成. *
INC AUXR1 ;启动DPTR1 *
MOV DPTR,#000EH ;*******************计算点阵数据的起始地址. *
MOV A,PAGE_COUNT ;将文件名送到A *
MOV B,#04H ;每页有4个控制字节 *
MUL AB ;算出当前文件控制制字节的位置 *
ADD A,DPL ; *
MOV DPL,A ; *
READ_3: MOV A,DPH ; *
ADD A,B ; *
MOV DPH,A ;计算好了点阵数据的起始地址*************** *
MOV A,FILE_NAME ;将文件名送到A 准备计算点阵数据的起始地址. *
MOV B,BYTEL ; *
MUL AB ; *
ADD A,DPL ; *
MOV DPL,A ; *
JNC READ_4 ; *
INC DPH ; *
READ_4: MOV A,B ; *
ADD A,DPH ; *
MOV DPH,A ; *
MOV A,FILE_NAME ; *
MOV B,BYTEH ; *
MUL AB ; *
ADD A,DPH ; *
MOV DPH,A ; *
;MOV DPHH,B ;完成了点阵数据地址的计算. *
mov dpl1,bytel ; *
mov dph1,BYTEH ; *
;MOV dptr,#1000h *
;mov A,bytel ; *
;JnZ READ_5
;MOV R2,BYTEH
;DEC R2
;SJMP CR_05
READ_5: MOV R2,BYTEH
cr_05: mov r1,bytel ; *
cr_01: setb ROM_CE ; *
;MOV AUXR,#02H
movx a,@dptr ; *
inc dptr ;DPTR+1 *
push dph ; *
push dpl ; *
clr RAM_CE ; *
;MOV AUXR,#00H
mov dph,dph1 ;交换地址 *
mov dpl,dpl1 ; *
movx @dptr,a ; *
inc dptr ; *
mov dph1,dph ; *
mov dpl1,dpl ; *
pop dpl ; *
pop dph ; *
djnz r1,cr_01 ;判断128个字节写完了没有 *
MOV A,R2
JZ CR_02
dec r2
CJNE r2,#00H,cr_05 ; *
;mov r5,#01;55 ;延时10ms *
cr_02: mov r6,#30h ; *
djnz r6,$ ; *
;djnz r5,cr_02 ; *
;djnz r4,cr_05 ;32K的数据读完了没有 *
nop ; *
INC AUXR1 ;变回DPTR0 *
ret ; *
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;以下是硬件设置子程序. *
;完成硬件长;宽;波特率;屏的颜色(单,双,三);屏号; *
HARD_SETUP: CLR RAM_CE ;选中RAM *
;SETB ROM_A17 ;页地址 *
;SETB P4.2 ;页地址 *
MOV DPTR,#0000H ;接收数据暂存在,0000H地址起的5个地址区 *
mov a,#00h ; *
movx @dptr,a ; *
inc dptr ; *
LCALL SPIN ;读数 *
MOV R1,A ;参数的个数存在R1里. *
HARD_1: LCALL SPIN ;读数 *
MOVX @DPTR,A ;存数 *
INC DPTR ;地址加一 *
DJNZ R1,HARD_1 ; *
LCALL SPIN ; *
CJNE A,#0AAH,HARD_RET ;出错返回 *
LCALL SPIN ; *
CJNE A,SCREEN_NUMBER,HARD_2 ; *
LCALL MCU_RESPONSE_YES ;返回成功信息,是群发的话不返回成功信息. *
SJMP HARD_SAVE ; *
HARD_2: CJNE A,#00H,HARD_RET;是群发吗?是的话直接去保存数据.不要返回成功信息.*
SJMP HARD_SAVE ; *
HARD_SAVE: SETB ROM_A17 ;给定硬件参数存放的叶地址. *
SETB P4.2 ;同上 *
MOV DPTR,#0FF80H ;给定数据存储的地址指向0FF80H *
MOV PAGE_COUNT,#01H ;共一页数据 *
LCALL WRITE_FLASH ;写给定地址起的一页数据,保存硬件参数 *
HARD_RET: RET ; *
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;显示数据下载服务子程序 *
;适合于1/8扫描16折上蛇,上位的数据格式是1行;2行;3行.....接收程序会转换成1/8上蛇*
DOWN_DATA:CLR RAM_CE ;给片选 *
MOV AUXR1,#00H
MOV DPTR,#0000H ;接收数据暂存在,0000H地址起的8个数据区 *
MOV R1,#0EH ;在收最大页数据之前要先收15个数据. *
DOWN1: LCALL SPIN ;读数据 *
MOVX @DPTR,A ; *
INC DPTR ; *
DJNZ R1,DOWN1 ;最后一个数据是最大叶数. *
MOV PAGE_COUNT,A ;把页数暂存在PAGE_COUNT里. *
mov file_count,a
LCALL TEST
MOV R2,A ; *
DOWN2: MOV R1,#04H ;每页有四个控制数据. *
DOWN3: LCALL SPIN ; *
MOVX @DPTR,A ; *
INC DPTR ; *
DJNZ R1,DOWN3 ;一页的四个数据收完没有. *
DJNZ R2,DOWN2 ;把所有显示页的控制数据收完了没有 *
MOV DPH1,DPH ; *
MOV DPL1,DPL ; *
MOV AUXR1,#01H ;选择DPTR1 *
MOV DPH,DPH1 ; *
MOV DPL,DPL1 ; *
INC DPTR ;将下半屏数据的存放首地址算出. *
INC DPTR ;同上 *
;;MOV AUXR1,#00H ;选择DPTR0 ;下蛇的话就开该语句. *
DOWN4: MOV R2,#02H ;分两次收 *
DOWN5: MOV R3,ISR_BYTEH
INC R3 ;还有漏洞++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
;MOV A,ISR_BYTEL
;JZ
DOWN6: MOV R1,ISR_BYTEL ;BYTEL里的数据在INIT里计算好了. *
DOWN7: LCALL SPIN ; *
CPL A
MOVX @DPTR,A ; *
INC DPTR ; *
LCALL SPIN ; *
CPL A
MOVX @DPTR,A ; *
INC DPTR ; *
INC DPTR ;指向下两个单元 *
INC DPTR ; *
DJNZ R1,DOWN7 ; *
DJNZ R3,DOWN7
DOWN8: INC AUXR1 ;第一次执行变为DPTR1第二次执行DPTR0 *
DJNZ R2,DOWN5 ; *
DJNZ PAGE_COUNT,DOWN4 ; *
LCALL SPIN ; *
CJNE A,#0AAH,ISR_RETURN ; *
LCALL SPIN ; *
CJNE A,SCREEN_NUMBER,ISR_RETURN ; *
;LCALL MCU_RESPONSE_yes ;应答计算机数据发送成功. *
;LCALL add_mapping ;调用地址映射处理 *
MOV DPTR,#0000H ;给定FLASH的存放的地址,断电不丢失 * *
CLR ROM_A17 ; *
CLR P4.2 ; *
MOV PAGE_COUNT,#0F0H ;共写255页数据 *
LCALL WRITE_FLASH ;写0000起的一页数据 *
RET ; *
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;以下是串口中断处理子程序(COM_ISR) *
;功能:完成硬件设置数据的接收和显示数据的接收,并把接收的数据保存到FLASH里. *
COM_ISR: CLR OE ;关显示屏 *
induct_1: CJNE A,#0AAH,induct_2 ;判报头的第一个数是不是"55H" *
LCALL SPIN ;读引导码AAH *
induct_2: CJNE A,#55H,induct_3 ;抗干扰处理 *
SJMP INDUCT_6
INDUCT_3: CJNE A,#77H,INDUCT_6
MOV ISP_CONTR,#01100000B
RETI
INDUCT_6: LCALL SPIN ; *
CJNE A,#00H,INDUCT_4 ;判断是否是广播命令是的话进入接收 *
SJMP INDUCT_5 ;是广播命令的话顺执,否是否是自己的数据. *
INDUCT_4:CJNE A,screen_number,ISR_error ;屏号相等的话进入接收否则返回 *
INDUCT_5: LCALL SPIN ; *
CJNE A,#0C1H,data_CODE ;=#C1H调用硬件设置,否则转DATA_CODE *
LCALL HARD_setup ;调用硬件设置子程序.并返回接收结果信息. *
SJMP ISR_RETURN ;准备返回主程序 *
data_CODE: CJNE A,#0D1H,debug ;不是数据下载命令的话,返回. *
LCALL DOWN_DATA ;下载数据 *
SJMP ISR_RETURN ;准备返回主程序 *
debug: CJNE A,#0C2h,ISR_ERROR ;不是数据下载命令的话,返回. *
LCALL screen_debug ;是设计者在调试程序.
SJMP ISR_RETURN ;转到返回子程序.
ISR_error: lcall MCU_RESPONSE_NO ;调用MCU应答发送失败回复 *
ISR_RETURN: MOV SP,#07H ; *
MOV A,#00H ; *
PUSH A ; *
PUSH A ; *
RETI ; *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -