|
;********************************************************************
;*
;* 子程序名: LCDM(HD128×64).asm
;* 程序名称: 128×64液晶显示模块(HD61202/3芯片)子程序
;* 版本: 1.0
;* 适用 MCU 型号: ATmega16 (适用 AVR 所有型号)
;* 入口条件:
;* 出口条件:
;* 使用资源:
;*
;* 程序功能:
;* 本程序是
;* 注释:
;* 本程序是
;*
;* 编作者:
;* 编作者 E-Mail: PTZSW@163.COM
;* 编制日期: 2004年12月18日
;*
;********************************************************************
;*
;* 指令条数: 0 + return
;* 指令执行周期: 0 + return
;* 低位寄存器使用: None
;* 高位寄存器使用: None
;* 指针寄存器使用: None
;* 状态寄存器使用: None
;*
;********************************************************************
;******** 本程序包括的定义文件:
.include "LCDM(HD128×64)def.inc" ;寄存器变量和常数定义
;******** 程序指令代码清单:
;LCDM_OpenBL----------------“打开背景灯子程序”
;LCDM_CloseBL---------------“关闭背景灯子程序”
;LCDM_RESET-----------------“液晶模块复位子程序”
;LCDM_OPENSCN---------------“初始化液晶模块和打开显示子程序”
;LCDM_CLOSESCN--------------“关闭显示子程序”
;LCDM_SetupSLine------------“设置显示开始行子程序”
;LCDM_SetupYAddr------------“设置Y地址子程序”
;LCDM_SetupPageNum----------“设置写入数据页数子程序”
;LCDM_WRPageNum-------------“计算单个字符写入的页数值子程序”
;LCDM_WRRNCNTNum------------“计算单列写入字符的次数子程序”
;LCDM_LWriteSWord-----------“行方式写单个字符子程序”
;LCDM_RWriteSWord-----------“列方式写单个字符子程序”
;LCDM_LWriteSData-----------“行方式写单个数据“XX”子程序”
;LCDM_ClearSCN--------------“清除全屏幕子程序”
;LCDM_FLWriteWord-----------“整行方式写入字符子程序”
;
;
;TDELAY1000ms---------------“延时1000ms子程序”
;TDELAY500ms----------------“延时500ms子程序”
;TDELAY50ms-----------------“延时50ms子程序”
;TDELAY10us-----------------“延时10us子程序”
;TDELAY2us------------------“延时2us子程序”
;**************** 打开背景灯子程序 - “LCDM_OpenBL”
LCDM_OpenBL:
sbi BLCtrlPORT,BLCtrlPINNum ;定义背景灯控制引脚为输出端
nop ;空操作,用于稳定输出状态
sbi BLCtrlPIN,BLCtrlPINNum ;打开背景灯
nop ;空操作,用于稳定输出状态
ret ;子程序返回
;**************** 关闭背景灯子程序 - “LCDM_CloseBL”
LCDM_CloseBL:
sbi BLCtrlPORT,BLCtrlPINNum ;定义背景灯控制引脚为输出端
nop ;空操作,用于稳定输出状态
cbi BLCtrlPIN,BLCtrlPINNum ;关闭背景灯
nop ;空操作,用于稳定输出状态
ret ;子程序返回
;**************** 液晶模块复位子程序 - “LCDM_RESET”
LCDM_RESET:
push ADDER ;压入寄存器中的数值到堆栈
ldi ADDER,0 ;清除复位信号控制引脚,
out LCDM_RST_PORT,ADDER ;端口的输入/输出方向状态
sbi LCDM_RST_PORT,LCDM_RST_PINNum ;定义复位信号控制引脚为输出端
cbi LCDM_RST_PIN,LCDM_RST_PINNum ;置复位信号为低电平
rcall TDELAY50ms ;延时50ms
sbi LCDM_RST_PIN,LCDM_RST_PINNum ;置复位信号为高电平
rcall TDELAY50ms ;延时50ms
pop ADDER ;弹出堆栈中的数值到寄存器
ret ;子程序返回
;**************** 初始化液晶模块和打开显示子程序 - “LCDM_OPENSCN”
LCDM_OPENSCN:
push ADDER ;压入寄存器中的数值到堆栈
;*** 初始化液晶模块的各个控制引脚
sbi LCDM_CS1_PORT,LCDM_CS1_PINNum ;定义片选1控制引脚为输出端
sbi LCDM_CS2_PORT,LCDM_CS2_PINNum ;定义片选2控制引脚为输出端
sbi LCDM_DI_PORT,LCDM_DI_PINNum ;定义寄存器选择控制引脚为输出端
sbi LCDM_RW_PORT,LCDM_RW_PINNum ;定义读/写选择控制引脚为输出端
sbi LCDM_EN_PORT,LCDM_EN_PINNum ;定义使能信号控制引脚为输出端
ser ADDER ;定义数据端口为输出端
out LCDM_DATA_PORT,ADDER
;*** 打开液晶模块显示
cbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为L
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
sbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;置片选1为H
ldi ADDER,LCDM_ON_Display ;置打开液晶的控制指令字,
out LCDM_DATA_PIN,ADDER ;输出到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
nop ;空操作,用于稳定输出状态
cbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;取消片选1
sbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;置片选2为H
ldi ADDER,LCDM_ON_Display ;置打开液晶的控制指令字,
out LCDM_DATA_PIN,ADDER ;输出到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
nop ;空操作,用于稳定输出状态
cbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;取消片选2
;*** 此段程序用于设置显示开始行为第一行
cbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为L
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
sbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;置片选1为H
ldi ADDER,LCDM_FSLineCINS ;置片1开始显示行控制指令字,
out LCDM_DATA_PIN,ADDER ;输出到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
nop ;空操作,用于稳定输出状态
cbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;置片选1为L
sbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;置片选2为H
ldi ADDER,LCDM_FSLineCINS ;置片2开始显示行控制指令字,
out LCDM_DATA_PIN,ADDER ;输出到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
nop ;空操作,用于稳定输出状态
cbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;片选2为L
;***
pop ADDER ;弹出堆栈中的数值到寄存器
ret ;子程序返回
;**************** 关闭显示子程序 - “LCDM_CLOSESCN”
LCDM_CLOSESCN:
push ADDER ;压入寄存器中的数值到堆栈
;*** 初始化液晶模块的各个控制引脚
sbi LCDM_CS1_PORT,LCDM_CS1_PINNum ;定义片选1控制引脚为输出端
sbi LCDM_CS2_PORT,LCDM_CS2_PINNum ;定义片选2控制引脚为输出端
sbi LCDM_DI_PORT,LCDM_DI_PINNum ;定义寄存器选择控制引脚为输出端
sbi LCDM_RW_PORT,LCDM_RW_PINNum ;定义读/写选择控制引脚为输出端
sbi LCDM_EN_PORT,LCDM_EN_PINNum ;定义使能信号控制引脚为输出端
ser ADDER ;定义数据端口为输出端
out LCDM_DATA_PORT,ADDER
;*** 关闭液晶模块显示
cbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为L
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
sbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;置片选1为H
ldi ADDER,LCDM_OFF_Display ;置关闭液晶的控制指令字,
out LCDM_DATA_PIN,ADDER ;输出到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
nop ;空操作,用于稳定输出状态
cbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;取消片选1
sbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;置片选2为H
ldi ADDER,LCDM_OFF_Display ;置关闭液晶的控制指令字,
out LCDM_DATA_PIN,ADDER ;输出到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
nop ;空操作,用于稳定输出状态
cbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;取消片选2
pop ADDER ;弹出堆栈中的数值到寄存器
ret ;子程序返回
;**************** 设置显示开始行子程序 - “LCDM_SetupSLine”
;入口条件:
; 在调用此子程序前,需要设置下面这个存储 SRAM 中的数值:
; LCDM_SLineAddr ----- 液晶模块中的显示开始行地址数。
LCDM_SetupSLine:
push ADDER ;压入寄存器中的数值到堆栈
;*** 初始化液晶模块的各个控制引脚
sbi LCDM_CS1_PORT,LCDM_CS1_PINNum ;定义片选1控制引脚为输出端
sbi LCDM_CS2_PORT,LCDM_CS2_PINNum ;定义片选2控制引脚为输出端
sbi LCDM_DI_PORT,LCDM_DI_PINNum ;定义寄存器选择控制引脚为输出端
sbi LCDM_RW_PORT,LCDM_RW_PINNum ;定义读/写选择控制引脚为输出端
sbi LCDM_EN_PORT,LCDM_EN_PINNum ;定义使能信号控制引脚为输出端
ser ADDER ;定义数据端口为输出端
out LCDM_DATA_PORT,ADDER
;*** 设置显示开始行
cbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为L
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
sbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;置片选1为H
cbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为L
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
lds ADDER,LCDM_SLineAddr ;置片1开始显示行数,
out LCDM_DATA_PIN,ADDER ;输出到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
nop ;空操作,用于稳定输出状态
cbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;置片选1为L
sbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;置片选2为H
lds ADDER,LCDM_SLineAddr ;置片1开始显示行数,
out LCDM_DATA_PIN,ADDER ;输出到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
nop ;空操作,用于稳定输出状态
cbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;片选2为L
;***
pop ADDER ;弹出堆栈中的数值到寄存器
ret ;子程序返回
;**************** 设置Y地址子程序 - “LCDM_SetupYAddr”
;入口条件:
; 在调用此子程序前,需要设置下面这个存储 SRAM 中的数值:
; LCDM_YAddrNum ----- 液晶模块中显示RAM数据的Y地址数。
LCDM_SetupYAddr:
cbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为L
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
lds ADDER,LCDM_YAddrNum ;取存储器中显示数据的Y地址数
out LCDM_DATA_PIN,ADDER ;输出Y地址数到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
ret ;子程序返回
;**************** 设置写入数据页数子程序 - “LCDM_SetupPageNum”
;入口条件:
; 在调用此子程序前,需要设置下面这个存储 SRAM 中的数值:
; LCDM_PageNum ----- 写入数据到液晶模块中的RAM页数字。
LCDM_SetupPageNum:
cbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为L
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
lds ADDER,LCDM_PageNum ;取存储器中写入数据的页数
out LCDM_DATA_PIN,ADDER ;输出写入数据的页数到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;使能信号为L
ret ;子程序返回
;**************** 计算单个字符写入的页数值子程序 - “LCDM_WRPageNum”
;入口条件:
; 在调用此子程序前,需要设置下面这个存储 SRAM 中的数值:
; CHAR_LDotNum ------------- 单个字符数据行点阵数。
LCDM_WRPageNum:
push ADDER ;压入寄存器中的数值到堆栈
lds REGISTER_A,CHAR_LDotNum ;取单个字符数据行点阵数
clr ADDER ;清单个字符写入的页数值
sts CHAR_NPageNum,ADDER
LCDM_WRPageNum1:
lds ADDER,CHAR_NPageNum ;取存储器中单个字符写入的页数值
inc ADDER ;单个字符写入的页数值加1
sts CHAR_NPageNum,ADDER ;结果送回到存储器中
ldi ADDER,LCDM_SLMaxDotNum ;取液晶每列中可显示的最大行点阵数
cp REGISTER_A,ADDER ;比较字符行点阵数和最大行点阵数大小
brlo LCDM_WRPageNum2 ;小于则转到结束
sub REGISTER_A,ADDER ;单个字符行点阵数减最大行点阵数
brne LCDM_WRPageNum1 ;两者不相等,则继续
LCDM_WRPageNum2:
pop ADDER ;弹出堆栈中的数值到寄存器
ret ;子程序返回
;**************** 计算单列写入字符的次数子程序 - “LCDM_WRRNCNTNum”
;入口条件:
; 在调用此子程序前,需要设置下面这个存储 SRAM 中的数值:
; CHAR_RDotNum ------------- 单个字符数据列点阵数。
LCDM_WRRNCNTNum:
push ADDER ;压入寄存器中的数值到堆栈
ldi REGISTER_A,LCDM_SRMaxDotNum ;取液晶每行中可显示的最大列点阵数
clr ADDER ;清单列写入字符的次数值
sts CHAR_RNCNTNum,ADDER
LCDM_WRRNCNTNum1:
lds ADDER,CHAR_RNCNTNum ;取存储器中单列写入字符的次数值
inc ADDER ;单列写入字符的次数值加1
sts CHAR_RNCNTNum,ADDER ;结果送回到存储器中
lds ADDER,CHAR_RDotNum ;取单个字符数据列点阵数
cp REGISTER_A,ADDER ;比较字符列点阵数和最大列点阵数大小
brlo LCDM_WRRNCNTNum2 ;小于则转到结束
sub REGISTER_A,ADDER ;最大列点阵数减单个字符列点阵数
brne LCDM_WRRNCNTNum1 ;两者不相等,则继续
LCDM_WRRNCNTNum2:
pop ADDER ;弹出堆栈中的数值到寄存器
ret ;子程序返回
;**************** 行方式写单个字符子程序 - “LCDM_LWriteSWord”
;入口条件:
; 在调用此子程序前,需设置下列存储器中的数值和数据地址指针:
; ZL(r30) ------------------- 指向显示字符数据地址的Z指针低字节
; ZH(r31) ------------------- 指向显示字符数据地址的Z指针高字节
; CHAR_RDotNum -------------- 单个字符数据列点阵数
; LCDM_YAddrNum ------------- 液晶中的显示数据的Y地址数
; LCDM_PageNum -------------- 液晶中的显示数据页数
; 可使用如下面指令来设置显示字符数据地址的低和高字节:
; ldi ZL,low(显示字符数据表的标号*2)
; ldi ZH,high(显示字符数据表的标号*2)
;注意:
; 在本程序运行完之后地址指针Z指针,将指向本字符数据存放地址的
;下一个地址(即下一个字符数据的第一个存放地址)。此地址指针Z指针
;所用的寄存器对(r30:r31)没有进行堆栈保护,程序运行完之后这对寄存
;器对(r30:r31)中的数值将以改变后的内容返回调用程序。
; 在本程序运行完之后液晶中的显示数据页数(LCDM_PageNum)将返回为
;调用前的原始数值。
; 在本程序运行完之后液晶中的显示数据的Y地址数(LCDM_YAddrNum)
;将改变后的内容返回调用程序。
LCDM_LWriteSWord:
lds ADDER,CHAR_NPageNum ;取单个字符写入的页数值,
sts CycleCounter1,ADDER ;存储此数值到循环计数器1中
LCDM_LWriteSWord1:
rcall LCDM_SetupYAddr ;设置字符的Y地址数
rcall LCDM_SetupPageNum ;设置字符的显示页数
sbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为H
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
lds ADDER,CHAR_RDotNum ;取字符的列点阵数值,
sts CycleCounter2,ADDER ;存储此数值到循环计数器2中
LCDM_LWriteSWord2:
lpm ADDER,Z+ ;读Z指针的字符数据到寄存器中,
;然后Z指针加1
out LCDM_DATA_PIN,ADDER
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为L
lds ADDER,CycleCounter2 ;取循环计数器2数值
dec ADDER ;循环计数器2减1
sts CycleCounter2,ADDER ;结果送回到存储器中
brne LCDM_LWriteSWord2 ;本页字符所有列点阵写完否?
lds ADDER,LCDM_PageNum ;取字符显示页数值
inc ADDER ;字符显示页数加1
sts LCDM_PageNum,ADDER ;结果送回到存储器中
lds ADDER,CycleCounter1 ;取循环计数器1数值
dec ADDER ;循环计数器1减1
sts CycleCounter1,ADDER ;结果送回到存储器中
brne LCDM_LWriteSWord1 ;本字符所有页数写完否?
lds REGISTER_A,CHAR_NPageNum ;取单个字符写入的页数值
lds ADDER,LCDM_PageNum ;取字符显示页数值
sub ADDER,REGISTER_A ;字符显示页数减写入的页数值
sts LCDM_PageNum,ADDER ;结果送回到存储器中
lds REGISTER_A,CHAR_RDotNum ;取单个字符的列点阵数
lds ADDER,LCDM_YAddrNum ;取单个字符的Y地址数
add ADDER,REGISTER_A ;字符的Y地址数加列点阵数
sts LCDM_YAddrNum,ADDER ;结果送回到存储器中
ret ;子程序返回
;**************** 列方式写单个字符子程序 - “LCDM_RWriteSWord”
;入口条件:
; 在调用此子程序前,需设置下列存储器中的数值和数据地址指针:
; ZL(r30) ------------------- 指向显示字符数据地址的Z指针低字节
; ZH(r31) ------------------- 指向显示字符数据地址的Z指针高字节
; CHAR_RDotNum -------------- 单个字符数据列点阵数
; LCDM_YAddrNum ------------- 液晶中的显示数据的Y地址数
; LCDM_PageNum -------------- 液晶中的显示数据页数
; 可使用如下面指令来设置显示字符数据地址的低和高字节:
; ldi ZL,low(显示字符数据表的标号*2)
; ldi ZH,high(显示字符数据表的标号*2)
;注意:
; 在本程序运行完之后地址指针Z指针,将指向本字符数据存放地址的
;下一个地址(即下一个字符数据的第一个存放地址)。此地址指针Z指针
;所用的寄存器对(r30:r31)没有进行堆栈保护,程序运行完之后这对寄存
;器对(r30:r31)中的数值将以改变后的内容返回调用程序。
; 在本程序运行完之后液晶中的显示数据页数(LCDM_PageNum)将以改变
;后的内容返回调用程序。
; 在本程序运行完之后液晶中的显示数据的Y地址数(LCDM_YAddrNum)
;将返回为调用前的原始数值。
LCDM_RWriteSWord:
lds ADDER,CHAR_NPageNum ;取单个字符写入的页数值,
sts CycleCounter1,ADDER ;存储此数值到循环计数器1中
LCDM_RWriteSWord1:
rcall LCDM_SetupYAddr ;设置字符的Y地址数
rcall LCDM_SetupPageNum ;设置字符的显示页数
sbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为H
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
lds ADDER,CHAR_RDotNum ;取字符的列点阵数值,
sts CycleCounter2,ADDER ;存储此数值到循环计数器2中
LCDM_RWriteSWord2:
lpm ADDER,Z+ ;读Z指针的字符数据到寄存器中,
;然后Z指针加1
out LCDM_DATA_PIN,ADDER
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为L
lds ADDER,CycleCounter2 ;取循环计数器2数值
dec ADDER ;循环计数器2减1
sts CycleCounter2,ADDER ;结果送回到存储器中
brne LCDM_RWriteSWord2 ;本页字符所有列点阵写完否?
lds ADDER,LCDM_PageNum ;取字符显示页数值
inc ADDER ;字符显示页数加1
sts LCDM_PageNum,ADDER ;结果送回到存储器中
lds ADDER,CycleCounter1 ;取循环计数器1数值
dec ADDER ;循环计数器1减1
sts CycleCounter1,ADDER ;结果送回到存储器中
brne LCDM_RWriteSWord1 ;本字符所有页数写完否?
ret ;子程序返回
;**************** 行方式写单个数据“XX”子程序 - “LCDM_LWriteSData”
;入口条件:
; 在调用此子程序前,需设置下列存储器中的数值和数据地址指针:
; ZL(r30) ------------------- 指向显示字符数据地址的Z指针低字节
; ZH(r31) ------------------- 指向显示字符数据地址的Z指针高字节
; CHAR_RDotNum -------------- 单个字符数据列点阵数
; LCDM_YAddrNum ------------- 液晶中的显示数据的Y地址数
; LCDM_PageNum -------------- 液晶中的显示数据页数
; CHAR_SWordData ------------ 写入单个数据“XX”的数值
; 可使用如下面指令来设置显示字符数据地址的低和高字节:
; ldi ZL,low(显示字符数据表的标号*2)
; ldi ZH,high(显示字符数据表的标号*2)
;注意:
; 在本程序运行完之后地址指针Z指针,将指向本字符数据存放地址的
;下一个地址(即下一个字符数据的第一个存放地址)。此地址指针Z指针
;所用的寄存器对(r30:r31)没有进行堆栈保护,程序运行完之后这对寄存
;器对(r30:r31)中的数值将以改变后的内容返回调用程序。
; 在本程序运行完之后液晶中的显示数据页数(LCDM_PageNum)将返回为
;调用前的原始数值。
; 在本程序运行完之后液晶中的显示数据的Y地址数(LCDM_YAddrNum)
;将改变后的内容返回调用程序。
LCDM_LWriteSData:
lds ADDER,CHAR_NPageNum ;取单个字符写入的页数值,
sts CycleCounter1,ADDER ;存储此数值到循环计数器1中
LCDM_LWriteSData1:
rcall LCDM_SetupYAddr ;设置字符的Y地址数
rcall LCDM_SetupPageNum ;设置字符的显示页数
sbi LCDM_DI_PIN,LCDM_DI_PINNum ;置寄存器选择为H
cbi LCDM_RW_PIN,LCDM_RW_PINNum ;置读/写选择为L
lds ADDER,CHAR_RDotNum ;取字符的列点阵数值,
sts CycleCounter2,ADDER ;存储此数值到循环计数器2中
LCDM_LWriteSData2:
lds ADDER,CHAR_SWordData ;写单个数据“XX”到寄存器中,
out LCDM_DATA_PIN,ADDER ;输出数据“XX”到数据端口
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为L
rcall TDELAY2us ;延时2us
sbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为H
rcall TDELAY2us ;延时2us
cbi LCDM_EN_PIN,LCDM_EN_PINNum ;置使能信号为L
lds ADDER,CycleCounter2 ;取循环计数器2数值
dec ADDER ;循环计数器2减1
sts CycleCounter2,ADDER ;结果送回到存储器中
brne LCDM_LWriteSData2 ;本页字符所有列点阵写完否?
lds ADDER,LCDM_PageNum ;取字符显示页数值
inc ADDER ;字符显示页数加1
sts LCDM_PageNum,ADDER ;结果送回到存储器中
lds ADDER,CycleCounter1 ;取循环计数器1数值
dec ADDER ;循环计数器1减1
sts CycleCounter1,ADDER ;结果送回到存储器中
brne LCDM_LWriteSData1 ;本字符所有页数写完否?
lds REGISTER_A,CHAR_NPageNum ;取单个字符写入的页数值
lds ADDER,LCDM_PageNum ;取字符显示页数值
sub ADDER,REGISTER_A ;字符显示页数减写入的页数值
sts LCDM_PageNum,ADDER ;结果送回到存储器中
lds REGISTER_A,CHAR_RDotNum ;取单个字符的列点阵数
lds ADDER,LCDM_YAddrNum ;取单个字符的Y地址数
add ADDER,REGISTER_A ;字符的Y地址数加列点阵数
sts LCDM_YAddrNum,ADDER ;结果送回到存储器中
ret ;子程序返回
;**************** 整行方式写入字符子程序 - “LCDM_FLWriteWord”
;入口条件:
; 在调用此子程序前,需设置下列存储器中的数值和数据地址指针:
; ZL(r30) ------------------- 指向显示字符数据地址的Z指针低字节
; ZH(r31) ------------------- 指向显示字符数据地址的Z指针高字节
; LCDM_PageNum -------------- 液晶中的显示数据页数
; LCDM_YAddrNum ------------- 液晶中的显示数据的Y地址数
; CHAR_RNCNTNum ------------- 单列需写入字符的次数值
; 可使用如下面指令来设置显示字符数据地址的低和高字节:
; ldi ZL,low(显示字符数据表的标号*2)
; ldi ZH,high(显示字符数据表的标号*2)
;注意:
; 在本程序运行完之后地址指针Z指针,将指向本字符数据存放地址的
;下一个地址(即下一个字符数据的第一个存放地址)。此地址指针Z指针
;所用的寄存器对(r30:r31)没有进行堆栈保护,程序运行完之后这对寄存
;器对(r30:r31)中的数值将以改变后的内容返回调用程序。
; 在本程序运行完之后液晶中的显示数据页数(LCDM_PageNum)将返回为
;调用前的原始数值。
; 在本程序运行完之后液晶中的显示数据的Y地址数(LCDM_YAddrNum)
;将改变后的内容返回调用程序。
LCDM_FLWriteWord:
sbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;置片选1为H
lds ADDER,CHAR_RNCNTNum ;置单列写入字符的次数值,
sts CycleCounter6,ADDER ;为循环计数器6的初值
LCDM_FLWriteWord1:
call LCDM_LWriteSWord ;写入单个字符
lds ADDER,CycleCounter6 ;取存储器中循环计数器6的数值,
dec ADDER ;循环计数器6减1,
sts CycleCounter6,ADDER ;结果送回到存储器中
brne LCDM_FLWriteWord1 ;循环计数器6计数完否?
cbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;取消片选1
ldi ADDER,LCDM_FYAddrCINS ;显示数据的Y地址为1
sts LCDM_YAddrNum,ADDER
sbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;置片选2为H
lds ADDER,CHAR_RNCNTNum ;置单列写入字符的次数值,
sts CycleCounter6,ADDER ;为循环计数器6的初值
LCDM_FLWriteWord2:
call LCDM_LWriteSWord ;写入单个字符
lds ADDER,CycleCounter6 ;取存储器中循环计数器6的数值,
dec ADDER ;循环计数器6减1,
sts CycleCounter6,ADDER ;结果送回到存储器中
brne LCDM_FLWriteWord2 ;循环计数器6计数完否?
cbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;取消片选2
ret ;子程序返回
;**************** 清除全屏幕子程序 - “LCDM_ClearSCN”
LCDM_ClearSCN:
ldi ADDER,8 ;置单个数据行点阵数
sts CHAR_LDotNum,ADDER
ldi ADDER,8 ;置单个数据列点阵数
sts CHAR_RDotNum,ADDER
call LCDM_WRPageNum ;计算单个数据需写入的页数值
call LCDM_WRRNCNTNum ;计算单列写入字符的次数值
ldi ADDER,LCDM_FPageCINS ;置显示数据为第1页
sts LCDM_PageNum,ADDER
ldi ADDER,LCDM_FYAddrCINS ;显示数据的Y地址为1
sts LCDM_YAddrNum,ADDER
ldi ADDER,0x00 ;写入的数据“XX”值为“00”
sts CHAR_SWordData,ADDER
ldi ADDER,8 ;置显示最大页数,
sts CycleCounter5,ADDER ;为循环计数器5的初值
LCDM_ClearSCN1:
ldi ADDER,LCDM_FYAddrCINS ;显示数据的Y地址为1
sts LCDM_YAddrNum,ADDER
sbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;置片选1为H
lds ADDER,CHAR_RNCNTNum ;置单列写入字符的次数值,
sts CycleCounter6,ADDER ;为循环计数器6的初值
LCDM_ClearSCN2:
call LCDM_LWriteSData ;写入单个数据“00”
lds ADDER,CycleCounter6 ;取存储器中循环计数器6的数值,
dec ADDER ;循环计数器6减1,
sts CycleCounter6,ADDER ;结果送回到存储器中
brne LCDM_ClearSCN2 ;循环计数器6计数完否?
cbi LCDM_CS1_PIN,LCDM_CS1_PINNum ;取消片选1
ldi ADDER,LCDM_FYAddrCINS ;显示数据的Y地址为1
sts LCDM_YAddrNum,ADDER
sbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;置片选2为H
lds ADDER,CHAR_RNCNTNum ;置单列写入字符的次数值,
sts CycleCounter6,ADDER ;为循环计数器6的初值
LCDM_ClearSCN3:
call LCDM_LWriteSData ;写入单个数据“00”
lds ADDER,CycleCounter6 ;取存储器中循环计数器6的数值,
dec ADDER ;循环计数器6减1,
sts CycleCounter6,ADDER ;结果送回到存储器中
brne LCDM_ClearSCN3 ;循环计数器6计数完否?
cbi LCDM_CS2_PIN,LCDM_CS2_PINNum ;取消片选2
lds ADDER,LCDM_PageNum ;显示数据页加1页
inc ADDER
sts LCDM_PageNum,ADDER
lds ADDER,CycleCounter5 ;取存储器中循环计数器5的数值,
dec ADDER ;循环计数器5减1,
sts CycleCounter5,ADDER ;结果送回到存储器中
brne LCDM_ClearSCN1 ;循环计数器5计数完否?
ret ;子程序返回
;**************** 延时1000ms子程序 - “TDELAY1000ms”
TDELAY1000ms:
ldi ADDER,TD1000ms_INV1 ;置延时循环计数器2初值,
sts TimeDelayCNT2,ADDER ;存储此数值到存储器中
TDELAY1000ms1:
ldi ADDER,TD1000ms_INV2 ;置延时循环计数器1初值,
sts TimeDelayCNT1,ADDER ;存储此数值到存储器中
TDELAY1000ms2:
ldi ADDER,TD1000ms_INV3 ;置延时循环计数器初值
TDELAY1000ms3:
dec ADDER ;延时循环计数器减1
brne TDELAY1000ms3 ;延时循环时间到否?
lds ADDER,TimeDelayCNT1 ;取存储器中循环计数器1值,
dec ADDER ;延时循环计数器1减1,
sts TimeDelayCNT1,ADDER ;结果送回到存储器中
brne TDELAY1000ms2 ;计数器1延时时间到否?
lds ADDER,TimeDelayCNT2 ;取存储器中循环计数器2值,
dec ADDER ;延时循环计数器2减1,
sts TimeDelayCNT2,ADDER ;结果送回到存储器中
brne TDELAY1000ms1 ;计数器2延时循环时间到否?
ret ;子程序返回
;**************** 延时500ms子程序 - “TDELAY500ms”
TDELAY500ms:
ldi ADDER,TD500ms_INV1 ;置延时循环计数器2初值,
sts TimeDelayCNT2,ADDER ;存储此数值到存储器中
TDELAY500ms1:
ldi ADDER,TD500ms_INV2 ;置延时循环计数器1初值,
sts TimeDelayCNT1,ADDER ;存储此数值到存储器中
TDELAY500ms2:
ldi ADDER,TD500ms_INV3 ;置延时循环计数器初值
TDELAY500ms3:
dec ADDER ;延时循环计数器减1
brne TDELAY500ms3 ;延时循环时间到否?
lds ADDER,TimeDelayCNT1 ;取存储器中循环计数器1值,
dec ADDER ;延时循环计数器1减1,
sts TimeDelayCNT1,ADDER ;结果送回到存储器中
brne TDELAY500ms2 ;计数器1延时时间到否?
lds ADDER,TimeDelayCNT2 ;取存储器中循环计数器2值,
dec ADDER ;延时循环计数器2减1,
sts TimeDelayCNT2,ADDER ;结果送回到存储器中
brne TDELAY500ms1 ;计数器2延时循环时间到否?
ret ;子程序返回
;**************** 延时50ms子程序 - “TDELAY50ms”
TDELAY50ms:
ldi ADDER,TD50ms_INV1 ;置延时循环计数器2初值,
sts TimeDelayCNT2,ADDER ;存储此数值到存储器中
TDELAY50ms1:
ldi ADDER,TD50ms_INV2 ;置延时循环计数器1初值,
sts TimeDelayCNT1,ADDER ;存储此数值到存储器中
TDELAY50ms2:
ldi ADDER,TD50ms_INV3 ;置延时循环计数器初值
TDELAY50ms3:
dec ADDER ;延时循环计数器减1
brne TDELAY50ms3 ;延时循环时间到否?
lds ADDER,TimeDelayCNT1 ;取存储器中循环计数器1值,
dec ADDER ;延时循环计数器1减1,
sts TimeDelayCNT1,ADDER ;结果送回到存储器中
brne TDELAY50ms2 ;计数器1延时时间到否?
lds ADDER,TimeDelayCNT2 ;取存储器中循环计数器2值,
dec ADDER ;延时循环计数器2减1,
sts TimeDelayCNT2,ADDER ;结果送回到存储器中
brne TDELAY50ms1 ;计数器2延时循环时间到否?
ret ;子程序返回
;**************** 延时10us子程序 - “TDELAY10us”
TDELAY10us:
ldi ADDER,TD10us_INV2 ;置延时循环计数器1初值
sts TimeDelayCNT1,ADDER ;存储此数值到存储器中
TDELAY10us1:
ldi ADDER,TD10us_INV1 ;置延时循环计数器初值
TDELAY10us2:
dec ADDER ;延时循环计数器减1
brne TDELAY10us2 ;延时循环时间到否?
lds ADDER,TimeDelayCNT1 ;取存储器中循环计数器1值,
dec ADDER ;延时循环计数器2减1,
sts TimeDelayCNT1,ADDER ;结果送回到存储器中
brne TDELAY10us1 ;计数器1延时循环时间到否?
ret ;子程序返回
;**************** 延时2us子程序 - “TDELAY2us”
TDELAY2us:
ldi ADDER,TD2us_INV1 ;置延时循环计数器初值
TDELAY2us1:
dec ADDER ;延时循环计数器减1
brne TDELAY2us1 ;延时循环时间到否?
ret ;子程序返回
;********************************************************************
;*
;* 子程序名: LCDM(HD128×64)def.inc
;* 程序名称: ATmega16 控制128×64液晶模块(HD61202/3)
;* 显示程序单片机程序的寄存器和常数定义
;* 版本: 1.0
;* 适用 MCU 型号: ATmega16_16PI
;* 入口条件:
;* 出口条件:
;* 使用资源:
;*
;* 程序功能:
;* 本程序是定义ATmega16 控制128×64液晶模块(HD61202/3)
;* 显示程序单片机程序的寄存器和常数定义
;*
;* 注释:
;* 本程序仅使用两个寄存器分别对应工作于C51方式下的累加器和
;* 寄存器A,以保持程序兼容性。
;*
;* 编作者:
;* 编作者 E-Mail: PTZSW@163.COM
;* 编制日期: 2003年12月18日
;*
;********************************************************************
;******** 常数定义:
.equ BOOTPSaddr = THIRDBOOTSTART ;引导程序区开始地址数值
;*** 液晶模块参数定义:
.equ BLCtrlPORT = DDRA ;液晶的背景灯控制端口
.equ BLCtrlPIN = PORTA ;液晶的背景灯控制端口数据寄存器
.equ BLCtrlPINNum = 6 ;液晶的背景灯控制引脚数字
.equ LCDM_DI_PORT = DDRD ;液晶的寄存器选择控制端口
.equ LCDM_DI_PIN = PORTD ;液晶的寄存器选择控制端口数据寄存器
.equ LCDM_DI_PINNum = 1 ;液晶的寄存器选择控制引脚数字
.equ LCDM_RW_PORT = DDRD ;液晶的读/写选择控制端口
.equ LCDM_RW_PIN = PORTD ;液晶的读/写选择控制端口数据寄存器
.equ LCDM_RW_PINNum = 2 ;液晶的读/写选择控制引脚数字
.equ LCDM_EN_PORT = DDRD ;液晶的使能信号控制端口
.equ LCDM_EN_PIN = PORTD ;液晶的使能信号控制端口数据寄存器
.equ LCDM_EN_PINNum = 3 ;液晶的使能信号控制引脚数字
.equ LCDM_CS1_PORT = DDRD ;液晶的片选1控制端口
.equ LCDM_CS1_PIN = PORTD ;液晶的片选1控制端口数据寄存器
.equ LCDM_CS1_PINNum = 4 ;液晶的片选1控制引脚数字
.equ LCDM_CS2_PORT = DDRD ;液晶的片选2控制端口
.equ LCDM_CS2_PIN = PORTD ;液晶的片选2控制端口数据寄存器
.equ LCDM_CS2_PINNum = 5 ;液晶的片选2控制引脚数字
.equ LCDM_RST_PORT = DDRD ;液晶的复位信号控制端口
.equ LCDM_RST_PIN = PORTD ;液晶的复位信号控制端口数据寄存器
.equ LCDM_RST_PINNum = 6 ;液晶的复位信号控制引脚数字
.equ LCDM_DATA_PORT = DDRB ;液晶模块的数据端口
.equ LCDM_DATA_PIN = PORTB ;液晶模块的数据端口数据寄存器
;*** 液晶显示数据常数定义:
.equ LCDM_SLMaxDotNum = 8 ;液晶每列中可显示的最大行点阵数
.equ LCDM_SRMaxDotNum = 64 ;液晶每行中可显示的最大列点阵数
.equ LCDM_ON_Display = 63 ;打开液晶显示的控制指令字
.equ LCDM_OFF_Display = 62 ;关闭液晶显示的控制指令字
.equ LCDM_FPageCINS = 184 ;显示数据为第1页的控制指令字
.equ LCDM_FYAddrCINS = 64 ;显示数据的Y地址为1的控制指令字
.equ LCDM_FSLineCINS = 192 ;开始显示行数为1的控制指令字
;*** 延时循环子程序常数定义:
;下面计算以单片机的时钟= 1 MHz 为依据进行时间运算。
;定义中的数值为实际运行时钟周期的数值。
;延时1000ms计数器初值共计:1000000 个时钟周期。
.equ TD1000ms_INV1 = 250
.equ TD1000ms_INV2 = 182
.equ TD1000ms_INV3 = 5
;延时500ms计数器初值共计:500000 个时钟周期。
.equ TD500ms_INV1 = 250
.equ TD500ms_INV2 = 92
.equ TD500ms_INV3 = 5
;延时50ms计数器初值共计:50000 个时钟周期。
.equ TD50ms_INV1 = 245
.equ TD50ms_INV2 = 9
.equ TD50ms_INV3 = 5
;延时10us计数器初值共计:10 个时钟周期。
.equ TD10us_INV1 = 2
.equ TD10us_INV2 = 1
;延时2us计数器初值共计:2 个时钟周期。
.equ TD2us_INV1 = 1
;******** 寄存器变量定义:
.def ADDER = r16 ;工作于累加器方式的寄存器
.def REGISTER_A = r17 ;工作于寄存器A方式的寄存器
;******** 各类工作于通用寄存器方式的在 SRAM 中存储地址定义:
.equ ADDERTEMP = $200 ;暂存累加器数值
.equ CycleCounter1 = $201 ;循环计数器1
.equ CycleCounter2 = $202 ;循环计数器2
.equ CycleCounter3 = $203 ;循环计数器3
.equ CycleCounter4 = $204 ;循环计数器4
.equ CycleCounter5 = $205 ;循环计数器5
.equ CycleCounter6 = $206 ;循环计数器6
.equ CycleCounter7 = $207 ;循环计数器7
.equ CycleCounter8 = $208 ;循环计数器8
.equ TimeDelayCNT1 = $211 ;延时循环计数器1
.equ TimeDelayCNT2 = $212 ;延时循环计数器2
.equ TimeDelayCNT3 = $213 ;延时循环计数器3
.equ TimeDelayCNT4 = $214 ;延时循环计数器4
.equ LCDM_PageNum = $221 ;液晶中的显示数据页数
.equ LCDM_YAddrNum = $222 ;液晶中的显示数据的Y地址数
.equ LCDM_SLineAddr = $223 ;液晶中的开始显示行地址数
.equ CHAR_LDotNum = $231 ;单个字符数据行点阵数
.equ CHAR_RDotNum = $232 ;单个字符数据列点阵数
.equ CHAR_NPageNum = $233 ;单个字符写入的页数值
.equ CHAR_RNCNTNum = $234 ;单列需写入字符的次数值
.equ CHAR_SWordData = $235 ;写入单个字符的数据值
;★★★★★ 定义文件结束!!! ★★★★★ |
|