| 
 
| 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;
 }
 | 
 |