📄 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 + -