[讨论] 求助msp430驱动3.5吋tft液晶。。。

jianping-sun   2014-12-11 15:21 楼主
程序是移植的51上面的,51上面能正常跑,但是移植过来了就不能跑了,我把部分代码贴出来:

/**************控制端定义**************/
/*********选用P4口送DH,P3口送DL********/
/******P9.0控制CS端,P9.1控制RS端******/
/******P9.2控制WR端,P9.3控制RD端******/
/*************P9.4控制RES端************/
#define TFT_CS_1 P9OUT|=BIT0   //片选端
#define TFT_CS_0 P9OUT&=~BIT0
#define TFT_RS_1 P9OUT|=BIT2   //数据命令选择端
#define TFT_RS_0 P9OUT&=~BIT2
#define TFT_WR_1 P9OUT|=BIT1   //写
#define TFT_WR_0 P9OUT&=~BIT1
#define TFT_RD_1 P9OUT|=BIT3   //读
#define TFT_RD_0 P9OUT&=~BIT3
#define TFT_RES_1 P9OUT|=BIT4  //复位
#define TFT_RES_0 P9OUT&=~BIT4
/**************************************/

/*********单片机初始化函数*************/
void init_430()
{
  WDTCTL= WDTPW + WDTHOLD; // 关看门狗
  PMMCTL0_H=0xA5;//开PMM电源管理                             
  SVSMLCTL|=SVSMLRRL_1+SVMLE;//配置SVML电压
  PMMCTL0=PMMPW+PMMCOREV_2;//配置内核电压
  while((PMMIFG&SVSMLDLYIFG )==0);//等待设置完成
  PMMIFG&=~(SVMLVLRIFG + SVMLIFG+SVSMLDLYIFG);
  if((PMMIFG&SVMLIFG)==1)//判断内核电压是否上升到VSVML
  while((PMMIFG&SVMLVLRIFG)==0);//如果没有等待
  SVSMLCTL&=~SVMLE;//关掉SVML模块
  PMMCTL0_H =0X00;//锁存配置
  P5SEL |=0x0C; // Port select XT2
  UCSCTL6&=~XT2OFF; // Enable XT2 even if not used
  UCSCTL3|=SELREF_2; // FLLref = REFO
  UCSCTL4|=SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
  do
  {
    UCSCTL7&=~(XT2OFFG+XT1LFOFFG+DCOFFG);
    SFRIFG1&=~OFIFG;// Clear fault flags
  }while(SFRIFG1&OFIFG);// Test oscillator fault flag
  UCSCTL4|=SELS_5+SELM_5;// SMCLK=MCLK=XT2
  //UCSCTL5|=DIVM_1+DIVS_2;
  P4DIR=0xff;
  P3DIR=0xff;
  P9DIR=0xff;
}
/**************************************/

void LCD_WR_DATA(uint Data)
{
  uchar DH,DL;
  DH=Data>>8;
  DL=Data;
  TFT_CS_0;
  //delayms(1);
  TFT_RS_1;
  //delayms(1);
  P4OUT=DH;
  P3OUT=DL;
  TFT_WR_0;
  //delayms(1);
  TFT_WR_1;
  //delayms(1);
  TFT_CS_1;
  //delayms(1);
}
/***************************************/



/***********LCD写寄存器*****************/
void LCD_WR_REG(uint Index)   
{
  uchar DH,DL;
  DH=Index>>8;
  DL=Index;
  TFT_CS_0;
  //delayms(1);
  TFT_RS_0;
  //delayms(1);
  P4OUT=DH;
  P3OUT=DL;
  TFT_WR_0;
  //delayms(1);
  TFT_WR_1;
  //delayms(1);
  TFT_CS_1;
  //delayms(1);
}
/**************************************/



/********在指定寄存器写数据************/
void LCD_WriteReg(uint Index,uint Data)
{
  LCD_WR_REG(Index);
  LCD_WR_DATA(Data);
}
/**************************************/



/**********初始化驱动芯片**************/
void ILI9481_Initial()
  LCD_WR_REG(0x11);
  delayms(20);
  LCD_WR_REG(0xD0);
  LCD_WR_DATA(0x07);
  LCD_WR_DATA(0x42);
  LCD_WR_DATA(0x18);
  LCD_WR_REG(0xD1);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x07);
  LCD_WR_DATA(0x10);
  LCD_WR_REG(0xD2);
  LCD_WR_DATA(0x01);
  LCD_WR_DATA(0x02);
  LCD_WR_REG(0xC0);
  LCD_WR_DATA(0x10);
  LCD_WR_DATA(0x3B);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x02);
  LCD_WR_DATA(0x11);
  LCD_WR_REG(0xC5);
  LCD_WR_DATA(0x03);
  LCD_WR_REG(0xC8);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x32);
  LCD_WR_DATA(0x36);
  LCD_WR_DATA(0x45);
  LCD_WR_DATA(0x06);
  LCD_WR_DATA(0x16);
  LCD_WR_DATA(0x37);
  LCD_WR_DATA(0x75);
  LCD_WR_DATA(0x77);
  LCD_WR_DATA(0x54);
  LCD_WR_DATA(0x0C);
  LCD_WR_DATA(0x00);
  LCD_WR_REG(0x36);
  LCD_WR_DATA(0x0A);
  LCD_WR_REG(0x3A);
  LCD_WR_DATA(0x55);
  LCD_WR_REG(0x2A);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x01);
  LCD_WR_DATA(0x3F);
  LCD_WR_REG(0x2B);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x00);
  LCD_WR_DATA(0x01);
  LCD_WR_DATA(0xE0);
  delayms(120);
  LCD_WR_REG(0x29);
  LCD_WR_REG(0x2c);
}
/***************************************/


/*************初始化函数****************/
void init_TFT()
{
  TFT_CS_1;
  delayms(50);
  TFT_RES_0;
  delayms(150);
  TFT_RES_1;
  delayms(50);
  ILI9481_Initial();
}
//以上是底层驱动函数
void main()
{
  init_430();
  init_TFT();
  P8DIR=0xff;
  while(1)
  {
    ClearScreen(BLACK);
    P8OUT=0xff;
    delayms(1000);
    P8OUT=0x00;
    delayms(1000);
  }
}
因为P8.1口接了一个led,测试的时候那个led是闪烁的,但是液晶只有背光亮,但是液晶拿到51上面去跑就正常,求大神帮忙看看哪儿错了哦,液晶驱动芯片是ILI9481,CPU是MSP430F5438A....




回复评论 (14)

求帮忙解决啊。。。。。应该是液晶不断清屏啊。。。。怎么老是不走呢??
对了,主函数里面的那个清屏函数在这:
/***********lcd设置光标位置*************/
void LCD_SetCursor(uint x0, uint y0)
{
  LCD_WR_REG(0x2A); 
  LCD_WR_DATA( x0>>8);
  LCD_WR_DATA( x0&0xFF);
  LCD_WR_REG(0x2B); 
  LCD_WR_DATA( y0>>8);
  LCD_WR_DATA( y0&0xFF);
  LCD_WR_REG(0x2C); 
}
/***************************************/



/***********lcd清屏函数*****************/
void ClearScreen(uint bcolor)
{
  uint i,j;
  for (i=0;i<480;i++)
  {
    for (j=0;j<320;j++)
    {
      LCD_SetCursor(j,i);
      LCD_WR_DATA(bcolor);
    }
  }
}
/***************************************/
分辨率是480*320的
点赞  2014-12-11 15:24
过来看看~~~~~~~~~~~~~~~~~~~~~~~~
点赞  2014-12-11 15:34
引用: kemasz 发表于 2014-12-11 15:34
过来看看~~~~~~~~~~~~~~~~~~~~~~~~
求帮忙解决。。弄得我好恼火。。。
点赞  2014-12-11 15:41
不好意思,我也不会
EasyN网络监控器生产商http://www.easyn.cn/
点赞  2014-12-11 15:56
引用: jianping-sun 发表于 2014-12-11 15:24 求帮忙解决啊。。。。。应该是液晶不断清屏啊。。。。怎么老是不走呢??对了,主函数里面的那个清屏函数在这:/***********lcd设置光标位置*************/void LCD_SetCursor(uint x0, uint y0){ LCD_WR_REG(0x2A); LCD_WR_DATA( x0>>8); LCD_WR_DATA( x0&0xFF); LCD_WR_REG(0x2B); LCD_WR_DATA( y0>>8); LCD_WR_DATA( y0&0xFF); LCD_WR_REG(0x2C); }/***************************************//***********lcd清屏函数*****************/void ClearScreen(uint bcolor){ uint i,j; for (i=0;i<480;i++) { for (j=0;j<320;j++) { LCD_SetCursor(j,i); LCD_WR_DATA(bcolor); } }}/***************************************/分辨率是480*320的
把清屏函数里的 uint i,j;改为 unsigned long int i,j; 试试查一下你 uint的定义,确保最少16位长 本帖最后由 shower.xu 于 2014-12-11 16:11 编辑
点赞  2014-12-11 16:09
你确定你的lcd是3.3V供电的么?不要是5V供电哦 本帖最后由 cer1991 于 2014-12-11 17:24 编辑
点赞  2014-12-11 17:22
在用示波器看下GPIO口上的时序。看下430的GPIO口有没有配置错
点赞  2014-12-11 17:24
引用: cer1991 发表于 2014-12-11 17:22
你确定你的lcd是3.3V供电的么?不要是5V供电哦
lcd供电电压是5v但是操作电压是3.3v,我一开始就是用的3.3v的51驱动的
点赞  2014-12-11 18:21
引用: cer1991 发表于 2014-12-11 17:24
在用示波器看下GPIO口上的时序。看下430的GPIO口有没有配置错
身边没有示波器啊。。。
点赞  2014-12-11 18:22
你的LCD现在是什么情况?只有背光亮?其他一点反应都没有么。你把读写数据的函数里面加延迟试试。加到10ms试试
点赞  2014-12-11 18:50
引用: shower.xu 发表于 2014-12-11 16:09
把清屏函数里的  uint i,j;改为 unsigned long int i,j;   试试查一下你 uint的定义,确保最少16位长
这个可以保证是16位的。。。
点赞  2014-12-11 20:41
引用: cer1991 发表于 2014-12-11 18:50
你的LCD现在是什么情况?只有背光亮?其他一点反应都没有么。你把读写数据的函数里面加延迟试试。加到10ms试试
试过还是一样的。。。
点赞  2014-12-11 20:42
引用: easyn888 发表于 2014-12-11 15:56
不好意思,我也不会
额,thans all the same
点赞  2014-12-11 21:06
已经解决啦。。。。其实是430的IO少配置了一个寄存器
点赞  2014-12-19 08:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复