?? 2005825101562.txt
字號:
1335(dhd0)
這幾天正在做帶液晶屏的項目,89C52直接控制方式,下面是簡單的顯示兩個漢字的調試用程
序,今貼上來希望對同我一樣是新手的人有一點幫助.
;-------------------------------------------------------------------
;SED1335
; LCM指令端口地址FFFFH:數據端口地址:FFFEH
; 320*240點陣整屏的點象素為76800,也就有9600(2580H)個字節,單屏圖形方式
; 所以第一區顯示緩存地址范圍為:0000H----257FH
; 所以第二區顯示緩存地址范圍為:2580H----4AFFH
; 所以第三區顯示緩存地址范圍為:4B00H----707FH
; 320*240點陣整屏---一行占40個字節的顯示緩存
;
;--------------------------------------------------------------------
#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define LcdCommand XBYTE[0xFFFF]
#define LcdDataWrite XBYTE[0xFFFE]
uchar code ZKWU[]=
{0x00,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,0x1F,0xF0,0x00,0x00,0x00,0x10,0x3F,
0xF8,0x01,0x00,0x01,0x04,0xFF,0xFE,0x02,0x80,0x02,0x40,0x04,0x20,0x18,0x1C,0x60,
0x08};
uchar code ZKLIN[]=
{0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0xFD,0xFE,0x10,0x20,0x10,0x60,0x38,0x70
,
0x34,0xB0,0x54,0xA8,0x51,0x28,0x92,0x26,0x14,0x24,0x10,0x20,0x10,0x20,0x10,0x20}
;
void Initialize(void);
void delay(uint);
void SetCursor(uchar,uchar);
void WriteOneWork(uchar,uchar,uchar *);
void WriteLine(uchar,uchar,uchar);
void main(void)
{
uchar i;
SP=0x60;
EA=0;
delay(0x30);
Initialize();
delay(0x9);
LcdCommand=0x4f; /* 光標地址自動向下增一 */
WriteOneWork(0,0,ZKWU);
WriteOneWork(0x2,0x80,ZKLIN);
while(1);
}
/******************************** 初始化LCD函數
********************************/
void Initialize(void)
{
uint i;
LcdCommand=0x40; /* ---------LCD SYSTEM SET系統設置令,8個參數-----
--- */
LcdDataWrite=0x30;
LcdDataWrite=0x87;
LcdDataWrite=0x07;
LcdDataWrite=39; /* 顯示域長度為320dot */
LcdDataWrite=0x36; /* 確定液晶工作頻率 */
LcdDataWrite=239; /* 顯示屏高度為240dot */
LcdDataWrite=40; /* 顯示屏一行所占顯示緩沖區字節數(L) */
LcdDataWrite=0; /* 顯示屏一行所占顯示緩沖區字節數(H) */
delay(0x9);
LcdCommand=0x44; /* ---------LCD SCROLL顯示區設置命令,最多10個參
數--------- */
LcdDataWrite=0x00; /* 顯示1區對應的顯示RAM起始高8位地址 */
LcdDataWrite=0x00; /* 顯示1區對應的顯示RAM起始低8位地址 */
LcdDataWrite=240; /* 顯示1區占用240個dot行 */
LcdDataWrite=0x80; /* 顯示2區對應的顯示RAM起始低8位地址 */
LcdDataWrite=0x25; /* 顯示2區對應的顯示RAM起始高8位地址 */
LcdDataWrite=240; /* 顯示3區占用240個dot行 */
LcdDataWrite=0x00; /* 顯示3區對應的顯示RAM起始低8位地址 */
LcdDataWrite=0x4b; /* 顯示3區對應的顯示RAM起始高8位地址 */
delay(0x9);
LcdCommand=0x5a; /* 水平卷動,初始化時必須清零 */
LcdDataWrite=0x00;
delay(0x9);
LcdCommand=0x5b; /* 各個顯示區的合成方式,1個參數 */
LcdDataWrite=0x1c; /* 參數:顯示方式為三屏圖形疊加,邏輯或 */
delay(0x9);
LcdCommand=0x59; /* 打開顯示,1個參數 */
LcdDataWrite=0x04; /* 只顯示第一個區并關閃爍 */
delay(0x9);
LcdCommand=0x4c; /* 光標自動向右增一?*/
delay(0x9);
LcdCommand=0x46; /* 設定光標位置命令 */
LcdDataWrite=0; /* 從0000位置開始 */
LcdDataWrite=0;
delay(0x9);
LcdCommand=0x42; /* 允許MPU連續地把顯示數據寫入顯示區內命令 */
for(i=0;i<32760;i++)
{
LcdDataWrite=0; /* 將32K顯緩全部清零,即LCD不顯示任何東西 */
}
}
/* --------------------------設定光標,允許顯示------------------------- */
void SetCursor(uchar CursorHIGH,uchar CursorLOW)
{
delay(0x9);
LcdCommand=0x46; /* 設定光標位置命令 */
LcdDataWrite=CursorLOW; /* 從0000位置開始 */
LcdDataWrite=CursorHIGH;
delay(0x9);
LcdCommand=0x42; /* 允許MPU連續地把顯示數據寫入顯示區內命令 */
}
/* ---------------------------在指定位置顯示一個漢字---------------------------
*/
void WriteOneWork(uchar CurHIGH,uchar CurLOW,uchar * ZiKu)
{
uchar i;
SetCursor(CurHIGH,CurLOW); /* 設定光標,允許顯示 */
i=0;
do
{
LcdDataWrite=ZiKu[i];
i=i+2;
}
while(i<0x1e);
SetCursor(CurHIGH,CurLOW+1);
i=1;
while(i<0x1f)
{
LcdDataWrite=ZiKu[i];
i=i+2;
}
}
/* ----------------------延時子程序----------------------------- */
void delay(uint delx)
{
uint i=0;
while(i<delx)
{
i++;
}
}
這幾天正在做帶液晶屏的項目,89C52直接控制方式,下面是簡單的顯示兩個漢字的調試用程
序,今貼上來希望對同我一樣是新手的人有一點幫助.
;-------------------------------------------------------------------
;
; LCM指令端口地址FFFFH:數據端口地址:FFFEH
; 320*240點陣整屏的點象素為76800,也就有9600(2580H)個字節,單屏圖形方式
; 所以第一區顯示緩存地址范圍為:0000H----257FH
; 所以第二區顯示緩存地址范圍為:2580H----4AFFH
; 所以第三區顯示緩存地址范圍為:4B00H----707FH
; 320*240點陣整屏---一行占40個字節的顯示緩存
;
;--------------------------------------------------------------------
DAT EQU 0FFFEH ;數據端口地址
COM EQU 0FFFFH ;指令端口地址
SD1L EQU 00H ;第一區開始顯示的顯緩首地址的低八位
SD1H EQU 00H ;第一區開始顯示的顯緩首地址的高八位
SD2L EQU 80H ;第二區開始顯示的顯緩首地址的低八位
SD2H EQU 25H ;第二區開始顯示的顯緩首地址的高八位
SD3L EQU 00H ;第三區開始顯示的顯緩首地址的低八位
SD3H EQU 4BH ;第三區開始顯示的顯緩首地址的高八位
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV SP,#60H
ACALL DELAY400MS ;上電復位初始化LCD的延時
LCALL INITIALIZE ;先初始化LCD
MOV DPTR,#COM
MOV A,#4FH ;光標地址自動增1方向命令(向下)
MOVX @DPTR,A
MOV A,#42H ;允許MPU連續地把顯示數據寫入顯示區內
MOVX @DPTR,A
MOV R3,#00H
DISLEFT: ;寫入字的左半邊
MOV DPTR,#DISWU
MOV A,R3
MOVC A,@A+DPTR
MOV DPTR,#DAT
MOVX @DPTR,A
INC R3
INC R3
CJNE R3,#20H,DISLEFT
MOV DPTR,#COM ;設置光標位置
MOV A,#46H
MOVX @DPTR,A
MOV DPTR,#DAT
MOV A,#1
MOVX @DPTR,A
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#42H
MOVX @DPTR,A
MOV R3,#01H
DISRIGHT: ;寫入字的右半邊
MOV DPTR,#DISWU
MOV A,R3
MOVC A,@A+DPTR
MOV DPTR,#DAT
MOVX @DPTR,A
INC R3
INC R3
CJNE R3,#21H,DISRIGHT
MOV DPTR,#COM ;設置光標位置
MOV A,#46H
MOVX @DPTR,A
MOV DPTR,#DAT
MOV A,#38
MOVX @DPTR,A
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#42H
MOVX @DPTR,A
MOV R3,#0
DISLEFT2: ;寫入字的左半邊
MOV DPTR,#DISLIN
MOV A,R3
MOVC A,@A+DPTR
MOV DPTR,#DAT
MOVX @DPTR,A
INC R3
INC R3
CJNE R3,#20H,DISLEFT2
MOV DPTR,#COM ;設置光標位置
MOV A,#46H
MOVX @DPTR,A
MOV DPTR,#DAT
MOV A,#39
MOVX @DPTR,A
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#42H
MOVX @DPTR,A
MOV R3,#1
DISRIGHT2: ;寫入字的右半邊
MOV DPTR,#DISLIN
MOV A,R3
MOVC A,@A+DPTR
MOV DPTR,#DAT
MOVX @DPTR,A
INC R3
INC R3
CJNE R3,#21H,DISRIGHT2
AJMP $
DISLIN:
DB 10H,20H,10H,20H,10H,20H,10H,20H,0FDH,0FEH,10H,20H,10H,60H,38H,70H
DB 34H,0B0H,54H,0A8H,51H,28H,92H,26H,14H,24H,10H,20H,10H,20H,10H,20H
DISWU:
DB 00H,10H,1FH,0F8H,10H,10H,10H,10H,1FH,0F0H,00H,00H,00H,10H,3FH,0F8H
DB
01H,00H,01H,04H,0FFH,0FEH,02H,80H,02H,40H,04H,20H,18H,1CH,60H,08H
;---------------------------------LCD 初始化子程序------------------------------
INITIALIZE:
MOV DPTR,#COM
MOV A,#40H ;==========================LCD SYSTEM
SET命令==========================
MOVX @DPTR,A
MOV DPTR,#DAT
MOV A,#30H ;參數P1=#30H,顯示無邊界,內部字符發生器
有效
MOVX @DPTR,A
MOV A,#87H ;參數P2=#87H,8列/字符,40字符/顯示行(顯示
字符寬度)
MOVX @DPTR,A
MOV A,#07H ;參數P3=#07H,8行/字符(顯示字符高度)
MOVX @DPTR,A
MOV A,#40 ;參數P4=#27H,一行顯示的長度為39個字符(一
行有效顯示字符數)
MOVX @DPTR,A
MOV A,#36H ;參數P5=#36H,將晶振頻率轉換成LCD工作率的
時間常數
MOVX @DPTR,A
MOV A,#239 ;參數P6=#239,LCD的點行數(單屏時為一幀的
掃描數,320*240點陣則設為239)
MOVX @DPTR,A
MOV A,#40 ;參數P7=#40,APL
MOVX @DPTR,A
MOV A,#0 ;參數P8=#0,APH,[P8P7]為顯示屏一行所顯示
緩沖區的字節數AP
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#44H ;=================================LCD
SCROLL命令========================
MOVX @DPTR,A
MOV DPTR,#DAT
MOV A,SD1L ;#00H
MOVX @DPTR,A
MOV A,SD1H ;#00H,[SD1HSD1L]第一顯示區的起始顯示緩存
地址
MOVX @DPTR,A
MOV A,#240 ;第一屏總共有240行(點陣行)
MOVX @DPTR,A
MOV A,SD2L ;#80H
MOVX @DPTR,A
MOV A,SD2H ;#25H,[SD2HSD2L]第二顯示區的起始顯示緩存
地址
MOVX @DPTR,A
MOV A,#240 ;第二屏也有240行(點陣行)
MOVX @DPTR,A
MOV A,SD3L ;#00H
MOVX @DPTR,A
MOV A,SD3H ;#4BH,[SD3HSD3L]第三顯示區的起始顯示緩存
地址
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#5AH ;水平方向移動位數命令5AH(設置以點為單位
的顯示畫面水平移動量)
MOVX @DPTR,A
MOV DPTR,#DAT
MOV A,#0 ;水平方向移動位數命令參數,無須移動
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#5BH ;顯示方式命令5BH
MOVX @DPTR,A
MOV A,#1CH ;參數:顯示方式為三屏圖形疊加,邏輯或
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#59H ;打開顯示命令59H,關顯示命令58H
MOVX @DPTR,A
MOV DPTR,#DAT
MOV A,#04H ;參數:各區顯示開或關及光標狀態(只顯示第
一區,關閃爍)
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#4CH ;顯緩操作時,光標地址指針實際也是當前顯
示RAM地址指針移動方向(4CH即自動向右增一)
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#46H ;設定光標位置命令(從00開始)
MOVX @DPTR,A
MOV DPTR,#DAT
MOV A,SD1L
MOVX @DPTR,A
MOV A,SD1H
MOVX @DPTR,A
MOV DPTR,#COM
MOV A,#42H ;允許MPU連續地把顯示數據寫入顯示區內命令
MOVX @DPTR,A
MOV DPTR,#DAT
MOV R7,#80H ;將32K顯緩全部清零,即LCD不顯示任何東西
LOOP: MOV R6,#00H ;上電復位一定要做這一清屏工作
LOOP1: MOV A,#00H
MOVX @DPTR,A
DJNZ R6,LOOP1
DJNZ R7,LOOP
RET
DELAY400MS:
MOV R0,#20
DL4_PA: MOV R1,#100
DL4_PB: MOV R2,#100
DJNZ R2,$
DJNZ R1,DL4_PB
DJNZ R0,DL4_PA
RET
;--------------------------------THE END-----------------------------
END
(文章推薦人:小馬)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -