[求助] MSP430+LCD12864十万火急,跪求帮助,万分感谢!!!

ostrovskymax   2015-4-2 16:10 楼主
快被弄疯了,真心求助,跪求别水贴,有什么不清楚的就问,我在线等,挺急的!谢过!!!
硬件:MSP430G2553+Lcd12864R,单片机由电脑供电,12864外接五负电源。
环境:IAR For MSP430
问题:下载成功无报错,但无显示
具体请款如下:
1、全部代码:
Main:
#include
#include"LCD12864P.h>
void main()
{
        WDTCTL = WDTPW + WDTHOLD;
        Ini_Lcd();
           lcd_pos(1,0);
           Disp_HZ("液晶12864",5);
           lcd_pos(3,4);
           Disp_HZ("欢迎使用",4);
           lcd_pos(2,3);
           Disp_SZ(0);
           Disp_SZ(3);
    while(1);
}
//LCD12864P.h
#include "LCD12864P.c"
#ifndef LCD12864_H_
#define LCD12864_H_
#define uint unsigned int
#define uchar unsigned char
extern uchar LCD_table[];//0123456789
extern void delay_1ms();
extern void delay_nms(uint n);
extern void Ini_Lcd(void);
extern void Send(uchar type,uchar transdata);//0-写控制命令,1-写数据
extern void lcd_pos(uchar x,uchar y);//定位
extern void Disp_HZ(const uchar * pt,uchar num);//显示汉字
extern void Disp_SZ(uchar shuzi);//显示一个数字
#endif /* LCD12864_H_ */
//LCD12864P.c
#include
#define BIT(x)        (1 << (x))
#define uint unsigned int
#define uchar unsigned char
uchar LCD_table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0123456789

void Send(uchar type,uchar transdata);

#define cyCS      0    //P1.0,片选信号
#define cySID     1    //P1.1,串行数据
#define cyCLK     2    //P1.2,同步时钟
#define cyPORT    P1OUT
#define cyDDR     P1DIR

void delay_1ms()
{
        uint i;
        for(i=0;i<1140;i++);
}

void delay_nms(uint n)
{
    uint i = 0;
    for(i = n;i > 0;i--)
        delay_1ms();
}

void Ini_Lcd(void)
{
        cyDDR |= BIT(cyCLK) + BIT(cySID) + BIT(cyCS);   //相应的位端口设置为输出
        delay_nms(600);                 //延时等待液晶完成复位
        Send(0,0x30);  /*功能设置:一次送8位数据,基本指令集*/
        delay_nms(10);
        Send(0,0x02);  /*DDRAM地址归位*/
        delay_nms(5);
        Send(0,0x0c);  /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
        delay_nms(5);
        Send(0,0x01);  /*清屏,将DDRAM的位址计数器调整为“00H”*/
        delay_nms(500);
        Send(0,0x06);  /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
        delay_nms(10);
}

void Send(uchar type,uchar transdata)//0-写控制命令,1-写数据
{
        uchar firstbyte = 0xf8;
        uchar temp;
        uchar i,j = 3;

        if(type) firstbyte |= 0x02;

        cyPORT |= BIT(cyCS);
        cyPORT &= ~BIT(cyCLK);
        while(j > 0)
        {
                if(j == 3) temp = firstbyte;
                else if(j == 2) temp = transdata&0xf0;
                else  temp = (transdata << 4) & 0xf0;

                for(i = 8;i > 0;i--)
                {
                        if(temp & 0x80)        cyPORT |= BIT(cySID);
                        else                        cyPORT &= ~BIT(cySID);
                        cyPORT |= BIT(cyCLK);
                        temp <<= 1;
                        cyPORT &= ~BIT(cyCLK);
                }
                //三个字节之间一定要有足够的延时,否则易出现时序问题
                if(j == 3)        delay_nms(1);
                else               delay_nms(1);

                j--;
        }

        cyPORT &= ~BIT(cySID);
        cyPORT &= ~BIT(cyCS);
}

void lcd_pos(uchar x,uchar y)//定位
{
         uchar pos;
          switch(x)
          {
            case 1:pos=0x80;break;
            case 2:pos=0x90;break;
            case 3:pos=0x88;break;
            case 4:pos=0x98;break;
            default:pos=0x80;
          }
          pos += y;
          Send(0,pos);
}

void Disp_HZ(const uchar * pt,uchar num)//显示汉字
{
    uchar i;
           for(i = 0;i < (num*2);i++)
           Send(1,*(pt++));
}

void Disp_SZ(uchar shuzi)//显示一个数字
{
    Send(1,LCD_table[shuzi]);
}
2、硬件连接:
1:GND
2:VCC5V
3:Vo连接10k滑动变阻器滑动端
4::RS(CS)片选接430P1.0
5:R/W串行数据线SID接430P1.1
6:E时钟SCLK接430P1.2
7-14不接
15:PSB接5V电源GND
16:NC不接
17:RST接5V电源
18:VOUT,5V电源接10k滑动变阻器接此引脚
19:BLA接5V电源
20:BLK接5V电源GND
如下图所示:


我被这个LCD困了一周了,实在找不到办法,网上所有相关的我几乎都看了,真心求助,跪谢各位大神指点,有的文档说大多厂家出厂就将板子的PSB焊成高电位故只能并行了,不知道是不是这个问题,我也无法求证,LCD就一直保持这个样子,我将单片机的三根数据线拔下来也是这样:

回复评论 (15)

IMG_0809.JPG
IMG_0811.JPG

IMG_0812.JPG

点赞  2015-4-2 16:11
你LCD12864硬件上改成串口的啦吗
点赞  2015-4-2 16:12
后面有个电阻要变位置的
点赞  2015-4-2 16:13
这样你不用PSB试一试用过和你一样的LCD,串口成功了的,不过我MCU用的是5529
点赞  2015-4-2 16:15
这是我写的代码.c文件和.hinclude就可以用了,绝对能用
/********************************************************************
串行12864显示
引脚说明:CS P1.2 SID P1.3 SCLK P1.4
***********************************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int

#define LCD_CS_H        P1OUT|=BIT2
#define LCD_CS_L        P1OUT&=~BIT2
#define LCD_SID_H       P1OUT|=BIT3
#define LCD_SID_L       P1OUT&=~BIT3
#define LCD_SCLK_H      P1OUT|=BIT4
#define LCD_SCLK_L      P1OUT&=~BIT4   
/********************************************************************
* 名称: delay_LCD()
* 功能: 延时,延时时间为100us * t。这是通过软件延时,有一定误差。
* 输入: t
* 输出: 无
***********************************************************************/
void delay_LCD(unsigned int t)
{
  unsigned int i,j;
  for(i=0; i   {
    for(j=0; j<10; j++);
  }
}
/********************************************************************
* 名称: sendbyte()
* 功能: 按照液晶的串口通信协议,发送数据
* 输入: zdata
* 输出: 无
***********************************************************************/
void sendbyte(unsigned char zdata)
{
  unsigned int i;
  for(i=0; i<8; i++)
  {
  if((zdata << i) & 0x80)
    {
      LCD_SID_H; //SID = 1;
    }
  else
    {
      LCD_SID_L;//SID = 0;
    }
  LCD_SCLK_L;//SCLK = 0;
  LCD_SCLK_H;//SCLK = 1;
  }
}
/********************************************************************
* 名称: Write_Cmd()
* 功能: 写串口指令
* 输入: cmdcode
* 输出: 无
**********************************************************************/
void Write_Cmd(unsigned char cmdcode)
{
  LCD_CS_H;//CS = 1;
  sendbyte(0xf8); //告诉12864接下来传送指令
  sendbyte(cmdcode & 0xf0);
  sendbyte((cmdcode << 4) & 0xf0);
  delay_LCD(2);
}
/********************************************************************
* 名称: write_data()
* 功能: 写串口指令
* 输入: cmdcode
* 输出: 无
***********************************************************************/
void Write_Data(unsigned char Dispdata)
{
  LCD_CS_H;//CS = 1;
  sendbyte(0xfa); //告诉12864接下来传送数据
  sendbyte(Dispdata & 0xf0);
  sendbyte((Dispdata << 4) & 0xf0);
  delay_LCD(2);
}
/********************************************************************
* 名称: lcdinit()
* 功能: 初始化函数
* 输入: cmdcode
* 输出: 无
***********************************************************************/
void InitLCD(void)
{
  delay_LCD(20000);
  Write_Cmd(0x30); //基本指令操作
  delay_LCD(50);
  Write_Cmd(0x02);   // 地址归位
  delay_LCD(50);
  Write_Cmd(0x0c); //显示开关闭光标
  delay_LCD(50);
  Write_Cmd(0x01);   //清除显示
  delay_LCD(50);
  Write_Cmd(0x06);   //游标右移
  delay_LCD(50);
  Write_Cmd(0x80);   //设定显示的起始地址
}
/***************************************************************************
* 名称:LCD_Clear
* 功能:LCD清屏
****************************************************************************/
void LCD_Clear()
{
  Write_Cmd(0x30); //基本指令操作
  delay_LCD(50);
  Write_Cmd(0x01);   //清除显示
  delay_LCD(50);
}
/*********************************************************/
/*                                                       */
/* 设定显示位置                                          */
/*                                                       */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==0)
     {X=0x80;}
   else if (X==1)
     {X=0x90;}
   else if (X==2)
     {X=0x88;}
   else if (X==3)
     {X=0x98;}
   pos = X+Y ;  
   Write_Cmd(pos);     //显示地址
}
/*******************************************
函数名称:DispString
功    能:让液晶从某个位置起连续显示N个字符
参    数:x--位置的列坐标
          y--位置的行坐标
          n--字符个数
          ptr--指向字符存放位置的指针
返回值  :无
********************************************/
void  DispString(uchar x,uchar y,uchar *ptr)
{
    uchar i = 0;
    lcd_pos( x, y );
    while(ptr[i] != '\0')
     {                         //显示字符
      
       Write_Data(ptr[i]);
       i++;
     }
}
/********************************************************************
* 函数名称 : LCD_12864_num(uchar x,uchar y,uint num)
* 函数功能 : 12864以十进制格式显示一个四位数字
* 函数参数 : 行,列,需要输入需要显示的四位数字
* 函数返回值: 无
**********************************************************************/
void DispNum(uchar x,uchar y,uint num)
{
  uchar num_1, num_2, num_3;
  num_3 = ((num/100)%10) + 0x30;
  num_2 = ((num/10)%10) + 0x30;
  num_1 = (num%10) + 0x30;
  lcd_pos( x, y );  
  Write_Data(num_3);
  Write_Data(num_2);
  Write_Data(num_1);
}

/********************************************************************
* 函数名称 : LCD_12864_num(uchar x,uchar y,uint num)
* 函数功能 : 12864以十进制格式显示一个四位数字
* 函数参数 : 行,列,需要输入需要显示的四位数字
* 函数返回值: 无
**********************************************************************/
void DispNum4(uchar x,uchar y,uint num)
{
  uchar num_1, num_2, num_3,num_4;
  num_4 = ((num/1000)%10) + 0x30;
  num_3 = ((num/100)%10) + 0x30;
  num_2 = ((num/10)%10) + 0x30;
  num_1 = (num%10) + 0x30;
  lcd_pos( x, y );  
  Write_Data(num_4);
  Write_Data(num_3);
  Write_Data(num_2);
  Write_Data(num_1);
}
点赞  2015-4-2 16:17
有个调节对比度的,试试看
点赞  2015-4-2 17:12
调了,没效果的,还是这样
点赞  2015-4-2 22:52
刚回来,明天我试一试回复的代码,如果还不行的话就估计是不是PSb的问题了,我也不知道我这个LCD12864到底需不需要改装,不管怎么,看到这么多帮我的人,还是先说一声十分感谢!
点赞  2015-4-2 22:55
这种显示屏大多都是时序的控制,自己好好琢磨下
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
点赞  2015-4-3 10:51
试过了那位朋友给的代码,还是不行,是不是真是我没改串口的原因啊,我给上LCD背面的图片,麻烦大家帮我看看是否需要该电阻,如果要改的话怎么改呢?
IMG_0814.JPG
点赞  2015-4-3 13:20
引用: elvike 发表于 2015-4-3 10:51
这种显示屏大多都是时序的控制,自己好好琢磨下

我用的全部代码就是如我帖子里的一样了,不知道有没有大神仔细看了的,应该是没错的,朋友给的代码说能用,我自己也是初学这个,搞了蛮久了还没搞定,,,有点着急,再次求求各位帮帮忙,谢谢啦!
点赞  2015-4-3 13:31
找别人换块12864试试
点赞  2015-4-3 21:05
你的板子有没有和12864共地?
点赞  2015-4-3 21:09
检查电路,确认液晶是否是好的。电源正常吗,电路连接是否正确
点赞  2015-4-4 08:56
引用: 吓于侠义 发表于 2015-4-3 21:09
你的板子有没有和12864共地?

好像是这个问题,,,我仔细想想,单片机就只连了三根数据线到lcd上,不共地lcd怎么知道数据是多少呢,包括RST和PSB的高地电平如果LCD和430不共地都是无法识别的吧,我准备把外接电源分压分3.3v出来供给430,他们就能共地了,不过不用usb供电,电源供电应该接到单片机上的哪个引脚呢,程序要不要定义一下呢?
点赞  2015-4-5 14:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复