;LCD部分用到的RAM0200H~~~~021FH用到的Rn有R15/R14
;LCD复位子程序(LCD_REST)不须要设事先置直接调用即可
;半屏显示子程序(LCD)在调用前必须送入页地址 例如:MOV.B #0B8H,LCD_PAGE_BRAM
;CALL#LCD显示上屏
;:MOV.B #0BAH,LCD_PAGE_BRAM
;CALL#LCD显示下屏
;LCDUP_WORD0_BRAM~~~LCDUP_WORD6_RAM是上屏显示字的代码寄存器一屏显示7个字
;LCDDOWN_WORD0_BRAM~~~LCDDOWN_WORD6_RAM是下屏显示字的代码寄存器一屏显示7个字
;每屏显示是以中间为基准向两边平均显示在调用半屏显示子程序时已经自动计算LCD的列地址
;清屏指令可分全屏清除(LCD_CLEAR_ALL)和半屏清除(LCD_CLEAR)
;注 全屏清除子程序不需入口直接调用就行而半屏清除子程序在调用前入口与半屏显示子程序相同
#i nclude“MSP430x14x.h”
NAME LCD
MODULE LCD
PUBLICLCD
RSEG PROM
;=========LCD==================================
;A0=1为数据A0=0为命令
#defineA004H
#defineE102H
#defineE201H
#defineBIT_OUTP4OUT
#defineDATA_BUSP2OUT
;=============LCD____8RAM的位定义===============
#defineLCD_COM_BRAM0200H
#defineLCD_DATA_BRAM0201H
#defineLCD_LIE_BRAM0202H
#defineLCD_PAGE_BRAM0203H
;=============LCD_UP_RAM============================
#defineLCDUP_WORD0_BRAM 0204H
#defineLCDUP_WORD1_BRAM 0205H
#defineLCDUP_WORD2_BRAM 0206H
#defineLCDUP_WORD3_BRAM 0207H
#defineLCDUP_WORD4_BRAM 0208H
#defineLCDUP_WORD5_BRAM 0209H
#defineLCDUP_WORD6_BRAM 020AH
;==========下面的RAM只是在测试状态下才会用到=====
#defineLCDUP_WORD7_BRAM 020BH
;=============LCD_DOWN_RAM=====================
#defineLCDDOWN_WORD0_BRAM 020CH
#defineLCDDOWN_WORD1_BRAM 020DH
#defineLCDDOWN_WORD2_BRAM 020EH
#defineLCDDOWN_WORD3_BRAM 020FH
#defineLCDDOWN_WORD4_BRAM 0210H
#defineLCDDOWN_WORD5_BRAM 0211H
#defineLCDDOWN_WORD6_BRAM 0212H
;==========下面的RAM只是在测试状态下才会用到=====
#defineLCDDOWN_WORD7_BRAM 0213H
;=============LCD_数据寄存器_RAM=================
#defineLCD_R0_BRAM0214H
#defineLCD_R1_BRAM0215H
;=============LCD____16RAM的位定义===============
#defineLCD_COUNT_WRAM021CH
#defineLCD_WORD_WRAM021EH
;=============LCD____BIT的位定义===============
#defineLCD_BIT_RAM0220H
#defineLCD_E1_E20000H
;是LCD左右屏选择为BIT=1选通左边BIT=0选通右边
#defineLCD_INV02H
;高电平时显示反白
;---------------------------------------------------
;===========================================================
LCD_E1_COM
BIC.B#A0,&BIT_OUT;A0置低 设为命令通道
MOV.BLCD_COM_BRAM,&LCD_BUS ;输出命令
BIS.B#E1,&BIT_OUT ;开E1
BIC.B#E1,&BIT_OUT ;关E1
RET;反回
LCD_E2_COM
BIC.B#A0,&BIT_OUT ;A0置低 设为命令通道
MOV.BLCD_COM_BRAM,&LCD_BUS ;输出命令
BIS.B#E2,&BIT_OUT ;开E2
BIC.B#E2,&BIT_OUT ;关E2
RET;反回
LCD_E1_DATA
BIS.B#A0,&BIT_OUT ;A0置高 设为命令通道
MOV.BLCD_DATA_BRAM,&LCD_BUS ;输出命令
BIS.B#E1,&BIT_OUT ;开E1
BIC.B#E1,&BIT_OUT ;关E1
RET;反回
LCD_E2_DATA
BIS.B#A0,&BIT_OUT ;A0置高 设为数据通道
MOV.BLCD_DATA_BRAM,&LCD_BUS ;输出命令
BIS.B#E2,&BIT_OUT ;开E2
BIC.B#E2,&BIT_OUT ;关E2
RET;反回
;================CLEAR_LCD_DISPALY==============
;每次直接调用程序就可以清全屏显示 不须入口
LCD_CLEAR_ALL
CLRR15
CLRR14
LCD_CLEAR_ALL_1
BIS.B#0B8H,R15
MOV.BR15,LCD_COM_BRAM
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV.B#00H,LCD_COM_BRAM
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV.B#61D,R14
LCD_CLEAR_ALL_2
MOV.B#000H,LCD_DATA_BRAM
CALL#LCD_E1_DATA
CALL#LCD_E2_DATA
CLRZ
DEC.BR14
JNZLCD_CLEAR_ALL_2
INC.BR15
CLRZ
CMP.B#0BCH,R15
JNELCD_CLEAR_ALL_1
RET
;================CLEAR_LCD_DISPALY=============
;每次直接调用程序就可以清半屏显示
;调用前必须送入页地址到LCD_PAGE_RAM(页地址寄存器)
;例如:MOV.B #0B8H,LCD_PAGE_BRAM
;:CALL #LCD_CLEAR 就是清上半屏显示
;:MOV.B #0BAH,LCD_PAGE_BRAM
;:CALL #LCD_CLEAR 就是清下半屏显示
LCD_CLEAR
CLRR15
MOV.BLCD_PAGE_BRAM,LCD_LIE_BRAM
ADD.B#2D,LCD_LIE_BRAM
LCD_CLEAR_1
BIS.BLCD_PAGE_BRAM,R15
MOV.BR15,LCD_COM_BRAM
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV.B#00H,LCD_COM_BRAM
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV#61D,R14
LCD_CLEAR_2
MOV.B#00H,LCD_DATA_BRAM
CALL#LCD_E1_DATA
CALL#LCD_E2_DATA
CLRZ
DEC.BR14
JNZLCD_CLEAR_2
INC.BR15
CLRZ
CMP.BLCD_LIE_BRAM,R15
JNZLCD_CLEAR_1
RET
;===============RESETTING_LCD_MODE=============
;调用此程序是使LCD复位并进入工作状态
LCD_REST
MOV.B#0E2H,LCD_COM_BRAM ;复位
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV.B#0A4H,LCD_COM_BRAM ;关闭休闲状态
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV.B#0A9H,LCD_COM_BRAM ;设置1/32占空比
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV.B#0A0H,LCD_COM_BRAM ;正向排序设置
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV.B#0C0H,LCD_COM_BRAM ;设置显示起始行为第一行
CALL#LCD_E1_COM
CALL#LCD_E2_COM
MOV.B#0AFH,LCD_COM_BRAM ;开显示设置
CALL#LCD_E1_COM
CALL#LCD_E2_COM
RET
;查LCD PAGE #0B8H.#0B9H/#0BAH.#0BBH上屏须要显示的个数
;这段程序已测试过03-3-12 9:55
;R15/R14/R13
LCD_CHK
CLRLCD_COUNT_RAM
MOV.B#8,LCD_R0_RAM;查殉上屏须要显示的个数,一屏最多可以显示7个16X16
CLR.BLCD_LIE_BRAM;清上屏查殉结果寄存器
MOVLCD_WORD_RAM,R14 ;把须要检查字的首位16位地址放进R14.LCD_WORD_RAM
;定义时必须是16位地址
LCD_CHK_0
DEC.BLCD_R0_RAM
JZLCD_CHK_1;测试完成退出
CLRZ
MOV.B@R14+,LCD_COUNT_RAM
TST.BLCD_COUNT_RAM;测试每个字寄存器是否为零
JZLCD_CHK_0;为零时转
INC.BLCD_LIE_BRAM;大于零查殉结果寄存器加一
JMPLCD_CHK_0;反回测试
LCD_CHK_1
CLRLCD_COUNT_RAM
MOV.BLCD_LIE_BRAM,LCD_COUNT_RAM
MOVLCD_COUNT_RAM,&MPY ;把检测的结果乘以16
MOV#16D,&OP2
MOV&RESLO,LCD_COUNT_RAM ;相乘的结果放回寄存器
MOV.BLCD_COUNT_RAM,LCD_LIE_BRAM
RRA.BLCD_LIE_BRAM;结果除2.放到上屏页的寄存器
MOV.B#61D,LCD_COUNT_RAM
SUB.BLCD_LIE_BRAM,LCD_COUNT_RAM
MOV.BLCD_COUNT_RAM,LCD_LIE_BRAM
RET
;调用前必须把要显示屏第一个字的地址放在R15内
;列:MOV#LCDUP_WORD0_BRAM,LCD_WORD_RAM
;MOV#LCDDOWN_WORD0_BRAM,LCD_WORD_RAM
;用到的寄存器R15/R14
LCD
CLRZ
CMP.B#0B8H,LCD_PAGE_BRAM
JNELCD_1
MOV#LCDUP_WORD0_BRAM,LCD_WORD_RAM
JMPLCD_0
LCD_1 MOV#LCDDOWN_WORD0_BRAM,LCD_WORD_RAM
LCD_0 CALL#LCD_CHK
BIS.B#BIT0,LCD_BIT_RAM
MOV.B#7D,LCD_R1_RAM
;每次调用均连续显示7个16X16的字而遇到字寄存器是
MOVLCD_WORD_RAM,R15 ;零就反回因为字表里面是没有零的
LCD_DISPALY
CLRR14
MOV.B@R15+,R14
TSTR14;R15是显示字首位地址寄存器,准备用于间接寻址
JZLCD_RET;字寄存器是零就反回
MOV#32D,&MPY;查表然后吧结果送到寄存器
MOVR14,&OP2
MOV&RESLO,LCD_COUNT_RAM
ADD#LCD_DB,LCD_COUNT_RAM
MOVLCD_COUNT_RAM,R14
MOV.B#32D,LCD_R0_RAM;R14用于放计算查找数据的个数
LCD_PAGE
MOV.BLCD_PAGE_BRAM,LCD_COM_BRAM;把页地址送到命令寄存器
CLRZ
BIT.B#BIT0,LCD_BIT_RAM
;LCD_BIT_RAM的BIT0=LCD_E1_E2为高时转到E1发送,第就是E2
JZLCD_PAGE_E2;Z为零就转到E2否则向下工作
LCD_PAGE_E1
CALL#LCD_E1_COM;向E1发送页地址
JMPLCD_LIE;跳去列发送
LCD_PAGE_E2
CALL#LCD_E2_COM;向E2发送页地址
LCD_LIE
MOV.BLCD_LIE_BRAM,LCD_COM_BRAM;把列地址送到命令寄存器
CLRZ
BIT.B#BIT0,LCD_BIT_RAM
;LCD_BIT_RAM为高时转到E1发送,第就是E2
JZLCD_LIE_E2;Z为零就转到E2否则向下工作
LCD_LIE_E1
CALL#LCD_E1_COM;向E1发送列地址
JMPLCD_DATA
LCD_LIE_E2
CALL#LCD_E2_COM;向E2发送列地址
LCD_DATA
CALL#LCD_FIND_DATA;调用数据发送命令
CLRZ
BIT.B#BIT0,LCD_PAGE_BRAM ;测试页寄存器的BIT0位
JNZLCD_PAGE_0;大于零(即是BIT0=1)就转
BIS.B#BIT0,LCD_PAGE_BRAM ;把页寄存器的BIT0位置高(原来是低#0B8H/#0BAH)
JMPLCD_RETURN
LCD_PAGE_0
BIC.B#BIT0,LCD_PAGE_BRAM ;把页寄存器的BIT0位置低(原来是高#0B9H/#0BBH)
INC.BLCD_LIE_BRAM;列地址加一
CLRZ
CMP.B#61D,LCD_LIE_BRAM;检查列有没有超过61列
JNZLCD_RETURN;Z大于零就转等于零就向下工作
CLR.BLCD_LIE_BRAM;清列寄存器
CLRZ
BIT.B#BIT0,LCD_BIT_RAM ;测试LCD_BIT_RAM位在E1就转为E2 在E2就立即反回
JNZLCD_PAGE_1;Z为零就转到E2否则向下工作
JMPLCD_RET;转到子程序反回命令
LCD_PAGE_1
BIC.B#BIT0,LCD_BIT_RAM ;把LCD_BIT_RAM位置低设为E2显示状态
JMPLCD_PAGE;反回页传送命令地址
LCD_RETURN
CLRZ
DEC.BLCD_R0_RAM;查找数据的个数寄存器减1
JNZLCD_PAGE;R14大于零转回页传送命令地址
CLRZ
DEC.BLCD_R1_RAM;字个数寄存器减1
BIC.B#BIT0,LCD_PAGE_BRAM
JNZLCD_DISPALY;反回主显示调用程序
LCD_RET
RET;反回主程序
;===================================================
LCD_FIND_DATA
MOV.B@R14+,LCD_DATA_BRAM
CLRZ
BIT.B#INV_BIT,LCD_BIT_RAM
JZNO_INV
INV.BLCD_DATA_BRAM
NO_INV CLRZ
BIT.B#BIT0,LCD_BIT_RAM ;测试LCD_BIT_RAM位在E1就转为E2 在E2就立即反回
JZLCD_FIND_E2;Z为零就转到E2否则向下工作
CALL#LCD_E1_DATA;调用E1数据发送子程序
JMPLCD_FIND_DATA_RET
LCD_FIND_E2
CALL#LCD_E2_DATA;调用E2数据发送子程序
LCD_FIND_DATA_RET
RET
END LCD
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)