yanhongtao 发表于 2012-5-18 12:45:08

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

#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色,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+上的,怎么就初始化不了,数据端口和命令端口输入输出都正确,有谁能帮我分析一下原因呢?先谢谢

jetli 发表于 2012-5-18 15:31:13

delay 用示波器卡一下,stc各系列速度不同,{:titter:}要重新校准

yanhongtao 发表于 2012-5-20 21:15:48

jetli 发表于 2012-5-18 15:31 static/image/common/back.gif
delay 用示波器卡一下,stc各系列速度不同,要重新校准

嗯,我试了,没有起作用,我给他每一步都延长足够时间了

yanhongtao 发表于 2012-5-21 15:13:58

不能沉了,谁懂的帮我看一下,这两种型号单片机是兼容的,怎么一个上面能运行一个不能运行。

yanhongtao 发表于 2012-5-22 09:13:55

加油,不能沉了,问题还没解决

sync765 发表于 2012-5-22 10:11:36

本帖最后由 sync765 于 2012-5-22 10:12 编辑

看错了,还是查时序吧

yanhongtao 发表于 2012-5-23 13:20:03

sync765 发表于 2012-5-22 10:11 static/image/common/back.gif
看错了,还是查时序吧

这个时序我也看了,为什么两种型号的51核单片机,一个能驱动一个不能驱动

sync765 发表于 2012-5-23 16:02:28

以前我用过RA8806的屏,当时卖家给的是基于89C52的简单的源程序,我拿到STC89C58 上使用也是不行,
后来用mega8,又参考了一些RA8806官方的示例,才正常驱动了
现在还不清楚当时在STC89C58上为何不行。。。
当时没有继续找原因。。。。

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

楼主多找一些示例看看吧

joing2000 发表于 2012-5-23 16:23:59

还用8870?都要停产了,用8875吧

yanhongtao 发表于 2012-5-25 15:42:20

sync765 发表于 2012-5-23 16:02 static/image/common/back.gif
以前我用过RA8806的屏,当时卖家给的是基于89C52的简单的源程序,我拿到STC89C58 上使用也是不行,
后来用m ...

我最终的目的是在STM32上驱动RA8870的5寸屏,我试了一个试例,并没有成功。
卖液晶的给了我一个汇编的例程,我想在STC的基础上把改成C语言的,然后移植到STM32上,可是一直没成功。
你要是有在STM32上驱动RA8870的5寸屏的试例,给我参考一下也好啊

yanhongtao 发表于 2012-5-25 15:44:24

joing2000 发表于 2012-5-23 16:23 static/image/common/back.gif
还用8870?都要停产了,用8875吧

这个我也没办法,公司里指定要用这个了,弄不出来还指定要用这个,我很纠结

joing2000 发表于 2012-5-29 09:25:22

yanhongtao 发表于 2012-5-25 15:44 static/image/common/back.gif
这个我也没办法,公司里指定要用这个了,弄不出来还指定要用这个,我很纠结 ...

你公司也太执着了吧,如果你用8875。我这有初始化程序。
8870好像只有4.3存的。你要不?

农民 发表于 2013-3-12 14:38:21

我这有个AVR驱动8870 的
QQ:873918540

nyszx 发表于 2013-5-7 23:16:25

ra8875能不能驱动at050tn33 5寸的屏啊~
页: [1]
查看完整版本: C51驱动5寸RA8870液晶初始化代码