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