C51驱动5寸RA8870液晶初始化代码

2020-01-30 13:39发布

#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
void Delay100ms(uchar Counter);
void Delay10ms(uchar Counter);
void Delay1ms(uchar Counter);
void Delay100us(uchar Counter);
void Delay2us(uchar Counter);
void Chk_Busy(void);
sbit LCD_RS=P3^0;
sbit LCD_CS=P3^1;
sbit LCD_WR=P3^2;
sbit LCD_RST=P3^3;
sbit LED_EN=P3^6;
sbit LCD_RD=P3^7;
unsigned char DATA_BUS ;

//#define DATA_BUS P1

// ========== MCU Cycle ===========
void LCD_CmdWrite(uchar cmd) // Command Write
{
        LCD_CS = 0;
        LCD_RS = 1;
        Delay10ms(1);
        LCD_WR = 0;
        Delay10ms(1);
        P1= cmd;

        LCD_WR = 0;
        Delay10ms(1);
        LCD_WR = 1;

        Delay10ms(1);
        LCD_CS = 1;


//        P1 = 0xff;       
}
void LCD_DataWrite(uchar Data) // Data Write
{
        LCD_CS = 0;
        LCD_RS = 0;
        Delay10ms(1);

        Delay10ms(1);
        P1= Data;
        LCD_WR = 0;
        Delay10ms(1);
        LCD_WR = 1;


        Delay10ms(1);
        LCD_CS = 1;


//        P1 = 0xff;
}
        uchar LCD_StatusRead(void) // Read Status Register
        { uchar Data;
        LCD_CS = 0;
        LCD_RS = 1;
        LCD_WR = 1;
        LCD_RD = 0;
        Data = DATA_BUS;
        LCD_RD = 1;
        LCD_CS = 1;
        DATA_BUS = 0xff;
        LCD_RS = 0;
        return Data;
}

// ========== RA8870 初始化 ===========


void LCD_Initial(void)
{       
        LCD_CmdWrite(0x01);
        LCD_DataWrite(0x00);  // 关闭显示
//        Delay10ms(1);
        P2=0X7F;
        LCD_CmdWrite(0x88);
        LCD_DataWrite(0x8F);         // SYS_CLK=.......   
//        Delay10ms(1);
        P2=0XFE;
        LCD_CmdWrite(0x89);
        LCD_DataWrite(0x03);
//        Delay10ms(1);
        P2=0XD;      
        LCD_CmdWrite(0x04);
        LCD_DataWrite(0x01);// PCLK频率=SYS_CLK/((2^(0+1))*(2^n))=
//        Delay10ms(1) ;
        P2=0XFB;
        LCD_CmdWrite(0x01);
        LCD_DataWrite(0x01);
//        Delay10ms(1);
        P2=0XF7;         
        LCD_CmdWrite(0x01);
        LCD_DataWrite(0x00);      //进行一次软复位,使频率设置有效。
//        Delay10ms(1);
        P2=0XEF;
        LCD_CmdWrite(0x10);
        LCD_DataWrite(0x3C);       //使用外部RAM,65K {MOD},8位数据口。
//        Delay10ms(1);
        P2=0XDF;
        LCD_CmdWrite(0x11);
        LCD_DataWrite(0x00);         // RGB格式LCD_CmdWrite(0x88);
//        Delay10ms(1);
        P2=0XBF;
        LCD_CmdWrite(0x12);      
        LCD_DataWrite(0x00);  
//        Delay10ms(1);  
        P2=0X7F;   
        LCD_CmdWrite(0x13);         
        LCD_DataWrite(0x00);
//        Delay10ms(1);
        P2=0XFE;       
        //_______水平设置       _____
        LCD_CmdWrite(0x14);      
        LCD_DataWrite(0x3B);        //480列
//        Delay10ms(1);
        P2=0XFD;       
        LCD_CmdWrite(0x15);         
        LCD_DataWrite(0x04);   
//        Delay10ms(1);
        P2=0XFB;   
        LCD_CmdWrite(0x16);         
        LCD_DataWrite(0x05);        //水平非显示区域
        Delay10ms(1);
        P2=0XF7;
        LCD_CmdWrite(0x17);        
        LCD_DataWrite(0x02);        // HSYNC 开始位置
//        Delay10ms(1);
        P2=0XEF;
        LCD_CmdWrite(0x18);         
        LCD_DataWrite(0x01);        //HSYNC 脉宽
//        Delay10ms(1);
        P2=0XDF;               
        //___________ 垂直设置    ______________
        LCD_CmdWrite(0x19);        
        LCD_DataWrite(0x0F);
//        Delay10ms(1);
        P2=0XBF;
        LCD_CmdWrite(0x1A);        
        LCD_DataWrite(0x01);        //272行
//        Delay10ms(1);
        P2=0X7F;
        LCD_CmdWrite(0x1B);        
        LCD_DataWrite(0x09);
//        Delay10ms(1);
        P2=0XFE;
        LCD_CmdWrite(0x1C);        
        LCD_DataWrite(0x00);        //垂直非显示区域
//        Delay10ms(1);
        P2=0XFD;
       
        LCD_CmdWrite(0x1D);        
        LCD_DataWrite(0x05);
//        Delay10ms(1);
        P2=0XFB;
        LCD_CmdWrite(0x1E);         
        LCD_DataWrite(0x00);         //VSYNC 开始位置
//        Delay10ms(1);
        P2=0XF7;
        LCD_CmdWrite(0x1F);        
        LCD_DataWrite(0x02);         //VSYNC 脉宽
//        Delay10ms(1);
        P2=0XEF;
                // ___________  有效工作窗口 ________
        LCD_CmdWrite(0x30);        
        LCD_DataWrite(0x00);
//        Delay10ms(1);
        P2=0XDF;
        LCD_CmdWrite(0x31);         
        LCD_DataWrite(0x00);         //从第一列开始
//        Delay10ms(1);
        P2=0XBF;
        LCD_CmdWrite(0x34);      
        LCD_DataWrite(0xDF);
//        Delay10ms(1);
        P2=0X7F;
        LCD_CmdWrite(0x35);         
        LCD_DataWrite(0x01);         //01DF=480。
//        Delay10ms(1);
        P2=0XFE;
       
        LCD_CmdWrite(0x32);      
        LCD_DataWrite(0x00);
//        Delay10ms(1);
        P2=0XFD;
        LCD_CmdWrite(0x33);        
        LCD_DataWrite(0x00);        //从第一行开始
//        Delay10ms(1);
        P2=0XFB;
        LCD_CmdWrite(0x36);      
        LCD_DataWrite(0x0F);
//        Delay10ms(1);
        P2=0XF7;
        LCD_CmdWrite(0x37);      
        LCD_DataWrite(0x01);       //010F =272行
//        Delay10ms(1);
        P2=0XEF;
        LCD_CmdWrite(0x01);     
        LCD_DataWrite(0x80);       //打开显示        
//        Delay100ms(1)        ;
        P2=0XDF;
        LCD_CmdWrite(0x40);     
        LCD_DataWrite(0x00);
//        Delay100ms(1)        ;
        P2=0XBF;
//        Delay100ms(10)        ;
        P2=0X00;
}  
// ========== 读忙(Check Busy )子程序 ===========
void Chk_Busy(void)
{
//uchar temp;
do
{
//temp=LCD_StatusRead();
//}while((temp&0x80)==0x80);
} while(LCD_StatusRead()&0x80);
}

// ========== 延迟(Delay )子程序 ===========
void Delay2us(uchar Counter)
{ while(--Counter);
}
void Delay100us(uchar Counter)
{ while(Counter--)
{ Delay2us(100); }
}
void Delay1ms(uchar Counter)
{ while(Counter--)
{ Delay100us(11); }
}
void Delay10ms(uchar Counter)
{ while(Counter--)
{ Delay1ms(11); }
}
void Delay100ms(uchar Counter)
{ while(Counter--)
{ Delay1ms(101); }
}
                 //================== main process start ==================//
void main(void)
{
//        LCD_Reset(); // 对RA8870 重致

        LCD_RST = 0;
        Delay100ms(1);
        LCD_RST = 1;
        Delay100ms(1);
        LCD_Initial();
        while(1)
                {        P2=0X0F;
//                        LCD_Initial();

                }

}


人家用汇编在W78E516DDG上写的初始化,我把改成STC90C516RD+上的,怎么就初始化不了,数据端口和命令端口输入输出都正确,有谁能帮我分析一下原因呢?先谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
sync765
2020-01-31 09:53
以前我用过RA8806的屏,当时卖家给的是基于89C52的简单的源程序,我拿到STC89C58 上使用也是不行,
后来用mega8,又参考了一些RA8806官方的示例,才正常驱动了
现在还不清楚当时在STC89C58上为何不行。。。
当时没有继续找原因。。。。

但可以肯定的就是时序很重要

楼主多找一些示例看看吧

一周热门 更多>