#include "msp430x14x.h" #define uint unsigned int #define uchar unsigned char #define DELAY _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP(); #define DI_HIGH P4OUT|=BIT0;DELAY;//p4.0输出1;D/I 1 为数据操作 #define DI_LOW P4OUT&=~BIT0;DELAY;//p4.0输出0;D/I 0 为写指令或读状态 #define RW_HIGH P4OUT|=BIT1;DELAY;//p4.1输出1;R/W 0 为读选通 #define RW_LOW P4OUT&=~BIT1;DELAY;//p4.1输出0;R/W 0 为写选通 #define E_HIGH P4OUT|=BIT2;DELAY;//P4.2,在E 下降沿数据被锁存(写)入HD61202 及其兼 //容控制驱动器在E 高电平期间数据被读出 #define E_LOW P4OUT&=~BIT2;DELAY; #define CSL_HIGH P4OUT|=BIT3;DELAY;//P4.3, #define CSL_LOW P4OUT&=~BIT3;DELAY; #define CSR_HIGH P4OUT|=BIT4;DELAY; #define CSR_LOW P4OUT&=~BIT4;DELAY; #define RST_HIGH P4OUT|=BIT5;DELAY;//4.5,复位信号有效时关闭液晶显示使显示起始行 //为0 #define RST_LOW P4OUT&=~BIT5;DELAY; #define BUSY_OUT P2DIR|=BIT7//P2.7作为输出; #define BUSY_IN P2DIR&=~BIT7 #define BUSY_DATA P2IN&BIT7 //时钟初始化函数 void InitClock(void){ BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2(8M)开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率 DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率 do{ IFG1&=~OFIFG;//清除振荡器失效标志 for(uint i=255;i>0;i--); }while(IFG1&OFIFG);//判断XT2是否起振 BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频 } //端口初始化函数 void InitPort(void){ P1SEL=0x00;//P1口所有引脚设置为一般的IO口 P1DIR=0x0F;//P1.0 P1.1 P1.2 P1.3设置为输出方向 P1OUT=0x00;//P1口先输出低电平 P1IE=0xF0;//P1.4 P1.5 P1.6 P1.7中断允许 P1IES=0xF0;//P1.4 P1.5 P1.6 P1.7下降沿触发中断 P2SEL=0x00;//P2口所有引脚设置为一般的IO口 P4SEL=0x00;//P4口所有引脚设置为一般的IO口 P2DIR=0xFF;//P2口所有引脚设置为输出方向 P4DIR=0xFF;//P4口所有引脚设置为输出方向 P2OUT=0x00;//P2口先输出低电平 P4OUT=0xFF;//P4口先输出低电平 } //检查LCD忙状态 void LcdBusy(){ DI_LOW; RW_HIGH; E_HIGH; BUSY_IN; while(BUSY_DATA); BUSY_OUT; _NOP();_NOP();_NOP();_NOP();_NOP(); E_LOW; } //给LCD写命令 void send_com(uchar Command){ LcdBusy(); DI_LOW; RW_LOW; P2OUT=Command; DELAY; E_HIGH; E_LOW; } //给LCD写数据 void send_data(uchar Data){ LcdBusy(); DI_HIGH; RW_LOW; P2OUT=Data; DELAY; E_HIGH; E_LOW; } /********************清屏************************/ //清屏 /************************************************/ void clr_lcd(void) { send_com(0x01); //send_com(0x34); //send_com(0x30); }
//LCD初始化 void LcdInit(){ RST_LOW; DELAY; RST_HIGH; //RST低电平复位 clr_lcd(); //清屏 } /*******************************************************************/ // 设置显示位置 xpos(1~16),tpos(1~4) /*******************************************************************/ void set_xy(unsigned char xpos,unsigned char ypos) { switch(ypos) { case 1: send_com(0X80|xpos);break; case 2: send_com(0X90|xpos);break; case 3: send_com(0X88|xpos);break; case 4: send_com(0X98|xpos);break; default:break; } } /*******************************************************************/ // 在指定位置显示字符串 /*******************************************************************/ void print(unsigned char x,unsigned char y,char* str) { unsigned char lcd_temp; set_xy(x,y); lcd_temp=*str; while(lcd_temp != 0x00) { send_data(lcd_temp); lcd_temp=*(++str); } } //延时子函数 void Delay(void){ for(uchar i=255;i>0;i--); } //延时子程序 void DelayMs(uint ms){ while(ms--){ for(uint i=0;i<800;i++); } } } void main(){ WDTCTL=WDTPW+WDTHOLD;//关闭看门狗 InitClock(); InitPort(); _EINT();//打开中断 LcdInit();//Lcd初始化 while(1){ print(5,1,"欢迎光临"); DelayMs(5000); clr_lcd();//滚屏显示 print(0,3," SEEGU百度空间"); DelayMs(5000); clr_lcd(); } }
|