打印

关于LCD的读写时序有点疑问请教,

[复制链接]
3093|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tdhlq|  楼主 | 2007-5-22 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tdhlq|  楼主 | 2007-5-22 10:38 | 只看该作者

读操作时序为;

看了很长一段时间也没看明白,请老师指点。

使用特权

评论回复
板凳
tdhlq|  楼主 | 2007-5-22 16:22 | 只看该作者

这个问题我已经思考了很久了,希望能给予指点。

使用特权

评论回复
地板
zssmcu| | 2007-5-22 16:34 | 只看该作者

时序关系不是很明显了么?

这个图的信号都是相对同一个时间基础的,随便画一条垂直的竖线,这个时间就是各个信号的状态,比如第一个写时序的图,在E的第二个下降沿,R/W的下降沿在它后面,说明在E之后呗,CS1CS2RS,说明在R/W跳变同时到达,也在E下降沿之后,一次类推啊!!

使用特权

评论回复
5
hqgboy| | 2007-5-22 16:42 | 只看该作者

驱动芯片是哪个?

//****************************************************************************************
//*以下是OLED屏测试函数*
//****************************************************************************************
//****************************************************************************************
void ExBusInit(void)    //初始化P09702OLED显示屏总线
{   
     uint32 temp;
    uint32 i;

    PINSEL1 &= ~(3<<(2 * (DC_PIN_NUM-16)));  
    PINSEL1 &= ~(3<<(2 * (WR_PIN_NUM-16)));
    PINSEL1 &= ~(3<<(2 * (RD_PIN_NUM-16)));
    PINSEL1 &= ~(3<<(2 * (CS_PIN_NUM-16)));//
    PINSEL1 &= ~(3<<(2 * (RES_PIN_NUM-16)));//
    
// 设置引脚方向,所有相关引脚为输出
    temp = 0xff<<AD0_PIN_NUM;
    IO1DIR|=LEDS8;
    IODIR=IODIR|(1<<WR_PIN_NUM)|(1 <<RD_PIN_NUM)|(1<<DC_PIN_NUM)|(1<<CS_PIN_NUM)|(1<<RES_PIN_NUM);
// 设置引脚输出值,除CS_PIN_NUM输出为低电平外,其余均为高电平
    IO0CLR = (1<<CS_PIN_NUM);
    IO0SET = (1<<DC_PIN_NUM)|(1<<WR_PIN_NUM)|(1<<RD_PIN_NUM);
    temp = 0xff<<AD0_PIN_NUM;
    IO1SET=IO1SET|temp; 
    
   //复位
  IO0CLR = (1<<RES_PIN_NUM);            
  for(i=0; i<5000; i++);
  IO0SET = (1<<RES_PIN_NUM);   
  for(i=0; i<5000; i++); 
}


/************************************************************************************/
//
/************************************************************************************/ 
uint8 ReadData(void)     //从P09702OLED显示屏读取数据
{   uint32 temp,temp1;
    IRQDisable();
    temp1 = IO1DIR;
    IO1DIR = temp1 & (~(0xff << AD0_PIN_NUM));  // 设置AD0_PIN_NUM为输入
    IOCLR = 1 << RD_PIN_NUM;
    temp = IO1PIN;
    IOSET = 1 << RD_PIN_NUM;
    IO1DIR = temp1 | (0xff << AD0_PIN_NUM);
    temp = temp >> AD0_PIN_NUM;
    return (uint8) temp;
    IRQEnable();

/************************************************************************************/
//
/************************************************************************************/
void WriteCommand(uint8 Data)   //写指令代码到P09702OLED显示屏
{   
    IRQDisable();
    IOCLR = 1 << DC_PIN_NUM;
    IO1SET = Data << AD0_PIN_NUM;
    Data = ~Data;
    IO1CLR = Data << AD0_PIN_NUM;
    IOCLR = 1 << WR_PIN_NUM;
    IOSET = 1 << WR_PIN_NUM;
    IOSET = 1 << DC_PIN_NUM;
    IRQEnable();

/*************************************************************************************/
//
/*************************************************************************************/
void WriteData(uint8 Data)   //写参数及数据到P09702OLED显示屏
{     
    IO1SET = Data << AD0_PIN_NUM;
    Data = ~Data;
    IO1CLR = Data << AD0_PIN_NUM;
    IOCLR = 1 << WR_PIN_NUM;
    IOSET = 1 << WR_PIN_NUM;
    
}
/*************************************************************************************/
//
/*************************************************************************************/
void clr_oled(void)
{
    int i,j;
    for(i=0;i<8;i++)
    {
        WriteCommand (0xB0+i);    //设置显示位置—行
        WriteCommand (0x02);      //设置显示位置—列低地址
        WriteCommand (0x10);      //设置显示位置—列高地址
        for(j=0;j<128;j++)     
            WriteData(0x00);        //屏幕显示,全亮
    }
}
/*************************************************************************************/
//
/*************************************************************************************/
void init_oled(void)
{
    WriteCommand(0xAE); //Display off
    WriteCommand(0xAD); //Internal DC-DC off
    WriteCommand(0x8A); // Second byte
    WriteCommand(0xA8); //MUX Ratio
    WriteCommand(0x3F); //64 duty
    WriteCommand(0xD3); //Display offset
    WriteCommand(0x00); //Second byte
    WriteCommand(0x40); //Start line
    WriteCommand(0xA0); //Segment remap        //a0
    WriteCommand(0xC8); //COM remap
    WriteCommand(0xA6); //Set normal/inverse display (0xA6:Normal display)
    WriteCommand(0xA4); //Set entire display on/off (0xA4:Normal display)
    WriteCommand(0x81); //Contrast setting
    WriteCommand(0x5C); //Second byte
    WriteCommand(0xD5); //Frame rate
    WriteCommand(0x60); // 85 Hz
    WriteCommand(0xD8); //Mode setting
    WriteCommand(0x00); //Mono mode
    WriteCommand(0xD9); //Set Pre-charge period
    WriteCommand(0x84); // Second byte
    WriteCommand(0xAF); //Display on
}

使用特权

评论回复
6
hqgboy| | 2007-5-22 16:43 | 只看该作者

2

/******************************************************************************************/
//
/******************************************************************************************/
void wr_command(unsigned char data com) //写命令(0-128 行)子程序
{
    EA = 0;
    D_C = 0;              // D_C=0,数据送至指令寄存器
      CS1_LOW;       //Chip select
    _nop_();                
    _nop_();  
    P0 = com;
    _nop_();                                                                 //用此NOP代替读状态
    _nop_();                                                                 //用此NOP代替读状态
              
    r_w = 0;
    _nop_();
    _nop_();
    r_w = 1;
    _nop_();
    _nop_();
    CS1_HIGH;       //Chip select
    _nop_();
    _nop_();
    EA=1;
}
/******************************************************************************************/
//
/******************************************************************************************/
void wr_data(unsigned char data dat) //写数据(65-128 行)子程序
{
    EA=0;
    D_C = 1;       //D_C=1,数据送至RAM
    CS1_LOW;       //Chip select
    _nop_();
    _nop_();
    P0 = dat;
    _nop_();                                                               //用此NOP代替读状态
    _nop_();                                                               //用此NOP代替读状态

    r_w = 0;
    _nop_();
    _nop_();
    r_w = 1;
    _nop_();
    _nop_();
    CS1_HIGH;       //Chip select
    _nop_();
    _nop_();
    EA=1;
}

使用特权

评论回复
7
hqgboy| | 2007-5-22 16:44 | 只看该作者

3

/******************************************************************************************/
//
/******************************************************************************************/
void read_status() 
{
    uchar busy;
    uchar temp;
    d_i=0;
    r_w=1;
    do
    { 
        P0 =0xff;
        e =1;
        busy=P0;
        e=0;
        temp=busy & 0x80;
    }while (temp !=0);
}
/******************************************************************************************/
//
/******************************************************************************************/
void wr_command2() 
{
    EA=0;
    CS1_LOW;
     CS2_HIGH;
    read_status();
    r_w=0;
    P0=com;
    e=1;
    e=0;
    EA=1;
}
/******************************************************************************************/
//
/******************************************************************************************/
void wr_data2() 
{
    EA=0;
    CS1_LOW;
    CS2_HIGH;
    read_status();
    d_i=1;
    r_w=0;
    P0=dat;

    e=1;
    e=0;
    EA=1;
}
/******************************************************************************************/
//
/******************************************************************************************/
void wr_command1() 
{
    EA=0;
    CS1_HIGH;
    CS2_LOW;
    read_status();
    r_w=0;
    P0=com;

    e=1;
    e=0;
    EA=1;
}
/******************************************************************************************/
//
/******************************************************************************************/
void wr_data1() 
{
    EA=0;
    CS1_HIGH;
    CS2_LOW;
    read_status();
    d_i=1;
    r_w=0;
    P0=dat;

    e=1;
    e=0;
    EA=1;
}

使用特权

评论回复
8
hqgboy| | 2007-5-22 16:46 | 只看该作者

4

/************************************************************************************/
//
/************************************************************************************/

void ExBusInit(void)    //
{   
   unsigned char i;

    
// 设置引脚输出值,除CS_PIN_NUM输出为低电平外,其余均为高电平
    
    //OLED_RD=0X01;
    //OLED_WR=0X01;
    //OLED_A0=0X01;
    
    OLED_RD=0X00;
    OLED_WR=0X00;
    OLED_A0=0X00;
    OLED_CS1=0X00;

    OLED_PORT=0XFF; 
    
   //复位
    OLED_RES=0X00;            
    for(i=0; i<200; i++);
    OLED_RES=0X01;   
    for(i=0; i<200; i++); 
}

/************************************************************************************/
//
/************************************************************************************/
void WriteCommand(uint8 Data)   //
{    
  OLED_A0=0;
  //OLED_CS1=0;    //truly
  OLED_RD=1;   
  OLED_WR=0;
  OLED_PORT=Data;
  OLED_WR=1;

/*************************************************************************************/
//
/*************************************************************************************/
void WriteData(uint8 Data)   //写参数及数据到显示屏
{     
  OLED_A0=1;
  //OLED_CS1=0;
  OLED_RD=1;     
  OLED_WR=0;
  OLED_PORT=Data;
  OLED_WR=1;

}
/*************************************************************************************/
//
/*************************************************************************************/
void clr_oled(void)
{
    int i,j;
    for(i=0;i<8;i++)
    {
        WriteCommand (0xB0+i);    //设置显示位置—行
        WriteCommand (0x10);      //设置显示位置—列高地址
        WriteCommand (0x00);      //设置显示位置—列低地址
        for(j=0;j<128;j++)    
            WriteData(0x00);        //屏幕显示,全亮
    }
}
/*************************************************************************************/
//
/*************************************************************************************/
void init_oled(void)
{
  unsigned char i;
  
  OLED_CS1=0X00;
    
   //复位
  OLED_RES=0X00;            
  for(i=0; i<200; i++);
  OLED_RES=0X01;   
  for(i=0; i<200; i++); 

    WriteCommand(0xE2); //Display off
    WriteCommand(0x2F); //Internal DC-DC off
    WriteCommand(0x23); // Second byte
    WriteCommand(0xA2); //MUX Ratio
    WriteCommand(0x81); //64 duty
    WriteCommand(0x3f); //Display offset
    WriteCommand(0x40); //Start line
    WriteCommand(0xA1); //Segment remap        //a0
    WriteCommand(0xC0); //COM remap
    WriteCommand(0xA6); //Set normal/inverse display (0xA6:Normal display)
    WriteCommand(0xA9); //Set entire display on/off (0xA4:Normal display)
    WriteCommand(0x72);
    WriteCommand(0xAF); //Display on

}

使用特权

评论回复
9
tdhlq|  楼主 | 2007-5-22 17:18 | 只看该作者

谢谢楼上这位热心人,我现在已经把LCD屏点亮了,

对于CS1CS2RSR/W的时序我也能理解,我现在就是不明白既然读写操作时序的E与DB7~DB0的基本上没有区别,为什么是当E=H到L时,可将数据写入模块,当E=H时,可将DDRAM数据读到模块DB7~DB0;

使用特权

评论回复
10
skey79| | 2007-5-22 20:03 | 只看该作者

建议LZ多看一下8080和6800的区别

LZ的这个时序图是6800的,E是使能信号。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

47

帖子

0

粉丝