📄 串口调试.asm
字号:
;整个程序不占用片外RAM,用单片机内部扩展的RAM.(更新日志:070125)
;只要用片内时就允许访问内部RAM,只要访问外部时就禁止访问内部.)
;该程序最多能控制单色35个字,双色17个字,三色10个字.要控制点数多的话要扩展外部RAM.
;以下定义是对于控制板(MCU-3)的接口定义(2007-1-29)
;该控制板可以控制32点高度,宽度根据具体情况最大可以控制60个中文字.
;以下是单片机控制引脚的定义.
R11 BIT P1.7 ;红色数据输入
G11 BIT P1.6 ;绿色数据输入
B11 BIT P1.5 ;兰色数据输入
;R21 BIT P4.0
;G21 BIT P4.1
B21 BIT P3.4
CLK BIT P3.3 ;移位脉冲
LAT BIT P3.2 ;数据输入允许低有效
OE BIT P3.5 ;显示控制高电平不显示
;74HC163N的控制信号定义.
ROW_RST BIT P1.3 ;用来复位A;B;C;D.
ROW_CLK BIT P1.4 ;产生A;B;C;D. 上升沿有效
;DS1302的控制信号定义.
TM_DATA BIT p1.0 ;同时有是FLASH地址线. A17
TM_RST BIT P1.1 ;A18
;TM_CLK BIT P4.2 ;A16
;18B20的控制信号定义.
DALLS_DQ BIT P3.4
;红外遥控的信号定义.
;RX_DATA BIT P4.3 ;红外遥控的数据输入.
;SPI_CE BIT P4.3 ;485通信时的输入/输出选择.
;K_IN BIT P4.3 ;屏参数数据的输入接口.
;ROM;RAM的片选信号定义.74HC139双2-4路译码器
RAM_CE BIT P1.2 ;等于0时选中RAM62256,通过CD4069来选择.
ROM_CE BIT P1.2 ;等于1时选中ROM27C2001或W29C020
;ROM_A16 BIT P4.2 ;下次改板时最好改为用P1.1控制
ROM_A17 BIT P1.0
ROM_A18 BIT P1.1
;位定义
BIT0 BIT ACC.0
BIT1 BIT ACC.1
BIT2 BIT ACC.2
BIT3 BIT ACC.3
BIT4 BIT ACC.4
BIT5 BIT ACC.5
BIT6 BIT ACC.6
BIT7 BIT ACC.7
;寄存器定义
ISP_CONTR EQU 0E7H
p4 EQU 0e8H ;对与扩展了内部RAM的单片机有用.
screen_number equ 40h ;显示屏的屏号
screen_kuan_H equ 41h ;显示屏的宽(高位)
screen_KUAN_L equ 42h ;显示屏的宽(低位)
SCREEN_GAO_H equ 43h ;显示屏的高(高位)
SCREEN_GAO_L EQU 44H ;显示屏的高(低位)
file_name EQU 61h ;文件名 ;用来计算报头和数据的地址.
byteH EQU 62H ;字节数 ;表明单个文件的数据个数.(两个字节表示)高位.
byteL EQU 63H ;字节数 ; 低位.
video_mode EQU 65H ;进入模式;一屏数据的进入的方式,同时也是上一屏数据退出的方式.
EXIT_DISPLAY EQU 66H ;退出模式;
SPEED EQU 67H ;进入速度
DISPLAY_TIME EQU 68H ;显示停留时间
DEL1 EQU 6cH ;通用寄存器
DEL2 EQU 6dH ;通用寄存器
MDPH EQU 6EH
MDPL EQU 6FH
ADDRESS EQU 70H
MH EQU 35H
ML EQU 36H
HANG EQU 37H ;当前显示的行寄存器.提供A;B;C;D的开关设置.***1到16行***
PINGKUAN EQU 38H ;屏宽度***128***(((根据实际情况)))
YWKZ EQU 4BH ;屏的移位控制寄存器.每次移多少位寄存器***1***每16行扫完加一
time1 EQU 3ah ;该寄存器的数据表示显示信息字数.1到XX
time2 EQU 3BH ;通用寄存器
dph1 equ 3dh
dpl1 equ 3eh
zd equ 3fh ;防止死机用的
ISR_R0 EQU 50H ;通用寄存器
ISR_R1 EQU 51H ;通用寄存器
PAGE_COUNT EQU 52H ;通用寄存器
FILE_COUNT EQU 71H ;通用寄存器
DEL0 EQU 72H ;通用寄存器
ISR_BYTEL EQU 73H ;
ISR_BYTEH EQU 74H
HANG_COUNT EQU 75H ;
BIT_0 EQU 76H
;AUXR1 EQU 0A2H
;*************************************************
ORG 0000H ; *
SJMP MAIN ;跳到主程序 *
;*************************************************
ORG 0023H ;串口中断入口地址. *
LJMP COM_ISR ;串口中断服务处理程序. *
;*************************************************
MAIN: SETB OE ;CLOSE THE SCREEN
LCALL INIT ;清除显示缓冲区(0000H)起的数据和寄存器初始化,设置串口参数.
WAIT: SETB ROM_CE ;给ROM片选.
CLR ROM_A17 ;给页地址.
CLR p4.2 ;给页地址.
MOV DPTR,#000DH ;DPTR指向000DH
MOVX A,@DPTR ;读取000DH单元的页数据.
CJNE A,#0FFH,RUN_MAIN
;LCALL NO_DATA ;给出无显示数据提示/或者显示当前屏的硬件设置参数.
SJMP WAIT
RUN_MAIN: MOV PAGE_COUNT,A ;读出页数
MOV FILE_COUNT,A
JZ MAIN ;判断是否有显示数据.
MOV FILE_NAME,#00H ;从第一个文件开始显示.
REST: LCALL READ_FILE ;把相应页的控制数据和点阵数据取出到相应的地址.
MOV A,video_mode ;把显示模式取出,选择相应的显示方式.
MODE0: CJNE A,#00H,MODE1 ;是随机显示方式吗?stochastic
MODEN: ;MOV A,FILE_NAME ;以下是随机数产生程序.
;XRL A,#0AAH ;
;ANL A,#03H ;
;SJMP MODE0 ;上面是一个随机数的参生程序
MODE1: CJNE A,#01H,MODE2 ;判断是静止显示方式吗?
LCALL repose_MODE ;静止显示方式
SJMP NEXT_FILE ;显示完了显示下一个文件
MODE2: CJNE A,#02H,MODE3 ;判断是左移显示方式吗?
;LCALL LIFT_MODE ;
SJMP NEXT_FILE ;
MODE3: CJNE A,#03H,MODE4 ;判断是右移显示方式吗?
LCALL right_mode ;
SJMP NEXT_FILE ;
MODE4: CJNE A,#05H,MODE5 ;判断是上移显示方式吗?
MODE5: LCALL UP_MODE ;
SJMP NEXT_FILE ;
NEXT_FILE: INC FILE_NAME ;
;LCALL INIT ;可以实现在每种显示方式之前从黑屏开始.
DJNZ FILE_COUNT,REST;
;LCALL MCU_RESPONSE_YES ;返回接收成功信息.*
SJMP MAIN
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
repose_MODE: CLR RAM_CE ;选中RAM
lcall mv_repose
MOV R4,DISPLAY_TIME ;控制停留时间(速度)
FS23: MOV R3,#10H
FS22: mov dptr,#0000h
MOV HANG_COUNT,HANG ;有8行
FS21: MOV A,SCREEN_KUAN_L;96个点1/8扫描有24个八位的数据.
RL A
MOV R2,A
CLR LAT ;允许数据移位
FS20: MOVX A,@DPTR ;取数
CPL A
LCALL YW_BT7
DJNZ R2,FS20 ;调用送数据子程序.
LCALL HANG_CE ;调用行开通服务程序.
SETB LAT ;数据前面移入的数据.
CLR OE ;开显示
;LCALL PAUSE_DELAY ;亮度延时
DJNZ HANG_COUNT,FS21 ;8行显示完没有
;CLR C ;清除CY标志
;MOV A,DPL ;把DPL送A里.
;SUBB A,#10H ;
;MOV DPL,A ;
DJNZ R3,FS22
DJNZ R4,FS23 ;
ret
mv_repose: mov r5,hang
mov dptr,#0000h
inc auxr1
mov dph,byteh
mov dpl,bytel
mv_rep1:mov a,screen_kuan_l
rl a
mov r6,a
mv_rep0:movx a,@dptr
inc dptr
inc auxr1
movx @dptr,a
inc dptr
inc auxr1
djnz r6,mv_rep0
djnz r5,mv_rep1
ret
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
right_mode:
UP_MODE: CLR RAM_CE;选中RAM
;MOV AUXR,#00H
MOV DPH,BYTEH ;BYTEH,BYTEL里的数据是存放着READ_FILE的原始数据
MOV DPL,BYTEL
INC DPTR
INC DPTR
MOV MDPH,DPH
MOV MDPL,DPL
MOV R3,#02H ;分两次8行移位
UP15: MOV A,HANG
MOV YWKZ,A
UP14: LCALL MOV_UP
MOV R4,SPEED ;控制移位的速度
UP13: MOV R1,#08H
UP12: MOV DPTR,#0000H
MOV HANG_COUNT,HANG ;有8行
UP11: CLR LAT ;允许数据移位
MOV A,SCREEN_KUAN_L ;192个点/24个八位的数据.1/8扫描
RL A
MOV R2,A
UP10: MOVX A,@DPTR ;取数
CPL A
LCALL YW_BT7
DJNZ R2,UP10 ;调用送数据子程序.
LCALL HANG_CE ;调用行开通服务程序.
SETB LAT ;数据前面移入的数据.
CLR OE ;开显示
DJNZ HANG_COUNT,UP11;8行显示完没有
DJNZ R1,UP12
DJNZ R4,UP13
MOV A,SCREEN_KUAN_L ;计算下一行的起始地址
RL A ;
ADD A,MDPL ;
MOV MDPL,A ;
MOV A,MDPH ;
ADDC A,#00H ;
MOV MDPH,A ;
DJNZ YWKZ,UP14 ;判断8行移完没有
MOV MDPH,BYTEH
MOV MDPL,BYTEL
DJNZ R3,UP15
MOV A,DISPLAY_TIME
CJNE A,#00H,UP_REP
RET
UP_REP: LCALL repose_MODE
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
MOV_UP:
MOV DPTR,#0000H
MOV R0,#80H
MOV A,SCREEN_KUAN_L
RR A
MOV R5,A
MV_UP0: MOVX A,@DPTR
MOV @R0,A
INC DPTR
INC R0
MOVX A,@DPTR
MOV @R0,A
INC DPTR
INC DPTR
INC DPTR
INC R0
DJNZ R5,MV_UP0
MOV DPTR,#0000H
MV_UP1:PUSH DPH ;保存DPTR地址 DPTR=0000H
PUSH DPL ;
INC AUXR1 ;
POP DPL ;计算下一行的起始地址.
POP DPH ;
MOV A,SCREEN_KUAN_L ;
RL A ;
ADD A,DPL ;
MOV DPL,A ;
MOV A,DPH ;
ADDC A,#00H ;
MOV DPH,A ; DPTR=0018H
MOV A,HANG ;
DEC A ;
MOV R5,A ;
MV_UP3:MOV A,SCREEN_KUAN_L
RL A
MOV R6,A
MV_UP2:MOVX A,@DPTR ;取出数据区的第一个数据
INC DPTR ;地址加一
INC AUXR1 ;变DPTR地址.
MOVX @DPTR,A ;把数据移到上一行的数据区
INC DPTR ;地址加一
INC AUXR1 ;变回地址
DJNZ R6,MV_UP2
DJNZ R5,MV_UP3
MOV DPH,MDPH
MOV DPL,MDPL
MOV A,SCREEN_KUAN_L
RR A
;RR A
MOV R6,A
MOV R0,#80H ;取出数据区的第一个数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -