📄 library.asm
字号:
MOV LCDCOL,A
CJNE R2,#16,LCDCHNASCDEMO_1 ;显示16个汉字(LCD一行)
MOV LCDCOL,#0 ;第0列
LCDCHNASCDEMO_2:
MOV DPTR,#ASCFIXEDBMAP ;确定字符字模块首地址
MOV LCDXPG,#2 ;第2页
MOV LCDCHR,R2 ;汉字代码:0
LCALL LCDCHNASCWR ;调用LCD中文ASC写程序
INC R2
MOV A,R2
RL A
RL A
RL A
SUBB A,#128 ;多行显示,使用相同的R2,调整LCDCOL值
MOV LCDCOL,A
CJNE R2,#32,LCDCHNASCDEMO_2 ;显示16个汉字(LCD一行)
;向LCD写一个中文ASC字符的例子
;MOV LCDXPG,#04H ;第4页
;MOV LCDCOL,#70H ;第70H列
;MOV LCDCHR,#07H ;汉字代码:7
;MOV DPTR,#ASCSONGBMAP ;确定字符字模块首地址
;LCALL LCDCHNASCWR ;调用LCD中文ASC写程序
MOV R2,#0 ;字符编码
MOV LCDCOL,#0 ;第0列
LCDCHNASCDEMO_3:
MOV DPTR,#ASCSONGBMAP ;确定字符字模块首地址
MOV LCDXPG,#4 ;第4页
MOV LCDCHR,R2 ;汉字代码:0
LCALL LCDCHNASCWR ;调用LCD中文ASC写程序
INC R2
MOV A,R2
RL A
RL A
RL A
MOV LCDCOL,A
CJNE R2,#16,LCDCHNASCDEMO_3 ;显示16个汉字(LCD一行)
MOV LCDCOL,#0 ;第0列
LCDCHNASCDEMO_4:
MOV DPTR,#ASCSONGBMAP ;确定字符字模块首地址
MOV LCDXPG,#6 ;第6页
MOV LCDCHR,R2 ;汉字代码:0
LCALL LCDCHNASCWR ;调用LCD中文ASC写程序
INC R2
MOV A,R2
RL A
RL A
RL A
SUBB A,#128 ;多行显示,使用相同的R2,调整LCDCOL值
MOV LCDCOL,A
CJNE R2,#32,LCDCHNASCDEMO_4 ;显示16个汉字(LCD一行)
RET
;********************************
; 中文显示演示程序
;
; 注:中文字符建议在偶数页上显示
;********************************
LCDCHNDEMO:
MOV R2,#0 ;汉字代码从0开始
MOV LCDCOL,#0 ;第0列
LCDCHNDEMO_1:
MOV LCDXPG,#0 ;第0页
MOV LCDCHR,R2 ;汉字代码
LCALL LCDCHNWR ;调用LCD中文写程序
INC R2
MOV A,R2
RL A
RL A
RL A
RL A
MOV LCDCOL,A
CJNE R2,#8,LCDCHNDEMO_1
MOV LCDCOL,#0 ;第0列
LCDCHNDEMO_2:
MOV LCDXPG,#2 ;第2页
MOV LCDCHR,R2 ;汉字代码
LCALL LCDCHNWR ;调用LCD中文写程序
INC R2
MOV A,R2
RL A
RL A
RL A
RL A
SUBB A,#128 ;直接使用上一行的LCDCOL,必须减去128列
MOV LCDCOL,A
CJNE R2,#16,LCDCHNDEMO_2
;向LCD写一个中文字符的例子
;MOV LCDXPG,#04H ;第4页
;MOV LCDCOL,#70H ;第70H列
;MOV LCDCHR,#07H ;汉字代码:7
;LCALL LCDCHNWR ;调用LCD中文写程序
MOV LCDCOL,#0 ;第0列
LCDCHNDEMO_3:
MOV LCDXPG,#4 ;第4页
MOV LCDCHR,R2 ;汉字代码
LCALL LCDCHNWR ;调用LCD中文写程序
INC R2
MOV A,R2
RL A
RL A
RL A
RL A
MOV LCDCOL,A
CJNE R2,#24,LCDCHNDEMO_3
MOV LCDCOL,#0 ;第0列
LCDCHNDEMO_4:
MOV LCDXPG,#6 ;第6页
MOV LCDCHR,R2 ;汉字代码
LCALL LCDCHNWR ;调用LCD中文写程序
INC R2
MOV A,R2
RL A
RL A
RL A
RL A
SUBB A,#128 ;直接使用上一行的LCDCOL,必须减去128列
MOV LCDCOL,A
CJNE R2,#32,LCDCHNDEMO_4
RET
;********************************
; 128X64LCD全屏显示程序
;********************************
LCDDISPSCRN:
MOV LCDXPG,#10111000B ;LCD第0页
MOV LCDCNT,#08 ;128X64LCD屏可显示8页
LCDDISPSCRN_LP:
MOV LCDCMD,LCDXPG
LCALL LCDPRL0 ;LCD左半屏指令写
LCALL LCDPRR0
MOV LCDCMD,#01000000B ;LCDCOL=00,第0列
LCALL LCDPRL0 ;LCD左半屏指令写
LCALL LCDPRR0 ;LCD右半屏指令写
MOV R1,#64 ;LCD左半屏64列
LCDDISPSCRN_LLP:
CLR A
MOVC A,@A+DPTR
MOV LCDDAT,A
LCALL LCDPRL1 ;LCD左半屏数据写
INC DPTR
DJNZ R1,LCDDISPSCRN_LLP
MOV R1,#64 ;LCD右半屏64列
LCDDISPSCRN_RLP:
CLR A
MOVC A,@A+DPTR
MOV LCDDAT,A
LCALL LCDPRR1 ;LCD右半屏数据写
INC DPTR
DJNZ R1,LCDDISPSCRN_RLP
INC LCDXPG ;LCD下一页
DJNZ LCDCNT,LCDDISPSCRN_LP
RET
;********************************
; LCD字符显示程序(使用RAM)
;********************************
LCDDISPLAYRAM:
MOV A,@R0
CJNE A,#0FFH,LCDDISPLAYRAM_0 ;LCD显示是否结束
RET ;是,则返回
LCDDISPLAYRAM_0:
MOV LCDBYTE0,A
INC R0
MOV LCDBYTE1,@R0
INC R0
MOV LCDBYTE2,@R0
INC R0
MOV A,LCDBYTE0
ANL A,#07H
MOV LCDXPG,A
MOV A,LCDBYTE1
ANL A,#0FH
RL A ;左移3位(即: X8)
RL A
RL A
MOV LCDCOL,A
MOV LCDCHR,LCDBYTE2
MOV A,LCDBYTE0
SWAP A
ANL A,#03H
PUSH DPH ;LCD字符显示缓冲区指针入栈
PUSH DPL
CJNE A,#0,LCDDISPLAYRAM_1
;以下为英文ASCII字符处理程序
LCALL LCDASCIIWR ;向LCD写一个英文ASCII字符
SJMP LCDDISPLAYRAM_4
LCDDISPLAYRAM_1:
CJNE A,#1,LCDDISPLAYRAM_2
;以下为中文ASCFIXED字符处理程序
MOV DPTR,#ASCFIXEDBMAP
LCALL LCDCHNASCWR ;向LCD写一个ASCFIXED字符
SJMP LCDDISPLAYRAM_4
LCDDISPLAYRAM_2:
CJNE A,#2,LCDDISPLAYRAM_3
;以下为中文ASCSONG字符处理程序
MOV DPTR,#ASCSONGBMAP
LCALL LCDCHNASCWR ;向LCD写一个ASCSONG字符
SJMP LCDDISPLAYRAM_4
LCDDISPLAYRAM_3:
;以下为中文字符处理程序
LCALL LCDCHNWR ;向LCD写一个中文字符
LCDDISPLAYRAM_4:
POP DPL ;LCD字符显示缓冲区指针出栈
POP DPH
SJMP LCDDISPLAYRAM
;********************************
; LCD字符显示程序(使用FLASH ROM)
;********************************
LCDDISPLAY:
CLR A
MOVC A,@A+DPTR
CJNE A,#0FFH,LCDDISPLAY_0 ;LCD显示是否结束
RET ;是,则返回
LCDDISPLAY_0:
MOV LCDBYTE0,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV LCDBYTE1,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV LCDBYTE2,A
INC DPTR
MOV A,LCDBYTE0
ANL A,#07H
MOV LCDXPG,A
MOV A,LCDBYTE1
ANL A,#0FH
RL A ;左移3位(即: X8)
RL A
RL A
MOV LCDCOL,A
MOV LCDCHR,LCDBYTE2
MOV A,LCDBYTE0
SWAP A
ANL A,#03H
PUSH DPH ;LCD字符显示缓冲区指针入栈
PUSH DPL
CJNE A,#0,LCDDISPLAY_1
;以下为英文ASCII字符处理程序
LCALL LCDASCIIWR ;向LCD写一个英文ASCII字符
SJMP LCDDISPLAY_4
LCDDISPLAY_1:
CJNE A,#1,LCDDISPLAY_2
;以下为中文ASCFIXED字符处理程序
MOV DPTR,#ASCFIXEDBMAP
LCALL LCDCHNASCWR ;向LCD写一个ASCFIXED字符
SJMP LCDDISPLAY_4
LCDDISPLAY_2:
CJNE A,#2,LCDDISPLAY_3
;以下为中文ASCSONG字符处理程序
MOV DPTR,#ASCSONGBMAP
LCALL LCDCHNASCWR ;向LCD写一个ASCSONG字符
SJMP LCDDISPLAY_4
LCDDISPLAY_3:
;以下为中文字符处理程序
LCALL LCDCHNWR ;向LCD写一个中文字符
LCDDISPLAY_4:
POP DPL ;LCD字符显示缓冲区指针出栈
POP DPH
SJMP LCDDISPLAY
;===================================================
; LCD绘点子程序
; 2002/3/1
;===================================================
;***************************
;屏幕绘点子程序
;***************************
LCD_WDOT:
MOV A,LCDLNE ;读行地址寄存器
ANL A,#7FH ;屏蔽点标志位
MOV B,#8 ;8点行/页
DIV AB ;A为页地址,B为点在对应页的位置
ORL A,#0B8H ;设置页面地址
MOV LCDCMD,A
LCALL LCDPRL0 ;指令写
LCALL LCDPRR0 ;指令写
INC B ;B加1,作为循环控制量
SETB C ;设置点数据
CLR A ;A=0
LCD_WDOT1:
RLC A ;带C左移
DJNZ B,LCD_WDOT1 ;循环,直到将点数据移到指定位置
PUSH ACC ;点数据入栈
MOV A,LCDCOL ;读列寄存器
CLR C
SUBB A,#40H ;列地址减64
JC LCD_WDOT2 ;< 0为左半屏显示区域
MOV LCDCOL,A ;>=0为右半屏显示区域
;右半屏绘点
MOV LCDCMD,LCDCOL
ORL LCDCMD,#40H ;设置列地址值
LCALL LCDPRR0 ;指令写
LCALL LCDPRR2 ;数据读(空读)
LCALL LCDPRR2 ;数据读
MOV A,LCDLNE
MOV C,ACC.7 ;取点的显示值
POP ACC ;点在指定页面的位置
JNC LCD_WDOT11 ;=0消点,跳转
ORL A,LCDDAT ;将绘点数据1写入当前显示数据
LJMP LCD_WDOT12
LCD_WDOT11:
CPL A ;点位置数据取反
ANL A,LCDDAT ;将消点数据0写入当前显示数据
LCD_WDOT12:
MOV LCDDAT,A ;存为显示数据
MOV LCDCMD,LCDCOL ;设置列地址值
ORL LCDCMD,#40H ;计算列地址指令
LCALL LCDPRR0 ;指令写
LCALL LCDPRR1 ;数据写
RET
;左半屏绘点
LCD_WDOT2:
MOV LCDCMD,LCDCOL ;设置列地址值
ORL LCDCMD,#40H ;计算列地址指令
LCALL LCDPRL0 ;指令写
LCALL LCDPRL2 ;数据读(空读)
LCALL LCDPRL2 ;数据读
MOV A,LCDLNE
MOV C,ACC.7 ;取点的显示值
POP ACC ;点在指定页面的位置
JNC LCD_WDOT21 ;=0消点,跳转
ORL A,LCDDAT ;将绘点数据1写入当前显示数据
LJMP LCD_WDOT22
LCD_WDOT21:
CPL A ;点位置数据取反
ANL A,LCDDAT ;将消点数据0写入当前显示数据
LCD_WDOT22:
MOV LCDDAT,A ;存为显示数据
MOV LCDCMD,LCDCOL ;设置列地址值
ORL LCDCMD,#40H ;计算列地址指令
LCALL LCDPRL0 ;指令写
LCALL LCDPRL1 ;数据写
RET
;***************************
;屏幕绘直线子程序
;***************************
LCD_WLINE:
MOV R6,#00H ;列地址
MOV R7,#0B6H ;点标志/行位置54
LCD_WLINE_1:
MOV LCDCOL,R6 ;列地址设置
MOV LCDLNE,R7 ;行地址设置
LCALL LCD_WDOT
INC R6
CJNE R6,#80H,LCD_WLINE_1 ;全屏未显示完,循环继续
RET
;============================
;屏幕绘点演示程序
;============================
LCDPLOT:
MOV R6,#00H ;列地址
MOV R7,#80H ;点标志/行位置
LCDPLOT_LP1:
MOV LCDCOL,R6 ;列地址设置
MOV LCDLNE,R7 ;行地址设置
LCALL LCD_WDOT
INC R6
INC R7
CJNE R7,#0C0H,LCDPLOT_LP1 ;半屏未显示完,循环继续
LCDPLOT_LP2:
DEC R7
MOV LCDCOL,R6 ;列地址设置
MOV LCDLNE,R7 ;行地址设置
LCALL LCD_WDOT
INC R6
CJNE R7,#80H,LCDPLOT_LP2 ;半屏未显示完,循环继续
LCALL DELAY
;屏幕消点
MOV R6,#00H ;列地址
MOV R7,#00H ;点标志/行位置
LCDPLOT_LP3:
MOV LCDCOL,R6 ;列地址设置
MOV LCDLNE,R7 ;行地址设置
LCALL LCD_WDOT
INC R6
INC R7
CJNE R7,#040H,LCDPLOT_LP3 ;半屏未显示完,循环继续
LCDPLOT_LP4:
DEC R7
MOV LCDCOL,R6 ;列地址设置
MOV LCDLNE,R7 ;行地址设置
LCALL LCD_WDOT
INC R6
CJNE R7,#00H,LCDPLOT_LP4 ;半屏未显示完,循环继续
LCALL DELAY
RET
;===================================================
; PCF8563 I2C总线实时时钟(RTC)操作
; 2001/12/27
;===================================================
;********************************
; 读取PCF8563 RTC时间
;********************************
PCF8563RCV:
MOV R0,#I2CDBUF
MOV @R0,#02H ;器件内部时间寄存器首址(从秒开始读)
MOV SLA,#PCF8563
MOV I2CNUMBYT,#1 ;连续写1个字节
LCALL I2CWRNBYT ;执行I2C器件写操作
MOV SLA,#PCF8563
MOV I2CNUMBYT,#7 ;连续读取7个字节
LCALL I2CRDNBYT
;处理获取的时间值
MOV R0,#I2CDBUF
MOV A, @R0 ;取秒字节
ANL A,#7FH ;屏蔽无效位
MOV @R0,A
INC R0
MOV A, @R0 ;取分钟字节
ANL A,#7FH ;屏蔽无效位
MOV @R0,A
INC R0
MOV A, @R0 ;取小时字节
ANL A,#3FH ;屏蔽无效位
MOV @R0,A
INC R0
MOV A, @R0 ;取天字节
ANL A,#3FH ;屏蔽无效位
MOV @R0,A
INC R0
MOV A, @R0 ;取星期字节
ANL A,#07H ;屏蔽无效位
MOV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -