MSP430F5529开发板上的102x64LCD采用的是SPI通信模式,即一种全双工串行通信模式
参考程序:
#include "msp430F5529.h"
void delay(int ms)
{
int i;
while(ms--)
for(i=0;i<999;i++);
}
///////////////////////////////
// 写数据函数 //
///////////////////////////////
void writedata(unsigned char dat)
{
char i,temp;
P5OUT |=BIT7; //结束置位
P5OUT |=BIT6; //数据输入模式
P4OUT &=~BIT3; //sclk=0
P7OUT &=~BIT4; //片选选中
P3OUT |=0x80;
for(i=0;i<8;i++)
{
temp =dat<<i;
if((temp & 0x80)==0x80)
P4OUT |=BIT1;
else
P4OUT &=~BIT1;
__delay_cycles(3);
P4OUT |=BIT3; //sclk=1上升沿
__delay_cycles(3);
P4OUT &=~BIT3; //下降沿
}
P7OUT |=BIT4; //释放片选
}
///////////////////////////////
// 写指令函数 //
///////////////////////////////
void writecomd(unsigned char comd)
{
char i,temp;
P5OUT |=BIT7; //结束置位
P5OUT &=~BIT6; //指令输入模式并置位
P4OUT &=~BIT3;
P7OUT &=~BIT4; //片选选中
P3OUT |=0x80;
for(i=0;i<8;i++)
{
temp =comd<<i;
if((temp & 0x80)==0x80)
P4OUT |=BIT1;
else
P4OUT &=~BIT1;
__delay_cycles(3);
P4OUT |=BIT3;
__delay_cycles(3);
P4OUT &=~BIT3;
}
P7OUT |=BIT4; //释放片选
}
/////////////////////////
// 液晶显示 //
/////////////////////////
void LCD_XYSet(unsigned char x,unsigned char y)
{
LCD_SPISend(0,0xB0|y); //y的值为0~8
LCD_SPISend(0,0x10|(x>>4));
LCD_SPISend(0,0x00|(x&0x0F));
}
//////////////////////////
// 显示 y<8,x<127 //
//////////////////////////
void LCDdisplay(unsigned char x,unsigned char y)
{
writecomd(0xB0|y);
writecomd(0x10|(x>>4));
writecomd(0x0F);
}
/////////////////////////
// LCD初始化 //
/////////////////////////
void LCDinit(void)
{
P7DIR |=BIT4+BIT6; //P7.6为LCD背光灯和LCD_EN使能,1亮 0灭,P7.4为LED_CS片选
P7OUT |=BIT6; //点亮背光
P5DIR |=BIT6+BIT7; //P5.6为SPI之命令数据切换,P5.7为SPI之LCD_RST液晶复位
P4DIR |=BIT1+BIT3; //P4.1为SIMO从设备输入主设备信号端,P4.3为SCK
UCSCTL3 |=SELREF__REFOCLK;
P5OUT &=~(BIT6+BIT7); //LCD reset 指令输入
writecomd(0xAF); //开显示
writecomd(0x8c); //设置扫描方向。
}
///////////////////////
// 主时钟设置 //
///////////////////////
void MCLKtimer(void)
{
__bis_SR_register(SCG0); //disable the FLL control loop
UCSCTL0=0X0000;// //Set lowest possible DCOx,MODxSCG0
UCSCTL1=DCORSEL_7; //Select DCO range 24MHz opreation
//DCORSEL_x,其中x可选3、4、5、6、7
UCSCTL3=FLLD_0+731; //Set DCO Multiplier for 24MHz
//(N+1)*FLLRef=Fdco
//(731+1)*32768=24MHz
//Set FLL DIV =fDCOCLK/2
/*__bis_SR_register(SCG0); //Enable the FLL control loopSCG0
UCSCTL4 |=SELA__DCOCLK+SELS__XT1CLK+SELM__DCOCLK;//MCLK Source select
UCSCTL5 |=DIVPA_2; //ACLK output divide
UCSCTL6 |=XT1DRIVE_3+XCAP_0; //XT1 cap */
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
MCLKtimer();
P1DIR |=BIT3;
P4DIR |=BIT7;
P5OUT &=~BIT7;
LCDinit();
LCDdisplay(3,100);
while(1)
{
writedata(0x2F);
writedata(0x07);
writedata(0x18);
writedata(0x2F);
}
}
|