|
| -------------------------------------------------------------------------------- ;LCD部分用到的RAM 0200H~~~~021FH 用到的Rn有R15/R14 ;LCD復(fù)位子程序(LCD_REST)不須要設(shè)事先置直接調(diào)用即可 ;半屏顯示子程序(LCD)在調(diào)用前必須送入頁(yè)地址 例如:MOV.B #0B8H,LCD_PAGE_BRAM ; CALL #LCD 顯示上屏 ; :MOV.B #0BAH,LCD_PAGE_BRAM ; CALL #LCD 顯示下屏 ;LCDUP_WORD0_BRAM~~~LCDUP_WORD6_RAM 是上屏顯示字的代碼寄存器一屏顯示7個(gè)字 ;LCDDOWN_WORD0_BRAM~~~LCDDOWN_WORD6_RAM 是下屏顯示字的代碼寄存器一屏顯示7個(gè)字 ;每屏顯示是以中間為基準(zhǔn)向兩邊平均顯示 在調(diào)用半屏顯示子程序時(shí)已經(jīng)自動(dòng)計(jì)算LCD的列地址 ;清屏指令可分全屏清除(LCD_CLEAR_ALL)和半屏清除(LCD_CLEAR) ;注 全屏清除子程序不需入口直接調(diào)用就行 而半屏清除子程序在調(diào)用前入口與半屏顯示子程序相同 #i nclude "msp430x14x.h" NAME LCD MODULE LCD PUBLIC LCD RSEG PROM ;=========LCD================================== ;A0=1為數(shù)據(jù) A0=0為命令 #define A0 04H #define E1 02H #define E2 01H #define BIT_OUT P4OUT #define DATA_BUS P2OUT ;=============LCD____8RAM的位定義=============== #define LCD_COM_BRAM 0200H #define LCD_DATA_BRAM 0201H #define LCD_LIE_BRAM 0202H #define LCD_PAGE_BRAM 0203H ;=============LCD_UP_RAM============================ #define LCDUP_WORD0_BRAM 0204H #define LCDUP_WORD1_BRAM 0205H #define LCDUP_WORD2_BRAM 0206H #define LCDUP_WORD3_BRAM 0207H #define LCDUP_WORD4_BRAM 0208H #define LCDUP_WORD5_BRAM 0209H #define LCDUP_WORD6_BRAM 020AH ;==========下面的RAM只是在測(cè)試狀態(tài)下才會(huì)用到===== #define LCDUP_WORD7_BRAM 020BH ;=============LCD_DOWN_RAM===================== #define LCDDOWN_WORD0_BRAM 020CH #define LCDDOWN_WORD1_BRAM 020DH #define LCDDOWN_WORD2_BRAM 020EH #define LCDDOWN_WORD3_BRAM 020FH #define LCDDOWN_WORD4_BRAM 0210H #define LCDDOWN_WORD5_BRAM 0211H #define LCDDOWN_WORD6_BRAM 0212H ;==========下面的RAM只是在測(cè)試狀態(tài)下才會(huì)用到===== #define LCDDOWN_WORD7_BRAM 0213H ;=============LCD_數(shù)據(jù)寄存器_RAM================= #define LCD_R0_BRAM 0214H #define LCD_R1_BRAM 0215H ;=============LCD____16RAM的位定義=============== #define LCD_COUNT_WRAM 021CH #define LCD_WORD_WRAM 021EH ;=============LCD____BIT的位定義=============== #define LCD_BIT_RAM 0220H #define LCD_E1_E2 0000H ;是LCD左右屏選擇為BIT=1選通左邊 BIT=0選通右邊 #define LCD_INV 02H ;高電平時(shí)顯示反白 ;--------------------------------------------------- ;=========================================================== LCD_E1_COM BIC.B #A0,&BIT_OUT ;A0置低 設(shè)為命令通道 MOV.B LCD_COM_BRAM,&LCD_BUS ;輸出命令 BIS.B #E1,&BIT_OUT ;開(kāi)E1 BIC.B #E1,&BIT_OUT ;關(guān)E1 RET ;反回
LCD_E2_COM BIC.B #A0,&BIT_OUT ;A0置低 設(shè)為命令通道 MOV.B LCD_COM_BRAM,&LCD_BUS ;輸出命令 BIS.B #E2,&BIT_OUT ;開(kāi)E2 BIC.B #E2,&BIT_OUT ;關(guān)E2 RET ;反回
LCD_E1_DATA BIS.B #A0,&BIT_OUT ;A0置高 設(shè)為命令通道 MOV.B LCD_DATA_BRAM,&LCD_BUS ;輸出命令 BIS.B #E1,&BIT_OUT ;開(kāi)E1 BIC.B #E1,&BIT_OUT ;關(guān)E1 RET ;反回
LCD_E2_DATA BIS.B #A0,&BIT_OUT ;A0置高 設(shè)為數(shù)據(jù)通道 MOV.B LCD_DATA_BRAM,&LCD_BUS ;輸出命令 BIS.B #E2,&BIT_OUT ;開(kāi)E2 BIC.B #E2,&BIT_OUT ;關(guān)E2 RET ;反回 ;================CLEAR_LCD_DISPALY============== ;每次直接調(diào)用程序就可以清全屏顯示 不須入口 LCD_CLEAR_ALL CLR R15 CLR R14 LCD_CLEAR_ALL_1 BIS.B #0B8H,R15 MOV.B R15,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.B R14 JNZ LCD_CLEAR_ALL_2 INC.B R15 CLRZ CMP.B #0BCH,R15 JNE LCD_CLEAR_ALL_1 RET ;================CLEAR_LCD_DISPALY============= ;每次直接調(diào)用程序就可以清半屏顯示 ;調(diào)用前必須送入頁(yè)地址到LCD_PAGE_RAM(頁(yè)地址寄存器) ;例如:MOV.B #0B8H,LCD_PAGE_BRAM ; :CALL #LCD_CLEAR 就是清上半屏顯示 ; :MOV.B #0BAH,LCD_PAGE_BRAM ; :CALL #LCD_CLEAR 就是清下半屏顯示 LCD_CLEAR CLR R15 MOV.B LCD_PAGE_BRAM,LCD_LIE_BRAM ADD.B #2D,LCD_LIE_BRAM LCD_CLEAR_1 BIS.B LCD_PAGE_BRAM,R15 MOV.B R15,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.B R14 JNZ LCD_CLEAR_2 INC.B R15 CLRZ CMP.B LCD_LIE_BRAM,R15 JNZ LCD_CLEAR_1 RET
;===============RESETTING_LCD_MODE============= ;調(diào)用此程序是使LCD復(fù)位并進(jìn)入工作狀態(tài) LCD_REST MOV.B #0E2H,LCD_COM_BRAM ;復(fù)位 CALL #LCD_E1_COM CALL #LCD_E2_COM
MOV.B #0A4H,LCD_COM_BRAM ;關(guān)閉休閑狀態(tài) CALL #LCD_E1_COM CALL #LCD_E2_COM
MOV.B #0A9H,LCD_COM_BRAM ;設(shè)置1/32占空比 CALL #LCD_E1_COM CALL #LCD_E2_COM
MOV.B #0A0H,LCD_COM_BRAM ;正向排序設(shè)置 CALL #LCD_E1_COM CALL #LCD_E2_COM
MOV.B #0C0H,LCD_COM_BRAM ;設(shè)置顯示起始行為第一行 CALL #LCD_E1_COM CALL #LCD_E2_COM
MOV.B #0AFH,LCD_COM_BRAM ;開(kāi)顯示設(shè)置 CALL #LCD_E1_COM CALL #LCD_E2_COM RET
;查L(zhǎng)CD PAGE #0B8H.#0B9H/#0BAH.#0BBH上屏須要顯示的個(gè)數(shù) ;這段程序已測(cè)試過(guò) 03-3-12 9:55 ;R15/R14/R13 LCD_CHK CLR LCD_COUNT_RAM MOV.B #8,LCD_R0_RAM ;查殉上屏須要顯示的個(gè)數(shù),一屏最多可以顯示7個(gè)16X16 CLR.B LCD_LIE_BRAM ;清上屏查殉結(jié)果寄存器 MOV LCD_WORD_RAM,R14 ;把須要檢查字的首位16位地址放進(jìn)R14.LCD_WORD_RAM ;定義時(shí)必須是16位地址 LCD_CHK_0 DEC.B LCD_R0_RAM JZ LCD_CHK_1 ;測(cè)試完成退出 CLRZ MOV.B @R14+,LCD_COUNT_RAM TST.B LCD_COUNT_RAM ;測(cè)試每個(gè)字寄存器是否為零 JZ LCD_CHK_0 ;為零時(shí)轉(zhuǎn) INC.B LCD_LIE_BRAM ;大于零查殉結(jié)果寄存器加一 JMP LCD_CHK_0 ;反回測(cè)試 LCD_CHK_1 CLR LCD_COUNT_RAM MOV.B LCD_LIE_BRAM,LCD_COUNT_RAM MOV LCD_COUNT_RAM,&MPY ;把檢測(cè)的結(jié)果乘以16 MOV #16D,&OP2 MOV &RESLO,LCD_COUNT_RAM ;相乘的結(jié)果放回寄存器 MOV.B LCD_COUNT_RAM,LCD_LIE_BRAM RRA.B LCD_LIE_BRAM ;結(jié)果除2.放到上屏頁(yè)的寄存器 MOV.B #61D,LCD_COUNT_RAM SUB.B LCD_LIE_BRAM,LCD_COUNT_RAM MOV.B LCD_COUNT_RAM,LCD_LIE_BRAM RET ;調(diào)用前必須把要顯示屏第一個(gè)字的地址放在R15內(nèi) ;列:MOV #LCDUP_WORD0_BRAM,LCD_WORD_RAM ;MOV #LCDDOWN_WORD0_BRAM,LCD_WORD_RAM ;用到的寄存器R15/R14 LCD CLRZ CMP.B #0B8H,LCD_PAGE_BRAM JNE LCD_1 MOV #LCDUP_WORD0_BRAM,LCD_WORD_RAM JMP LCD_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 ;每次調(diào)用均連續(xù)顯示7個(gè)16X16的字 而遇到字寄存器是 MOV LCD_WORD_RAM,R15 ;零就反回因?yàn)樽直砝锩媸菦](méi)有零的 LCD_DISPALY CLR R14 MOV.B @R15+,R14 TST R14 ;R15是顯示字首位地址寄存器,準(zhǔn)備用于間接尋址 JZ LCD_RET ;字寄存器是零就反回 MOV #32D,&MPY ;查表然后吧結(jié)果送到寄存器 MOV R14,&OP2 MOV &RESLO,LCD_COUNT_RAM ADD #LCD_DB,LCD_COUNT_RAM MOV LCD_COUNT_RAM,R14 MOV.B #32D,LCD_R0_RAM ;R14用于放計(jì)算查找數(shù)據(jù)的個(gè)數(shù) LCD_PAGE MOV.B LCD_PAGE_BRAM,LCD_COM_BRAM;把頁(yè)地址送到命令寄存器 CLRZ BIT.B #BIT0,LCD_BIT_RAM ;LCD_BIT_RAM的BIT0=LCD_E1_E2為高時(shí)轉(zhuǎn)到E1發(fā)送,第就是E2 JZ LCD_PAGE_E2 ;Z為零就轉(zhuǎn)到E2 否則向下工作 LCD_PAGE_E1 CALL #LCD_E1_COM ;向E1發(fā)送頁(yè)地址 JMP LCD_LIE ;跳去列發(fā)送 LCD_PAGE_E2 CALL #LCD_E2_COM ;向E2發(fā)送頁(yè)地址 LCD_LIE MOV.B LCD_LIE_BRAM,LCD_COM_BRAM;把列地址送到命令寄存器 CLRZ BIT.B #BIT0,LCD_BIT_RAM ;LCD_BIT_RAM為高時(shí)轉(zhuǎn)到E1發(fā)送,第就是E2 JZ LCD_LIE_E2 ;Z為零就轉(zhuǎn)到E2 否則向下工作 LCD_LIE_E1 CALL #LCD_E1_COM ;向E1發(fā)送列地址 JMP LCD_DATA LCD_LIE_E2 CALL #LCD_E2_COM ;向E2發(fā)送列地址 LCD_DATA CALL #LCD_FIND_DATA ;調(diào)用數(shù)據(jù)發(fā)送命令 CLRZ BIT.B #BIT0,LCD_PAGE_BRAM ;測(cè)試頁(yè)寄存器的BIT0位 JNZ LCD_PAGE_0 ;大于零(即是BIT0=1)就轉(zhuǎn) BIS.B #BIT0,LCD_PAGE_BRAM ;把頁(yè)寄存器的BIT0位置高(原來(lái)是低#0B8H/#0BAH) JMP LCD_RETURN LCD_PAGE_0 BIC.B #BIT0,LCD_PAGE_BRAM ;把頁(yè)寄存器的BIT0位置低(原來(lái)是高#0B9H/#0BBH) INC.B LCD_LIE_BRAM ;列地址加一 CLRZ CMP.B #61D,LCD_LIE_BRAM ;檢查列有沒(méi)有超過(guò)61列 JNZ LCD_RETURN ;Z大于零就轉(zhuǎn) 等于零就向下工作 CLR.B LCD_LIE_BRAM ;清列寄存器 CLRZ BIT.B #BIT0,LCD_BIT_RAM ;測(cè)試LCD_BIT_RAM位 在E1就轉(zhuǎn)為E2 在E2就立即反回 JNZ LCD_PAGE_1 ;Z為零就轉(zhuǎn)到E2 否則向下工作 JMP LCD_RET ;轉(zhuǎn)到子程序反回命令 LCD_PAGE_1 BIC.B #BIT0,LCD_BIT_RAM ;把LCD_BIT_RAM位置低 設(shè)為E2顯示狀態(tài) JMP LCD_PAGE ;反回頁(yè)傳送命令地址 LCD_RETURN CLRZ DEC.B LCD_R0_RAM ;查找數(shù)據(jù)的個(gè)數(shù)寄存器減1 JNZ LCD_PAGE ;R14大于零轉(zhuǎn)回頁(yè)傳送命令地址 CLRZ DEC.B LCD_R1_RAM ;字個(gè)數(shù)寄存器減1 BIC.B #BIT0,LCD_PAGE_BRAM JNZ LCD_DISPALY ;反回主顯示調(diào)用程序 LCD_RET RET ;反回主程序
;=================================================== LCD_FIND_DATA MOV.B @R14+,LCD_DATA_BRAM CLRZ BIT.B #INV_BIT,LCD_BIT_RAM JZ NO_INV INV.B LCD_DATA_BRAM NO_INV CLRZ BIT.B #BIT0,LCD_BIT_RAM ;測(cè)試LCD_BIT_RAM位 在E1就轉(zhuǎn)為E2 在E2就立即反回 JZ LCD_FIND_E2 ;Z為零就轉(zhuǎn)到E2 否則向下工作 CALL #LCD_E1_DATA ;調(diào)用E1數(shù)據(jù)發(fā)送子程序 JMP LCD_FIND_DATA_RET LCD_FIND_E2 CALL #LCD_E2_DATA ;調(diào)用E2數(shù)據(jù)發(fā)送子程序 LCD_FIND_DATA_RET RET END LCD |
|