51驱动的12864总是无法正确读数据,总是读出0xff,求指导,调了两天了。

2019-03-24 19:57发布

LCD是st7920带字库的。

我的程序:
读数据:
uchar readdata()
{
        uchar rv=0;
        P0=0xff;
        LCD_RS = 1;
        LCD_RW = 1;
        LCD_E=0;
        delay1(10)  //延时10微秒
        LCD_E=1;
        delay1(100);  //延时100微秒
        rv=P0;
        LCD_E=0;
        rv=Convert(rv);   // P0口是反接的,所以写了个算法把顺序倒过来
        return(rv);         
}

画点的函数:

void drawpoint(uchar x,char y)  //以左边界的中点为原点 y [-32,31] x[0,127]
{
        uchar modx1,modx2;
        uchar wr1=0,wr2=0;
        modx1=x/16;
        modx2=x%16;
        WriteCommandLCD(0x34);
        WriteCommandLCD(0x36);//打开绘图开关
        if(y<0)
                {
                    WriteCommandLCD(0x7f-y); //设置垂直坐标
                        WriteCommandLCD(0x88+modx1); //设置水平坐标
                        readdata();
                        wr1=readdata();
                        wr2=readdata();
                        //delay1(4);
                        WriteCommandLCD(0x7f-y); //设置垂直坐标
                        WriteCommandLCD(0x88+modx1); //设置水平坐标
                        if(modx2>8)
                                {
                                        WriteDataLCD(wr1|0x00);
                                        WriteDataLCD(wr2|(0x01<<(15-modx2)));       
                                }
                        if(modx2<8)
                        {
                                WriteDataLCD(wr1|(0x01<<(7-modx2)));
                                WriteDataLCD(wr2|0x00);
                        }
                }
        if(y>=0)
                {
                         WriteCommandLCD((0x80+31-y)); //设置垂直坐标
                        WriteCommandLCD(0x80+modx1); //设置水平坐标
                        readdata();
                        wr1=readdata();
                        wr2=readdata();
                        //delay1(4);
                        WriteCommandLCD((0x80+31-y)); //设置垂直坐标
                        WriteCommandLCD(0x80+modx1); //设置水平坐标
                        if(modx2>8)
                                {
                                        WriteDataLCD(wr1|0x00);
                                        WriteDataLCD(wr2|(0x01<<(15-modx2)));       
                                }
                        if(modx2<8)
                                {
                                        WriteDataLCD(wr1|(0x01<<(7-modx2)));
                                        WriteDataLCD(wr2|0x00);
                                }

                }       
        WriteCommandLCD(0x30);//返回基本指令集设定状态
}

uchar Convert(uchar In_Date)
{
    uchar i, Out_Date = 0, temp = 0;
    for(i=0; i<8; i++)
    {
        temp = (In_Date >> i) & 0x01;
        Out_Date |= (temp << (7 - i));
    }
    return Out_Date;
}       

下面三个函数应该没什么问题,也贴出来。

写指令:
void WriteCommandLCD(uchar Command)
{
        LCD_E = 0;   
        LCD_RS = 0;
        LCD_RW = 0;
        LCD_Data = Convert(Command);
        LCD_E = 1;
        delay(1);
        LCD_E = 0;
}
写数据:
void WriteDataLCD(uchar Data)
{
        LCD_E = 0;
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_Data = Convert(Data);
        LCD_E = 1;
        delay(1);
        LCD_E = 0;
}

初始化:
void LCDInit(void)
{
        WriteCommandLCD(0x34);
        delay(1);
        WriteCommandLCD(0x30);
        delay(1);
        WriteCommandLCD(0x0c);
        delay(1);
        WriteCommandLCD(0x01);
        delay(1);
}

调试的结果是,如果没有读数据这一步,12864可以正确在相应位置显示一个点,但是因为没有读数据,不能在同一个坐标下面重复画两个点。
如果加了读数据,无法正确显示一个点,而是16个点,即读出来的数据总是0xff。
看了N遍datasheet,改了各种延时,时序也变了好多种,老是出现同样的问题。
我的12864没有问题,而且我换了一个用,结果没变。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
leang521
2019-03-26 08:51
1.7920在设定好要读的地址后,要先空读一次,然后才能依次读出两个字节的数据。

2.7920串行模式的数据传输方向是单向,顾不能串行读取数据

一周热门 更多>