这个是msp430g2553luanchpad的12864串行显示的程序,我弄出来的结果会乱码,有时还会花屏,搞了两天也不懂是怎么回事,请各位看看帮帮忙,谢谢. 
 
这是12864的驱动程序,其他配置截图了 
#include <msp430g2553.h> 
#include "LCD12864.h" 
#include "config.h" 
 
/********************************************************************  
* 名称 : LCD_sendbyte  
* 功能 : 按照液晶的串口通信协议,发送数据  
* 输入 : zdata  
* 输出 : 无  
***********************************************************************/   
void LCD_SendByte(uchar zdata) 
{ 
  uint i; 
  for(i=0; i<8; i++) 
  { 
    RESET_SCLK; 
    delay_us(100); 
    if((zdata << i) & 0x80)//监测传送位,是否传送完 
    { 
        SET_SID; //SDI为串行数据口;传送完关闭 
        delay_us(10); 
    } 
    else 
    { 
        RESET_SID;//未传送完继续 
        delay_us(10); 
    } 
    //给一个时钟信号 
    SET_SCLK;           //SCLK = 1; 
  } 
}  
/********************************************************************  
* 名称 : LCD_write_com()  
* 功能 : 写串口指令,分三字节写完  
* 输入 : com  
* 输出 : 无  
***********************************************************************/   
void LCD_WriteCom(uchar com)   
{   
      delay_us(100); 
      OPEN_CS;//打开片选,高电平有效   
 
      LCD_SendByte(0xf8); //第一字节1111 1AB0   1111 1000,A--MCU到LCD,B--数据是控制命令, 
      LCD_SendByte(com & 0xf0);     //第二字节DDDD 0000(并行)八位数据的高四位    
      LCD_SendByte((com << 4) & 0xf0);//第三字节0000 DDDD (并行)八位数据的低四位   
      delay_ms(100); 
}    
/********************************************************************  
* 名称 : LCD12864_write_date()  
* 功能 : 写串口指令  
* 输入 : date  
* 输出 : 无  
***********************************************************************/   
void LCD_WriteDate(uchar date)   
{   
    delay_us(100); 
    OPEN_CS;            //打开片选  
 
    LCD_SendByte(0xfa);//第一字节1111 1AB0   1111 1010,A--MCU到LCD,B--数据是显示数据,   
    LCD_SendByte(date & 0xf0);  //第二字节    
    LCD_SendByte((date << 4) & 0xf0);//第三字节    
    delay_ms(100); 
}   
/********************************************************************  
* 名称 : LCD12864_init()  
* 功能 : 12864初始化函数  
* 输入 : com  
* 输出 : 无  
***********************************************************************/   
void LCD_Init()   
{   
    //RESET_RST;    
    // LCD_Delay(100);   
     //SET_RST; 
     //LCD_Delay(100);   
    LCD_WriteCom(0x34);//扩充指令集动作 ,绘图不显示  
    LCD_WriteCom(0x01);//清屏  
    LCD_WriteCom(0x30);//基本指令集动作, 绘图不显示  
    LCD_WriteCom(0x0c);//开显示,不显示游标和游标位置  
    LCD_WriteCom(0x02);//DDRAM地址归位 
    LCD_WriteCom(0x80); //设定DDRAM 7位地址000,0000到 地址计数器AC 
    LCD_WriteCom(0x01);//清屏 
    delay_ms(10); 
}   
/********************************************************************  
* 名称 :LCD_CleanScans()  
* 功能 : 清屏  
* 输入 : 无  
* 输出 : 无  
***********************************************************************/   
void LCD_CleanScans()   
{   
     LCD_WriteCom(0x01);//清屏   0000 0001,清除显示 
     delay_ms(10); 
}   
/********************************************************************  
* 名称 :  LCD12864_pos()  
* 功能 : 设定显示位置  
* 输入 :  x,y  
* 输出 : 无  
***********************************************************************/   
void LCD_SetPos(uchar x,uchar y)   
{   
    uchar addr; 
    switch(x) 
    { 
    case 1: addr=0X7F+y;break;          //第一行 
    case 2: addr=0X8F+y;break;          //第二行 
    case 3: addr=0X87+y;break;          //第三行            
    case 4: addr=0X97+y;break;          //第四行 
    default: break; 
    }   
    LCD_WriteCom(addr);//显示地址           
}   
/********************************************************************  
* 名称 : LCD_DisplayString()  
* 功能 : 显示字符串  
* 输入 : *s  
* 输出 : 无  
***********************************************************************/   
void LCD_DisplayString(int x,int y,char *s)   
{     
    uchar  i = 0; 
    LCD_SetPos(x,y); 
    while(*s > 0) 
    {    
        LCD_WriteDate(s);   
        i++;   
    }    
}  
 
//写整数函数 
uint LCD_DisplayInt(int x,int y,int data) 
{ 
    uint i; 
    uint intLen=3; 
    char cdat[4]={0}; 
    cdat [0] = (char)((data % 1000) /100); 
    cdat [1] = (char)((data % 100) /10); 
    cdat [2] = (char)((data % 10) /1); 
    for (i=0;i<3;i++) 
    { 
        cdat = cdat + 48; 
    } 
         
    if (cdat[0] == '0') 
    { 
        intLen = 3; 
        if (cdat[1] == '0') 
        { 
            intLen = 2; 
            if (cdat[2] == '0') 
                intLen = 1;                         
        } 
    } 
    LCD_DisplayString(x,y,cdat + (3-intLen));                 
    return 0; 
} |   
     
  
 |