📄 st7920pp.asm
字号:
MOV LCDRAMADD_SL, A
MOV A, LCDRAMADD_SH
ADDC A, #00H
MOV LCDRAMADD_SH,A
NOP
NOP
CLR C
MOV A,LCDRAMADD_SL
ADDC A, LCDPageChar_Num
MOV LCDRAMADD_SL, A
MOV A, LCDRAMADD_SH
ADDC A, #00H
MOV LCDRAMADD_SH,A
NOP
NOP
CLR C
MOV A, LCDUnDis_Num ;剩余待显示字数减LCD每页显示字数
SUBB A, LCDPageChar_Num
MOV LCDUnDis_Num, A
NOP
NOP
LCALL WLCD_OnePage ;写下一页
NOP
NOP
INC LCDPage_Num ;LCD当前页号加一
TurnDown_OnePage1:NOP
NOP
RET
;********************************************************************
;模块名称:WLCD_OnePage (写一页LCD)
;入口参数:
;出口参数:
;堆栈使用:1BYTE
;********************************************************************
CountAllChar_Num: NOP
NOP
INC LCDRAMADD_SL ;起始地址后一字节为字节长度值
;(第一字节为信息条数,第二字节为字节长度值,之后为信息数据)
MOV DPL, LCDRAMADD_SL
MOV DPH, LCDRAMADD_SH
MOVX A, @DPTR ;读取本条信息字节长度
MOV B, #02H ;将本条信息字节长度除以2,转换为本条信息字数(双字节)
DIV AB
MOV LCDUnDis_Num,A
MOV A,B
CJNE A, #00H,CountAllChar_Num1 ;判断是否有余数,若有,本条信息字数加一
NOP
NOP
RET
CountAllChar_Num1:NOP
NOP
INC LCDUnDis_Num
NOP
NOP
RET
;********************************************************************
;模块名称:St7920_BUSY (LCD忙信号检测程序)
;出口参数:用ACC但不修改,只修改DDRAM_Address记录当前LCD地址
;使用堆栈:1BYTE
;********************************************************************
St7920_BUSY: NOP ;TEST WRITE BUSY
CLR EN_ST7920
St7920_BUSY1: NOP
NOP ;RS_ST7920=0, R/W=1, EN_ST7920为高电平,读忙标志和AC值
MOV ST7920_PORT, #0FFH ;写入0FFH,读入方式
NOP
NOP
CLR RS_ST7920
SETB RW_ST7920
NOP
SETB EN_ST7920
NOP
NOP
MOV A,ST7920_PORT
CLR EN_ST7920
NOP
CLR RW_ST7920
SETB RS_ST7920
JB ACC.7,St7920_BUSY1
ORL A,#80H
MOV DDRAM_Address,A
NOP
RET
;********************************************************************
;模块名称:LCDHasNextPage (还有下一页)
;入口参数:ST7920_COM(待写命令字)
;出口参数:DDRAM_Address="9FH"
;堆栈使用:1BYTE
;********************************************************************
LCDHasNextPage:NOP
NOP
MOV ST7920_COM, #0DH ; 设定显示状态,屏幕整体显示,游标显示关,游标位置反白开
LCALL WLCD_Command ; D="1" C="0" B="1"
NOP
NOP
MOV ST7920_COM, #9FH
LCALL WLCD_Command
NOP
NOP
MOV ST7920_DataH, #20H
MOV ST7920_DataL, #10H
LCALL WLCD_DDRAM
NOP
NOP
MOV ST7920_COM, #9FH
LCALL WLCD_Command
NOP
NOP
RET
;********************************************************************
;模块名称:LCDNoNextPage (无下一页)
;入口参数:ST7920_COM(待写命令字)
;出口参数:DDRAM_Address="9FH"
;堆栈使用:1BYTE
;********************************************************************
LCDNoNextPage: NOP
NOP
MOV ST7920_COM, #0DH ; 设定显示状态,屏幕整体显示,游标显示关,游标位置反白开
LCALL WLCD_Command ; D="1" C="0" B="1"
NOP
NOP
MOV ST7920_COM, #9FH
LCALL WLCD_Command
NOP
NOP
MOV ST7920_DataH, #20H
MOV ST7920_DataL, #08H
LCALL WLCD_DDRAM
NOP
NOP
MOV ST7920_COM, #9FH
LCALL WLCD_Command
NOP
NOP
RET
;********************************************************************
;模块名称:ClearLCD (清除本屏显示)
;入口参数:ST7920_COM(待写命令字)
;出口参数:DDRAM_Address="80H" 地址计数器AC=“00H”
;堆栈使用:1BYTE
;********************************************************************
Clear_LCD: NOP
NOP
MOV ST7920_COM, #0CH ; 设定显示状态,屏幕整体显示,游标显示关,游标位置反白关
LCALL WLCD_Command ; D="1" C="0" B="0"
NOP
NOP
MOV ST7920_COM, #01H ; 清除显示,将DDRAM填满20H,AC="00" I/D="1"
LCALL WLCD_Command
NOP
NOP
NOP
NOP
RET
;********************************************************************
;模块名称:WLCD_Command (原始命令定写入程序)
;入口参数:ST7920_COM(待写命令字)
;出口参数:结束后将当前LCD地址保存在DDRAM_Address中,不修改其它资源
;堆栈使用:1BYTE
;********************************************************************
WLCD_Command: NOP
NOP
LCALL St7920_BUSY
CLR EN_ST7920 ;RS=0, R/W=0, EN下降沿
MOV A, ST7920_COM ;向ST7920写入命令字
CLR RS_ST7920
CLR RW_ST7920
NOP
SETB EN_ST7920
MOV ST7920_PORT,A
CLR EN_ST7920
SETB RS_ST7920
NOP
NOP
RET
;********************************************************************
;模块名称:WLCD_DDRAM (显示数据区位码写入程序)
;入口参数:DAT(待显示字符区位码)
;出口参数:该程序结束后DDRAM_ADD保存着刚写入字符的地址,非当前地址
;堆栈使用:1BYTE
;如果显示地址超出了第一行范围,地址自动调整为第下一行第一字
;********************************************************************
WLCD_DDRAM: NOP
NOP
LCALL St7920_BUSY ;TEST WRITE BUSY
MOV A,ST7920_DataH ;向DDRAM写入第一字节
SETB RS_ST7920
CLR RW_ST7920
NOP
SETB EN_ST7920
MOV ST7920_PORT,A
NOP
CLR EN_ST7920
NOP
SETB RW_ST7920
CLR RS_ST7920
LCALL St7920_BUSY ;TEST WRITE BUSY
MOV A,ST7920_DataL ;向DDRAM写入第二字节
SETB RS_ST7920
CLR RW_ST7920
NOP
SETB EN_ST7920
MOV ST7920_PORT,A
NOP
CLR EN_ST7920
NOP
SETB RW_ST7920
CLR RS_ST7920
MOV A, DDRAM_Address
CJNE A, #87H,WLCD_DDRAM1 ;判断第一行是否写满,若是将DDRAM地址转到第二行
MOV ST7920_COM, #90H
LCALL WLCD_Command
AJMP WLCD_DDRAM0
WLCD_DDRAM1: NOP
NOP
CJNE A, #97H,WLCD_DDRAM2 ;判断第二行是否写满,若是将DDRAM地址转到第三行
MOV ST7920_COM, #88H
LCALL WLCD_Command
AJMP WLCD_DDRAM0
WLCD_DDRAM2: NOP
NOP
CJNE A, #8FH,WLCD_DDRAM3 ;判断第三行是否写满,若是将DDRAM地址转到第四行
MOV ST7920_COM, #98H
LCALL WLCD_Command
AJMP WLCD_DDRAM0
WLCD_DDRAM3: NOP
NOP
CJNE A, #9EH,WLCD_DDRAM0 ;判断第四行是否写满,若是将DDRAM地址转到第一行
MOV ST7920_COM, #80H
LCALL WLCD_Command
WLCD_DDRAM0: NOP
NOP
RET
END
;******************************************************************************
;
; ST7920控制器与MPU 接口程序结束
;
;******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -