?? lcd1502驅動程序.txt
字號:
LCD1502驅動程序
--------------------------------------------------------------------------------
;LCD部分用到的RAM 0200H~~~~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)
;注 全屏清除子程序不需入口直接調用就行 而半屏清除子程序在調用前入口與半屏顯示子程序相同
#include "msp430x14x.h"
NAME LCD
MODULE LCD
PUBLIC LCD
RSEG PROM
;=========LCD==================================
;A0=1為數據 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只是在測試狀態下才會用到=====
#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只是在測試狀態下才會用到=====
#define LCDDOWN_WORD7_BRAM 0213H
;=============LCD_數據寄存器_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
;高電平時顯示反白
;---------------------------------------------------
;===========================================================
LCD_E1_COM
BIC.B #A0,&BIT_OUT ;A0置低 設為命令通道
MOV.B LCD_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.B LCD_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.B LCD_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.B LCD_DATA_BRAM,&LCD_BUS ;輸出命令
BIS.B #E2,&BIT_OUT ;開E2
BIC.B #E2,&BIT_OUT ;關E2
RET ;反回
;================CLEAR_LCD_DISPALY==============
;每次直接調用程序就可以清全屏顯示 不須入口
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=============
;每次直接調用程序就可以清半屏顯示
;調用前必須送入頁地址到LCD_PAGE_RAM(頁地址寄存器)
;例如: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=============
;調用此程序是使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
CLR LCD_COUNT_RAM
MOV.B #8,LCD_R0_RAM ;查殉上屏須要顯示的個數,一屏最多可以顯示7個16X16
CLR.B LCD_LIE_BRAM ;清上屏查殉結果寄存器
MOV LCD_WORD_RAM,R14 ;把須要檢查字的首位16位地址放進R14.LCD_WORD_RAM
;定義時必須是16位地址
LCD_CHK_0
DEC.B LCD_R0_RAM
JZ LCD_CHK_1 ;測試完成退出
CLRZ
MOV.B @R14+,LCD_COUNT_RAM
TST.B LCD_COUNT_RAM ;測試每個字寄存器是否為零
JZ LCD_CHK_0 ;為零時轉
INC.B LCD_LIE_BRAM ;大于零查殉結果寄存器加一
JMP LCD_CHK_0 ;反回測試
LCD_CHK_1
CLR LCD_COUNT_RAM
MOV.B LCD_LIE_BRAM,LCD_COUNT_RAM
MOV LCD_COUNT_RAM,&MPY ;把檢測的結果乘以16
MOV #16D,&OP2
MOV &RESLO,LCD_COUNT_RAM ;相乘的結果放回寄存器
MOV.B LCD_COUNT_RAM,LCD_LIE_BRAM
RRA.B LCD_LIE_BRAM ;結果除2.放到上屏頁的寄存器
MOV.B #61D,LCD_COUNT_RAM
SUB.B LCD_LIE_BRAM,LCD_COUNT_RAM
MOV.B LCD_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
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
;每次調用均連續顯示7個16X16的字 而遇到字寄存器是
MOV LCD_WORD_RAM,R15 ;零就反回因為字表里面是沒有零的
LCD_DISPALY
CLR R14
MOV.B @R15+,R14
TST R14 ;R15是顯示字首位地址寄存器,準備用于間接尋址
JZ LCD_RET ;字寄存器是零就反回
MOV #32D,&MPY ;查表然后吧結果送到寄存器
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用于放計算查找數據的個數
LCD_PAGE
MOV.B LCD_PAGE_BRAM,LCD_COM_BRAM;把頁地址送到命令寄存器
CLRZ
BIT.B #BIT0,LCD_BIT_RAM
;LCD_BIT_RAM的BIT0=LCD_E1_E2為高時轉到E1發送,第就是E2
JZ LCD_PAGE_E2 ;Z為零就轉到E2 否則向下工作
LCD_PAGE_E1
CALL #LCD_E1_COM ;向E1發送頁地址
JMP LCD_LIE ;跳去列發送
LCD_PAGE_E2
CALL #LCD_E2_COM ;向E2發送頁地址
LCD_LIE
MOV.B LCD_LIE_BRAM,LCD_COM_BRAM;把列地址送到命令寄存器
CLRZ
BIT.B #BIT0,LCD_BIT_RAM
;LCD_BIT_RAM為高時轉到E1發送,第就是E2
JZ LCD_LIE_E2 ;Z為零就轉到E2 否則向下工作
LCD_LIE_E1
CALL #LCD_E1_COM ;向E1發送列地址
JMP LCD_DATA
LCD_LIE_E2
CALL #LCD_E2_COM ;向E2發送列地址
LCD_DATA
CALL #LCD_FIND_DATA ;調用數據發送命令
CLRZ
BIT.B #BIT0,LCD_PAGE_BRAM ;測試頁寄存器的BIT0位
JNZ LCD_PAGE_0 ;大于零(即是BIT0=1)就轉
BIS.B #BIT0,LCD_PAGE_BRAM ;把頁寄存器的BIT0位置高(原來是低#0B8H/#0BAH)
JMP LCD_RETURN
LCD_PAGE_0
BIC.B #BIT0,LCD_PAGE_BRAM ;把頁寄存器的BIT0位置低(原來是高#0B9H/#0BBH)
INC.B LCD_LIE_BRAM ;列地址加一
CLRZ
CMP.B #61D,LCD_LIE_BRAM ;檢查列有沒有超過61列
JNZ LCD_RETURN ;Z大于零就轉 等于零就向下工作
CLR.B LCD_LIE_BRAM ;清列寄存器
CLRZ
BIT.B #BIT0,LCD_BIT_RAM ;測試LCD_BIT_RAM位 在E1就轉為E2 在E2就立即反回
JNZ LCD_PAGE_1 ;Z為零就轉到E2 否則向下工作
JMP LCD_RET ;轉到子程序反回命令
LCD_PAGE_1
BIC.B #BIT0,LCD_BIT_RAM ;把LCD_BIT_RAM位置低 設為E2顯示狀態
JMP LCD_PAGE ;反回頁傳送命令地址
LCD_RETURN
CLRZ
DEC.B LCD_R0_RAM ;查找數據的個數寄存器減1
JNZ LCD_PAGE ;R14大于零轉回頁傳送命令地址
CLRZ
DEC.B LCD_R1_RAM ;字個數寄存器減1
BIC.B #BIT0,LCD_PAGE_BRAM
JNZ LCD_DISPALY ;反回主顯示調用程序
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 ;測試LCD_BIT_RAM位 在E1就轉為E2 在E2就立即反回
JZ LCD_FIND_E2 ;Z為零就轉到E2 否則向下工作
CALL #LCD_E1_DATA ;調用E1數據發送子程序
JMP LCD_FIND_DATA_RET
LCD_FIND_E2
CALL #LCD_E2_DATA ;調用E2數據發送子程序
LCD_FIND_DATA_RET
RET
END LCD
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -