本帖最后由 konglingfei0615 于 2013-8-22 13:51 编辑
各位大虾帮小弟看看这个程序哪里出了问题,就是点不亮液晶。
#include <msp430x14x.h>
#define CS_H P2OUT |= BIT0
#define CS_L P2OUT &= ~BIT0
#define SCLK_H P2OUT |= BIT1
#define SCLK_L P2OUT &= ~BIT1
#define SID_H P2OUT |= BIT2
#define SID_L P2OUT &= ~BIT2
#define RST_H P2OUT |= BIT3
#define RST_L P2OUT &= ~BIT3
#define PSB_H P2OUT |= BIT4
#define PSB_L P2OUT &= ~BIT4
/*************************************************************************
** 函数名称:SCO_Init
** 函数功能:系统时钟初始化,MCLK=8M Hz
SMCLK=MCLK/8=1M Hz
ACLK=32768 Hz
** 入口参数:无
** 出口参数:无
***************************************************************************/
void SOC_Init(void)
{
uchar n;
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (n = 0xFF; n > 0; n--); // 延时,等待XT2起振
}while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 |= SELM_2 + SELS; //主时钟选择XT2CLK=8MHz,SMCLK时钟选择XT2CLK
BCSCTL2 |= DIVS_3; //SMCLK时钟8分频,得到1MHz时钟
}
/*******************************************
函数名称:Delayus
功 能:实现n个us的精确延时
参 数:n(65536)
返回值 :无
********************************************/
void Delayus(uint n)
{
TACTL |= TASSEL_2;//选择SMCLK
TACTL |= MC_1;//Up mode
CCR0 = n;
while(!(TACTL & BIT0));//TAIFG置1
TACTL &= ~BIT0;//清TAIFG位
TACTL &= ~MC_1;//停止计数
}
/*******************************************
函数名称:Delayms
功 能:实现n个ms的精确延时
参 数:n(65536)
返回值 :无
********************************************/
void Delayms(uint n)
{
uint x,y;
for(x=n;x>0;x--)
for(y=8000;y>0;y--);
}
/*******************************************
函数名称:SendByte
功 能:串口传送1个字节
参 数:date
返回值 :无
********************************************/
void SendByte(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
if(date & 0x80)
{
SID_H;
}
else
{
SID_L;
}
date <<= 1;
SCLK_L;
SCLK_H;
}
}
/*******************************************
函数名称:WriteCom
功 能:串口传送指令
参 数:com
返回值 :无
********************************************/
void WriteCom(uchar com)
{
CS_H;
SendByte(0xf8);
SendByte(com & 0xf0);
SendByte((com << 4) & 0xf0);
Delayus(400);
}
/*******************************************
函数名称:WriteData
功 能:串口传送数据
参 数:com
返回值 :无
********************************************/
void WriteData(uchar date)
{
CS_H;
SendByte(0xfa);
SendByte(date & 0xf0);
SendByte((date << 4) & 0xf0);
Delayus(400);
}
/*******************************************
函数名称:LCD_Init
功 能:12864初始化
参 数:无
返回值 :无
********************************************/
void LCD_Init()
{
// Delayms(50);
// PSB_L;
// Delayus(10);
RST_L;
Delayms(10);
RST_H;
Delayms(2000);
WriteCom(0x30);
Delayms(5);
// WriteCom(0x30);//再次功能设定,大于37us
// Delayus(37);
// WriteCom(0x08);//显示状态设定,大于72us
// Delayus(72);
// WriteCom(0x10);
// Delayus(72);
WriteCom(0x0c);
Delayms(5);
}
/*******************************************
函数名称:DispChar
功 能:显示字符串
参 数:*str
返回值 :无
********************************************/
void DispChar(uchar *str)
{
while(*str > 0)
{
WriteData(*str);
str++;
Delayms(5);
}
}
/*******************************************
函数名称:Display
功 能:显示子函数
参 数:无
返回值 :无
********************************************/
void Display()
{
WriteCom(0x03);
Delayms(5);
WriteCom(0x80);
DispChar(" Welcome to ");
WriteCom(0x90);
DispChar(" MSP430F149 ");
WriteCom(0x88);
DispChar(" The world of ");
WriteCom(0x98);
DispChar(" Thank you! ");
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P2DIR = 0xff;
SOC_Init();
PSB_L;
Delayus(100);
LCD_Init();
Delayms(1);
while(1)
{
Display();
Delayms(500);
}
}
|