#include "driverlib.h" #include #include #define uchar unsigned char #define uint unsigned int /**************定义接口************************/ #define LCDIO1 P1OUT #define LCDIO2 P2OUT #define LCD1602_RS_1 P3OUT|=BIT7 #define LCD1602_RS_0 P3OUT&=~BIT7 #define LCD1602_RW_1 P4OUT|=BIT0 #define LCD1602_RW_0 P4OUT&=~BIT0 #define LCD1602_EN_1 P4OUT|=BIT3 #define LCD1602_EN_0 P4OUT&=~BIT3 /**************定义函数************************/ void LCD_write_command(unsigned char command);//写入指令函数 void LCD_write_dat( unsigned char dat);//写入数据函数 void LCD_set_xy( unsigned char x, unsigned char y );//设置显示位置函数 void LCD_dsp_char( unsigned char x,unsigned char y, char dat);//显示一个字符函数 void LCD_dsp_string(unsigned char X,unsigned char Y,const char *s);//显示字符串函数 void LCD_init(void);//初始化函数 void delay_nms(unsigned int n);//延时函数 /********************************************/ void delayms(uint t) { uint i; while(t--) for(i=1330;i>0;i--);//进过参数的调整 } /*******检查忙函数*************/ void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以 { //至于不能正常使用LCD。因此我没有再用检查忙函数。而使 P1DIR=0x00; P2DIR=0x00; LCDIO1=LCDIO2=0xff; LCD1602_RS_0; //要用200次循环便能完成。 LCD1602_RW_1; LCD1602_EN_1; while((P1IN&0x80)&(P2IN&0x80)); LCD1602_EN_0; P1OUT=0x00; P1DIR=0xFF; P2OUT=0x00; P2DIR=0xFF; } /******************************/ /**************写指令函数********************************/ void LCD_write_command(unsigned char command) { //LCD_check_busy(); //加上这句仿真无法通过 LCD1602_RS_0; LCDIO1=command; LCDIO2=command-LCDIO1; LCD1602_EN_1; //delayms(1); LCD1602_EN_0; delayms(1); } /***************************************************/ /****************写数据函数************************/ void LCD_write_dat( unsigned char dat) { //LCD_check_busy(); //加上这句仿真无法通过 LCD1602_RS_1; LCDIO1=dat; LCDIO2=dat-LCDIO1; LCD1602_EN_1; //delayms(1); LCD1602_EN_0; delayms(1); LCD1602_RS_0; } /****************************************************/ /***************设置显示位置**************************/ void LCD_set_xy( unsigned char x, unsigned char y ) { unsigned char address; if (y == 1) address = 0x80+x; else if (y == 2) { address=0x80+0x40+x; } LCD_write_command(address); } /***************************************************/ /****************显示一个字符**********************/ void LCD_dsp_char( unsigned char x,unsigned char y, char dat) { LCD_set_xy( x, y ); LCD_write_dat(dat); } /**********************************************/ /***************显示字符串函数***************/ void LCD_dsp_string(unsigned char X,unsigned char Y,const char *s) { uchar len,List; len=strlen(s); LCD_set_xy( X, Y ); for(List=0;List0;i--) for (j=0;j<10;j++); } /**************************************/ /************初始化函数****************/ void LCD_init(void) { LCD1602_RW_0; LCD1602_EN_0; //CLEARSCREEN;//clear screen LCD_write_command(0x38);//set 8 bit data transmission mode delayms(1); LCD_write_command(0x38);//set 8 bit data transmission mode delayms(1); LCD_write_command(0x38);//set 8 bit data transmission mode delayms(1); LCD_write_command(0x06);//open display (enable lcd display) delayms(1); LCD_write_command(0x0C);//set lcd first display address delayms(1); LCD_write_command(0x01);//clear screen delayms(1); //LCD_write_command(0x80);//clear screen //delayms(1); } /****************************************************/ void main(void) { WDTCTL=WDTPW + WDTHOLD; // 关闭看门狗 P1DIR=(BIT2+BIT3+BIT4+BIT5+BIT6); // 设置方向 P1SEL=0; // 设置为普通I/O 口 P2DIR=(BIT0+BIT2+BIT4); // 设置shhuchu方向 P2SEL=0; // 设置为普通I/O 口 P3DIR |=BIT7; P3SEL=0; P4DIR |=(BIT0+BIT3); P4SEL=0; P1OUT=0x00; P2OUT=0x00; delayms(200); LCD_init(); while(1) { LCD_dsp_string(1,1," lcd test ");//在第一行第一列显示"LCD TEST" LCD_dsp_string(1,2," SUCCEED! "); _BIS_SR(LPM0_bits+ GIE);//进入低功耗睡眠模式 } }