这个是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;
}
-
配置头文件
-
12864函数头文件
-
主函数
-
-
-
MSP430g255312864.zip
33.13 KB, 下载次数: 19
楼主问题解决了吗,我也这个问题
#include <msp430g2553.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define SID BIT2 //R/W,串行数据口
#define SCLK BIT3 //E,串行同步时钟
#define CS BIT1 //RS,串行片选信号
#define LCDPORT P2OUT
#define SID_1 LCDPORT |= SID
#define SID_0 LCDPORT &= ~SID
#define SCLK_1 LCDPORT |= SCLK
#define SCLK_0 LCDPORT &= ~SCLK
#define CS_1 LCDPORT |= CS
#define CS_0 LCDPORT &= ~CS
void delay(uchar ms)
{
uchar i,j;
for(i=ms;i>0;i--)
for(j=50;j>0;j--);
}
/***********************************************************
*名 称:LCD_Write_cmd()
*功 能:写一个命令到LCD12864
*入口参数:cmd:待写入的命令,无符号字节形式
*出口参数:无
*说 明:写入命令时,RW=0,RS=0 扩展成24位串行发送
*格 式:11111 RW0 RS 0 xxxx0000 xxxx0000
* |最高的字节 |命令的bit7~4|命令的bit3~0|
***********************************************************/
void write_cmd(uchar cmd)
{
uchar i,high4bits,low4bits;
ulong lcdcmd;
high4bits = cmd & 0xf0;
low4bits = cmd & 0x0f;
/***********************************************************
*0xf8为串口控制指令,格式为:11111ABC A:1 数据LCD-->>MCU
0 数据MCU-->>LCD
B: 1 送数据
0 送指令
C:固定为0
***********************************************************/
lcdcmd=((ulong)0xf8<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);
CS_1;
SCLK_0;
for(i=0;i<24;i++)
{
SID_0;
if(lcdcmd & 0x00800000) SID_1;
lcdcmd <<=1;
delay(1);
SCLK_1;
delay(1);
SCLK_0;
}
CS_0;
}
/***********************************************************
*名 称:LCD_Write_Byte()
*功 能:向LCD12864写入一个字节数据
*入口参数:byte:待写入的字符,无符号形式
*出口参数:无
*范 例:LCD_Write_Byte('F') //写入字符'F'
***********************************************************/
void write_dat(uchar dat)
{
uchar i,high4bits,low4bits;
ulong lcddat;
high4bits = dat & 0xf0;
low4bits = dat & 0x0f;
/***********************************************************
*0xfa为串口控制指令,格式为:11111ABC A:1 数据LCD-->>MCU
0 数据MCU-->>LCD
B: 1 送数据
0 送指令
C:固定为0
***********************************************************/
lcddat=((ulong)0xfa<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);
CS_1;
SCLK_0;
for(i=0;i<24;i++)
{
SID_0;
if(lcddat & 0x00800000) SID_1;
lcddat <<=1;
delay(1);
SCLK_1;
delay(1);
SCLK_0;
}
CS_0;
}
/***********************************************************
*名 称:LCD_Write_str()
*功 能:向LCD12864写入一个字符串数据
*入口参数:*str:待写入的字符串,无符号形式
*出口参数:无
*范 例:LCD_Write_str("陕科大") //写入字符"陕科大"
***********************************************************/
void write_str(uchar *str)
{
while(*str != ' ') //字符串不为空,写入字符
{
write_dat(*str); //写当前字符
str++; //字符地址加1
}
}
/***********************************************************
*名 称:LCD_pos()
*功 能:设置液晶的显示位置
*入口参数:x:第几行,1~4对应第1行~第4行
* y:第几列,0~15对应第1列~第16列
*出口参数:无
*范 例:LCD_pos(2,3) //第二行,第四列
***********************************************************/
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;
write_cmd(pos);
}
/****************************************************/
//LCD12864初始化
void LCD_init(void)
{
write_cmd(0x30);
delay(1);
write_cmd(0x0C);
delay(1);
write_cmd(0x01);
delay(1);
write_cmd(0x02);
delay(1);
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P2SEL=0x00;
P2DIR|=BIT1 + BIT2 + BIT3;
LCD_init();
delay(10);
lcd_pos(1,0);
write_str("陕西科技大学");//一行可写8个汉字
lcd_pos(2,0);
write_str("电信学院");
lcd_pos(3,0);
write_str("电子信息工程");
while(1)
{;}
//return 0;
}
一周热门 更多>