?? lcd初始化.inc
字號:
;LCD初始化程序--------------------------------------------------------------
lcd_ini:
;文本顯示區域設置
mov lcd_data1,#00h;設置文本顯示區域首地址
mov lcd_data2,#10h;(從顯存10000h至1200h單元為為本顯示區)
mov lcd_com_reg,#40h
lcall lcd_two_data_wr;調用寫雙字節參數指令子程序
mov lcd_data1,#20h;set文本顯示區寬度
mov lcd_data2,#00h
mov lcd_com_reg,#41h;文本顯示區寬度設置指令代碼
lcall lcd_two_data_wr
;圖形顯示區域設置
mov lcd_data1,#00h;設置圖形顯示區域首地址
mov lcd_data2,#00h;(顯存0000h-1000h單元為圖形顯示區域)
mov lcd_com_reg,#42h;圖形顯示區域首地址設置指令代碼
lcall lcd_two_data_wr;調用寫雙字節參數指令子程序
mov lcd_data1,#20h;set圖形顯示區寬度
mov lcd_data2,#00h
mov lcd_com_reg,#43h;圖形顯示區寬度設置指令代碼
lcall lcd_two_data_wr
;顯示方式及顯示開關設置
mov lcd_com_reg,#81h;顯示方式設定
lcall lcd_not_data_wr;調用not data read-in program
mov lcd_com_reg,#9ch;顯示開關設置(94為文本顯示,98為圖形顯示,9c為文本+圖形顯示)
lcall lcd_not_data_wr;調用無參數寫入子程序
;清除圖形顯示區域
mov lcd_data1,#00h
mov lcd_data2,#00h
mov lcd_com_reg,#24h;設置寫入數據首地址(1000h)
lcall lcd_two_data_wr
lcall auto_write_set;設置自動寫入方式
push 03h
push 04h
mov r3,#00h;設置循環量(共清除5120byte,其中文本顯示區512byte,CGRAM區)
mov r4,#10h;34h
lcall lcd_not_data_wr;調用無參數寫入子程序
clear_1: lcall st3;判斷auto read-in 狀態位
mov a,#00h;正常顯示數據
jnb mirror_bit,clear_1a;判斷是否進行反向顯示
mov a,#0ffh;反向顯示數據
clear_1a: lcall pr13;調用data read-in program
djnz r3,clear_1;循環read-in data(共寫入28kb byte data)
djnz r4,clear_1
lcall auto_write_over;設置自動寫入終止
;清除文本顯示區域
mov lcd_data1,#00h
mov lcd_data2,#10h
mov lcd_com_reg,#24h;設置寫入數據首地址(1000h)
lcall lcd_two_data_wr
lcall auto_write_set;設置自動寫入方式
mov r3,#00h
mov r4,#10h
lcall lcd_not_data_wr;調用無參數寫入子程序
clear_2: lcall st3;判斷auto read-in 狀態位
mov a,#0h
lcall pr13;調用data read-in program
djnz r3,clear_2;循環read-in data(共寫入28kb byte data)
djnz r4,clear_2
lcall auto_write_over;設置自動寫入終止
pop 04h
pop 03h
ret
;auto read-in mode set------------------------------------------------------
auto_write_set: mov lcd_com_reg,#0b0h;set auto read-in mode
lcall lcd_not_data_wr
ret
;auto read-in mode over-----------------------------------------------------
auto_write_over: mov lcd_com_reg,#0b3h;set auto read-in stop instruction
lcall lcd_not_data_wr
ret
;單字節數據寫入方式設定-----------------------------------------------------
one_byte_data_write_set:mov lcd_com_reg,#0c0h;設置單字節寫入方式
lcall lcd_one_data_wr
ret
;read status byte-----------------------------------------------------------
r_st: mov dptr_reg,#1
MOV DPTR,#lcd_c_add;設置指令通道地址
xch a,dph
anl a,p2
xch a,dph
MOVX A,@DPTR;read state byte
mov dptr_reg,#0
RET
;判斷LCD status bit,STA0 STA1-----------------------------------------------
;D0 STA0: LCD指令讀寫狀態 1:準備好 0:忙
;D1 STA1: LCD數據讀寫狀態 1:準備好 0:忙
st01:
push 02h
mov r2,#00h
st01_1: lcall r_st;調用read status byte program
djnz r2,st01_2
lcall alarm_2
ajmp $
st01_2: jnb acc.0,st01_1;判斷STA0 status
jnb acc.1,st01_1;判斷STA1 status
pop 02h
ret
;判斷LCD status bit,STA2----------------------------------------------------
;D2 STA2: LCD數據自動讀狀態 1:準備好 0:忙
st2: push 02h
mov r2,#00h
st2_1: lcall r_st;調用read status byte program
djnz r2,st2_2
lcall alarm_2
ljmp $
st2_2: jnb acc.2,st2_1;判斷STA2 status
pop 02h
ret
;判狀LCD status bit STA3----------------------------------------------------
;D3 STA3: LCD數據自動寫狀態 1:準備好 0:忙
st3: push 02h
mov r2,#00h
st3_1: lcall r_st;調用read status byte program
djnz r2,st3_2
lcall alarm_2
ajmp $
st3_2: jnb acc.3,st3_1;判斷STA3 status
pop 02h
ret
;寫指令和寫數據子程序-------------------------------------------------------
lcd_two_data_wr: lcall st01;雙字節參數指令寫入入口
mov a,lcd_data1;取第一個參數
lcall pr13;寫入參數
lcd_one_data_wr: lcall st01;單字節參數指令寫入入口
mov a,lcd_data2;取第二個參數
lcall pr13
lcd_not_data_wr: lcall st01;無參數指令寫入入口
mov a,lcd_com_reg;取指令代碼
ljmp pr14;寫入指令代碼
pr13: mov dptr_reg,#1
mov dptr,#lcd_d_add;設置數據通道地址
pr14: mov dptr_reg,#1
xch a,dph
anl a,p2
xch a,dph
movx @dptr,a;寫入操作數
mov dptr_reg,#0
ret
;讀數據子程序---------------------------------------------------------------
pr2: lcall st01 ;判斷狀態位
mov dptr_reg,#1
mov dptr,#lcd_d_add;設置數據通道地址
xch a,dph
anl a,p2
xch a,dph
movx a,@dptr;讀操作數
mov dptr_reg,#0
mov lcd_data2,a
ret
;圖形數據寫入位置計算---------------------------------------------------------
figure_data_wr_addr_count:
mov a,lcd_y;lcd數據寫入位置計算
mov b,#32d
mul ab
add a,lcd_x
mov lcd_x,a
mov a,b
mov lcd_y,a
mov lcd_com_reg,#24h
lcall lcd_two_data_wr;設置寫入位置
ret
;字符數據寫入位置計算---------------------------------------------------------
ascci_data_wr_addr_count:
mov a,lcd_y
mov b,#32
mul ab
add a,lcd_x
mov lcd_x,a
mov a,b
add a,#10h
mov lcd_y,a
mov lcd_com_reg,#24h
lcall lcd_two_data_wr;設置寫入位置
ret
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -