003: MSP430_LCD1602液晶显示

  1 #include <msp430f169.h>
  2 //延时函数
  3 #define CPU_F ((double)8000000)   //外部高频晶振8MHZ
  4 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  5 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  6 
  7 //自定义数据结构,方便使用
  8 #define uchar unsigned char
  9 #define uint  unsigned int
 10 #define ulong unsigned long
 11 //LCD1602液晶控制管脚配置
 12 #define DataDIR         P4DIR                     //数据口方向
 13 #define DataPort        P4OUT                     //P4口为数据口
 14 
 15 #define RS_0          P5OUT &= ~BIT5           //RS置低
 16 #define RS_1          P5OUT |=  BIT5           //RS置高
 17 
 18 #define RW_0          P5OUT &= ~BIT6           //RW置低
 19 #define RW_1          P5OUT |=  BIT6           //RW置高
 20 
 21 #define EN_0         P5OUT &= ~BIT7           //E置低
 22 #define EN_1         P5OUT |=  BIT7           //E置高
 23 /**
 24  *  系统时钟初始化,外部8M晶振
 25  */
 26 void Clock_Init()
 27 {
 28   uchar i;
 29   BCSCTL1&=~XT2OFF;                 //打开XT2振荡器
 30   BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ
 31   do{
 32     IFG1&=~OFIFG;                   //清楚振荡器错误标志
 33     for(i=0;i<100;i++)
 34        _NOP();
 35   }
 36   while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待
 37   IFG1&=~OFIFG;
 38 }
 39 /**
 40  *显示屏命令写入函数
 41  */
 42 void LCD_write_com(unsigned char com)
 43 {
 44     RS_0;
 45     RW_0;
 46     EN_1;
 47     DataPort = com;                 //命令写入端口
 48     delay_ms(5);
 49     EN_0;
 50 }
 51 /**
 52  * 显示屏数据写入函数
 53  */
 54 void LCD_write_data(unsigned char data)
 55 {
 56     RS_1;
 57     RW_0;
 58     EN_1;
 59     DataPort = data;                //数据写入端口
 60     delay_ms(5);
 61     EN_0;
 62 }
 63 /**
 64  * 显示屏字符串写入函数
 65  */
 66 void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
 67 {
 68 
 69     if (y == 0)
 70     {
 71         LCD_write_com(0x80 + x);        //第一行显示
 72     }
 73     else
 74     {
 75         LCD_write_com(0xC0 + x);        //第二行显示
 76     }
 77 
 78     while (*s)
 79     {
 80         LCD_write_data( *s);
 81         s ++;
 82     }
 83 }
 84 /**
 85  * 显示屏单字符写入函数
 86  */
 87 void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
 88 {
 89 
 90     if (y == 0)
 91     {
 92         LCD_write_com(0x80 + x);        //第一行显示
 93     }
 94     else
 95     {
 96         LCD_write_com(0xC0 + x);        //第二行显示
 97     }
 98 
 99     LCD_write_data( data);
100 }
101 /**
102  * 显示屏初始化函数
103  */
104 void LCD_init(void)
105 {
EN_0;
106 LCD_write_com(0x38); //显示模式设置 107 delay_ms(5); 108 LCD_write_com(0x08); //显示关闭 109 delay_ms(5); 110 LCD_write_com(0x01); //显示清屏 111 delay_ms(5); 112 LCD_write_com(0x06); //显示光标移动设置 113 delay_ms(5); 114 LCD_write_com(0x0C); //显示开及光标设置 115 delay_ms(5); 116 } 117 /** 118 * 主函数 119 */ 120 int main(void) 121 { 122 WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer 123 P4SEL = 0x00; 124 P4DIR = 0xFF; //数据口输出模式 125 P5SEL = 0x00; 126 P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式 127 uchar i,*p; 128 Clock_Init(); //系统时钟设置 129 delay_ms(100); //延时100ms 130 LCD_init(); //液晶参数初始化设置 131 while (1) 132 { 133 i = 3; 134 p = "1055679204"; //字符串输出显示 135 LCD_write_com(0x01); //显示清屏 136 delay_ms(5); 137 LCD_write_str(0,0,"DZ-A1612-SUN"); 138 delay_ms(5); 139 LCD_write_str(0,1,"QQ:"); 140 delay_ms(100); 141 while (*p) { 142 LCD_write_char(i,1,*p); //单个字符输出显示 143 i ++; 144 p ++; 145 delay_ms(50); //延时250ms 146 } 147 delay_ms(250); 148 } 149 }

  【人生没有白走的路,每一步都算数!】

posted @ 2018-09-19 18:32  xiaobingzzh  阅读(196)  评论(0)    收藏  举报