jonymayor 发表于 2015-5-4 21:36

DSP驱动LCD12864,LCD没反应,求助!!

LCD的D0-D7接DSP的GPIOA0-GPIOA7;CS(GPIOB0)、SID(GPIOB1)、CLK(GPIOB2)、PSB(GPIOB3)、RST(GPIOB4),程序是看到别人的单片机程序,移植过来的,程序见附件,这里也贴出来,如下:
GPIO配置程序:
#include "DSP28_Device.h"


void InitGpio(void)
{
   EALLOW;

       GpioMuxRegs.GPAMUX.all=0x00;
       GpioMuxRegs.GPBMUX.bit.PWM10_GPIOB3=0;
       GpioMuxRegs.GPBMUX.bit.PWM10_GPIOB3=0;


       GpioMuxRegs.GPADIR.all=0xFF;
       GpioMuxRegs.GPBDIR.bit.GPIOB3=1;
       GpioMuxRegs.GPBDIR.bit.GPIOB3=1;
       
   EDIS;
}       

主程序:

#include "DSP28_Device.h"

#define          RS_CS0    GpioDataRegs.GPBCLEAR.bit.GPIOB0=1 //片选信号RS 模组片选端,高电平有效
#define          RS_CS1    GpioDataRegs.GPBSET.bit.GPIOB0=1
#define          RW_SID0   GpioDataRegs.GPBCLEAR.bit.GPIOB1=1 //串行数据输入端
#define          RW_SID1   GpioDataRegs.GPBSET.bit.GPIOB1=1
#define          EN_CLK0   GpioDataRegs.GPBCLEAR.bit.GPIOB2=1 //串行同步时钟:上升沿时读取SID数据
#define          EN_CLK1   GpioDataRegs.GPBSET.bit.GPIOB2=1
#define          PSB                GpioDataRegs.GPBDAT.bit.GPIOB3 //H:8位或4位并口方式;L:串口方式
#define          RST            GpioDataRegs.GPBDAT.bit.GPIOB4 //复位端,低电平有效

#define          CSOUT           EALLOW;GpioMuxRegs.GPBDIR.bit.GPIOB0= 1;EDIS//片选信号输出
#define          SIDOUT      EALLOW;GpioMuxRegs.GPBDIR.bit.GPIOB1= 1;EDIS//数据信号输出
#define          CLKOUT            EALLOW;GpioMuxRegs.GPBDIR.bit.GPIOB2= 1;EDIS//时钟信号输出
#define          RSTOUT      EALLOW;GpioMuxRegs.GPBDIR.bit.GPIOB4= 1;EDIS//复位信号输出

#define          CSIN              EALLOW;GpioMuxRegs.GPBDIR.bit.GPIOB0= 0;EDIS//片选信号输入
#define          SIDIN         EALLOW;GpioMuxRegs.GPBDIR.bit.GPIOB1= 0;EDIS//数据信号输入
#define          CLKIN           EALLOW;GpioMuxRegs.GPBDIR.bit.GPIOB2= 0;EDIS//时钟信号输入


#define comm0//指令0
#define data   1 //数据1
#define x1    0x80
#define x2    0x88
#define y   0x80

#defineuchar unsigned char         /*宏定义*/
#defineuintunsigned int

void delayns(unsigned int ns);
void delayus(unsigned int us);
void WriteLcd(unsigned char st);
void DataComWrite(uchar data_comm,uchar text);
void ChinDisp(uchar*chin);
void clcscreen();
void InitLcd();
void LatDisp(uchar dat1,uchar dat2);
void ImgDisp(uchar*imge);
void ChkBusy();

/*--调入了一幅图像:宽度x高度=128x32 可以使用点阵图形生成器产生数据--*/
uchar tab1[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFA,0xAB,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFE,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xEF,0xFF,0xBF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xEF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xBF,0xFF,0xFB,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFE,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x06,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xC0,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xF0,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x0F,0xFF,0xFF,0xFF,0xFC,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x1F,0xFF,0xFF,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0xFF,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0xFF,0xFF,0xFF,0xFF,0xF1,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x01,0xFD,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0x7F,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xDF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xF7,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFD,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xBF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xBF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xDF,0xFF,0xFF,0xFF,0xFF,0xEF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xFB,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF,0xFF,0xFE,0xBF,0x80,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x8F,0xFF,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF,0xFF,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x3F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x0F,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xFF,0x60,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0x7F,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xDF,0xFF,0xFD,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xF7,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFD,0xFF,0xF7,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0x7F,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xD5,0x5F,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x07,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xE0,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};



uchar tab2[]={
"尊敬的用户:   "
"们的产品! 希望您"
"    欢迎您使用我"
"使用淇?       "
};


/*----------------- 延时函数---------------------*/
void delayns(unsigned int tns)            
{
while(tns>0) tns--;

}
void delayus(unsigned int tus)
{int i,j;
        for(j=0;j<tus;j++)
           for(i=0;i<100;i++);
}
/*写数据到GPIOA0-GPIOA7*/
void WriteLcd(unsigned char str)
{
        GpioDataRegs.GPADAT.all=str&0xFF;
}
/*----------------LCD数据指令写函数---------------------*/
void DataComWrite(uchar data_comm,uchar content)               
{
        RS_CS0;
        RW_SID0;       
   if(data_comm)
        {
                   RS_CS1;
                RW_SID0;
        }
else
           {
                   RS_CS0;
                RW_SID0;
        }
        delayns(20);
    WriteLcd(content);   //comm
        EN_CLK1;
        delayus(70);
        EN_CLK0;
        delayus(40);
}

/*----------------显示汉字程序-----------------*/
void ChinDisp(uchar*chn)
{
uchar i,j;
DataComWrite(comm,0x30);
delayus(100);
DataComWrite(comm,0x80);
for (j=0;j<4;j++)
{
    for (i=0;i<16;i++)
    {
   DataComWrite(data,chn);
   delayus(10);
    }
}
}

/*----------------LCD清屏函数-----------------*/
void clcscreen()                  
{
delayus(200);
DataComWrite(comm,0x30);
delayus(200);
DataComWrite(comm,0x01);
delayus(200);
}                  

void ChkBusy()
{
DataComWrite(data,0xff);
RS_CS0;
RW_SID1;
EN_CLK1;
while(GpioDataRegs.GPADAT.bit.GPIOA7==1);
EN_CLK0;
}
/*----------------LCD初始化函数-----------------*/
void InitLcd()         
{ CSOUT;
SIDOUT;
CLKOUT;
RSTOUT;
PSB=1;
RST=0;
delayus(1000);
RST=1;
delayus(50000);
DataComWrite(comm,0x30);//30---基本指令动作
delayus(500);
DataComWrite(comm,0x30);
delayus(200);
DataComWrite(comm,0x0c);//开显示,关游标
delayus(500);
DataComWrite(comm,0x01); // 清屏,地址指针指向00H
delayus(20000);
DataComWrite(comm,0x06);//光标的移动方向
delayus(20000);

}


/*----------------LCD显示图像函数-----------------*/
void ImgDisp(uchar*img)
{
int i;
int j;
for(j=0;j<32;j++)
{
    for(i=0;i<8;i++)
    {
      DataComWrite(comm,0x34);
          delayus(200);
      DataComWrite(comm,y+j);
          delayus(200);
      DataComWrite(comm,x1+i);
          delayus(200);
      DataComWrite(comm,0x30);
          delayus(200);
      DataComWrite(data,img);
          delayus(200);
      DataComWrite(data,img);
          delayus(200);
    }
}
for(j=32;j<64;j++)
{
    for(i=0;i<8;i++)
    {
      DataComWrite(comm,0x34);
          delayus(200);
      DataComWrite(comm,y+j-32);
          delayus(200);
      DataComWrite(comm,x2+i);
          delayus(200);
      DataComWrite(comm,0x30);
          delayus(200);
      DataComWrite(data,img);
          delayus(200);
      DataComWrite(data,img);
          delayus(200);
    }
}
DataComWrite(comm,0x36);
}

/*----------------显示点阵-----------------*/
void LatDisp(uchar data1,uchar data2)
{
uchar i,j,k,x;
x=x1;
for(k=0;k<2;k++)
{
    for(j=0;j<16;j++)
    {
      for(i=0;i<8;i++)
      {
      DataComWrite(comm,0x34);
                delayus(200);
      DataComWrite(comm,y+j*2);
                delayus(200);
      DataComWrite(comm,x+i);
                delayus(200);
      DataComWrite(comm,0x30);
                delayus(200);
      DataComWrite(data,data1);
                delayus(200);
      DataComWrite(data,data1);
                delayus(200);
      }
      for(i=0;i<8;i++)
      {
      DataComWrite(comm,0x34);
                delayus(200);
      DataComWrite(comm,y+j*2+1);
                delayus(200);
      DataComWrite(comm,x+i);
                delayus(200);
      DataComWrite(comm,0x30);
                delayus(200);
      DataComWrite(data,data2);
                delayus(200);
      DataComWrite(data,data2);
                delayus(200);
      }
    }
    x=x2;
}
DataComWrite(comm,0x36);
}

/*----------------主函数-----------------*/
void main(void)
{   
    /*初始化系统*/
    InitSysCtrl();
        DINT;
        IER = 0x0000;
        IFR = 0x0000;
        /*初始化PIE*/
        InitPieCtrl();

   /*初始化PIE中断矢量表*/
        InitPieVectTable();       
        InitGpio();

    InitLcd(); //初始化LCD

while(1)
{       
    clcscreen();               //清屏
        delayus(5000);            //延时
        ImgDisp(tab1);         //显示图像1,HELLODSP的**
        delayus(5000);
    LatDisp(0x00,0x00);   //清屏,作用等同于clrram();                               
    ChinDisp(tab2);          //显示汉字"尊敬的用户,感谢您使用我们的产品,希望您使用愉快!"      
        delayus(5000);
}        
}

就这样了,感觉写的这个和人家单片机的程序是一样的了,为什么还是不能显示啊,有说DSP是一个高速器件,LCD是慢显示器件,我加了很多延时,但是还是不行哒,大神们,求助!!!!LCD1206的驱动程序也一样,,弄死不显示,一起放到附件,各位高手,帮忙看看吧,如果好了,可以发送到我的邮jonymayor@163.com

zhangmangui 发表于 2015-5-4 22:20

背光有没有调合适?

zhangmangui 发表于 2015-5-4 22:22

对LCD配置的时序很重要   建议不要通过延时试最好估算一下

zhangmangui 发表于 2015-5-4 22:23

别使用while   一直清屏和显示实时   只显示一次

jonymayor 发表于 2015-5-4 22:43

zhangmangui 发表于 2015-5-4 22:20
背光有没有调合适?

背光调了的,而且数据也是写出来了的,单步调试看了,和设计的一样啊

jonymayor 发表于 2015-5-4 22:46

zhangmangui 发表于 2015-5-4 22:23
别使用while   一直清屏和显示实时   只显示一次

我把清屏屏蔽了做过,但是也没什么反应啊

zhangmangui 发表于 2015-5-5 21:50

你在多试试吧   没条件试

jonymayor 发表于 2015-5-8 20:40

好几天了,没有解决,求2812驱动LCD12864代码,有木有啊

cauhorse 发表于 2015-5-8 22:56

DSP接LCD,电平是不是匹配?驱动能力有没有问题?

jonymayor 发表于 2015-5-9 22:36

cauhorse 发表于 2015-5-8 22:56
DSP接LCD,电平是不是匹配?驱动能力有没有问题?

我确实是直接将GPIO引脚接到LCD,不过我看资料,说3.3V也可以啊。
供电电压是5V,其他接的是GPIO引脚,3.3V电平

cauhorse 发表于 2015-5-9 22:40

jonymayor 发表于 2015-5-9 22:36
我确实是直接将GPIO引脚接到LCD,不过我看资料,说3.3V也可以啊。
供电电压是5V,其他接的是GPIO引脚,3. ...

驱动电流能合乎要求吗?可以拿示波器抓一下波形。
我遇到驱动不了的,最后还是加了缓冲。

jonymayor 发表于 2015-5-9 23:46

cauhorse 发表于 2015-5-9 22:40
驱动电流能合乎要求吗?可以拿示波器抓一下波形。
我遇到驱动不了的,最后还是加了缓冲。 ...

电流没有测,不过单步调试,发送的数据是对的,时序也没有问题,我现在觉得问题要么是没有将数据写入LCD的地址中,要么就是驱动不够,还有一个,也有可能是时序还有我没有注意的地方。

jonymayor 发表于 2015-5-11 20:53

问题已经解决,时序有问题,应该好好看看资料说明啊

zhangmangui 发表于 2015-5-11 22:06

jonymayor 发表于 2015-5-11 20:53
问题已经解决,时序有问题,应该好好看看资料说明啊

时序指的是哪方面啊   
简单分享一下

jonymayor 发表于 2015-5-13 22:16

zhangmangui 发表于 2015-5-11 22:06
时序指的是哪方面啊   
简单分享一下

void DataComWrite(uchar data_comm,uchar content)               
{
        RS_CS0;
        RW_SID1;
        EN_CLK0;       
   if(data_comm)
        {
                   RS_CS1;
                RW_SID0;
        }
else
           {
                   RS_CS0;
                RW_SID0;
        }
        delayns(25);//Typ:TAS=1500ns
        EN_CLK1;
    WriteLcd(content);   //comm
//        EN_CLK1;
        delayns(25);//Typ:TPW=1500ns
        EN_CLK0;
        delayns(200);//Typ:TH=20ns,TC=13000ns
}
就这里,向LCD写入数据总时间有要求,我以前就是延时太长了,这里改了刚好,其他地方都不需要延时。当然,GPIO的配置肯定要正确才行

zhangmangui 发表于 2015-5-13 23:45

jonymayor 发表于 2015-5-13 22:16
void DataComWrite(uchar data_comm,uchar content)               
{
        RS_CS0;


感谢分享

jxz2015 发表于 2015-5-22 16:26

楼主1602的程序好使了吗?

jiangkeqin_sy 发表于 2016-1-4 15:46

程序时对的,要显示时间太长。大约要4分多钟。把写数据程序的延时改小就可以了

landyjzlai 发表于 2016-1-13 09:05

现在都用OLED了,还有这个呀!
页: [1]
查看完整版本: DSP驱动LCD12864,LCD没反应,求助!!