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 }
【人生没有白走的路,每一步都算数!】

浙公网安备 33010602011771号