⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2005825101562.txt

📁 89C52直接控制方式LCD1335
💻 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 + -