快被弄疯了,真心求助,跪求别水贴,有什么不清楚的就问,我在线等,挺急的!谢过!!!
硬件: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就一直保持这个样子,我将单片机的三根数据线拔下来也是这样:
这样你不用PSB试一试用过和你一样的LCD,串口成功了的,不过我MCU用的是5529
这是我写的代码.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);
}
刚回来,明天我试一试回复的代码,如果还不行的话就估计是不是PSb的问题了,我也不知道我这个LCD12864到底需不需要改装,不管怎么,看到这么多帮我的人,还是先说一声十分感谢!
这种显示屏大多都是时序的控制,自己好好琢磨下
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅!
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
试过了那位朋友给的代码,还是不行,是不是真是我没改串口的原因啊,我给上LCD背面的图片,麻烦大家帮我看看是否需要该电阻,如果要改的话怎么改呢?
我用的全部代码就是如我帖子里的一样了,不知道有没有大神仔细看了的,应该是没错的,朋友给的代码说能用,我自己也是初学这个,搞了蛮久了还没搞定,,,有点着急,再次求求各位帮帮忙,谢谢啦!
检查电路,确认液晶是否是好的。电源正常吗,电路连接是否正确
好像是这个问题,,,我仔细想想,单片机就只连了三根数据线到lcd上,不共地lcd怎么知道数据是多少呢,包括RST和PSB的高地电平如果LCD和430不共地都是无法识别的吧,我准备把外接电源分压分3.3v出来供给430,他们就能共地了,不过不用usb供电,电源供电应该接到单片机上的哪个引脚呢,程序要不要定义一下呢?