004: MSP430并行方式驱动LM12864液晶显示
1 #include <msp430f169.h> 2 /* 3 * 延时函数 4 */ 5 #define CPU_F ((double)8000000) //外部高频晶振8MHZ 6 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 7 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 8 /* 9 * 自定义数据结构,方便使用 10 */ 11 #define uchar unsigned char 12 #define uint unsigned int 13 #define ulong unsigned long 14 /* 15 * 12864/1602液晶控制管脚 16 */ 17 #define DataPort P4OUT //P4口为数据口 18 #define RS_0 P5OUT &= ~BIT5 //RS置低 19 #define RS_1 P5OUT |= BIT5 //RS置高 20 21 #define RW_0 P5OUT &= ~BIT6 //RW置低 22 #define RW_1 P5OUT |= BIT6 //RW置高 23 24 #define E_0 P5OUT &= ~BIT7 //E置低 25 #define E_1 P5OUT |= BIT7 //E置高 26 27 #define PSB_0 P5OUT &= ~BIT0 //PSB置低,串口方式 28 #define PSB_1 P5OUT |= BIT0 //PSB置高,并口方式 29 30 #define RST_0 P5OUT &= ~BIT1 //RST置低 31 #define RST_1 P5OUT |= BIT1 //RST置高 32 /* 33 * 时钟配置 34 */ 35 void Clock_Init() 36 { 37 uchar i; 38 BCSCTL1&=~XT2OFF; //打开XT2振荡器 39 BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ 40 do{ 41 IFG1&=~OFIFG; //清楚振荡器错误标志 42 for(i=0;i<100;i++) 43 _NOP(); 44 } 45 while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 46 IFG1&=~OFIFG; 47 } 48 /* 49 * 看门狗配置 50 */ 51 void WDT_Init() 52 { 53 WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 54 } 55 56 /* 57 * 端口初始化 58 */ 59 void Port_Init() 60 { 61 P4SEL = 0x00; 62 P4DIR = 0xFF; 63 P5SEL = 0x00; 64 P5DIR|= BIT0 + BIT1 + BIT5 + BIT6 + BIT7; 65 PSB_0; //液晶并口方式 66 67 } 68 69 /* 70 * 对12864写命令 71 */ 72 void write_cmd(uchar cmd){ 73 RS_0; 74 RW_0; 75 E_1; 76 delay_ms(5); 77 DataPort = cmd; 78 delay_ms(5); 79 E_0; 80 } 81 /* 82 * 对12864写数据 83 */ 84 void write_data(uchar data){ 85 RS_1; 86 RW_0; 87 E_1; 88 delay_ms(5); 89 DataPort = data; 90 delay_ms(5); 91 E_0; 92 } 93 /* 94 * 显示屏清空显示 95 */ 96 void LCD_clear(void) 97 { 98 write_cmd(0x01); 99 delay_ms(5); 100 } 101 /* 102 * 显示CGROM里的汉字 103 */ 104 void DisplayCgrom(uchar addr,uchar *hz) 105 { 106 write_cmd(addr); 107 delay_ms(5); 108 while(*hz != '\0') 109 { 110 write_data(*hz); 111 hz++; 112 delay_ms(5); 113 } 114 } 115 /* 116 * 显示测试结果 117 */ 118 void Display(void) 119 { 120 DisplayCgrom(0x80,"江西省九江学院"); 121 DisplayCgrom(0x90,"电子工程学院"); 122 DisplayCgrom(0x88,"通信工程A1612"); 123 DisplayCgrom(0x98,"MSP430单片机"); 124 } 125 126 /* 127 * 12864初始化 128 */ 129 void init_lcd(){ 130 PSB_1; 131 E_0; 132 write_cmd(0x30); 133 delay_ms(5); 134 write_cmd(0x0c); 135 delay_ms(5); 136 write_cmd(0x01); 137 delay_ms(5); 138 // write_cmd(0x02); 139 // delay_ms(5); 140 } 141 /** 142 * 主函数 143 */ 144 void main(void) 145 { 146 WDT_Init(); 147 Clock_Init(); 148 Port_Init(); 149 delay_ms(10); 150 init_lcd(); 151 delay_ms(10); 152 while(1){ 153 Display(); 154 } 155 156 }
#烧录后只发光,没有显示字样的情况,调节R6电位器进行调光
【人生没有白走的路,每一步都算数!】

浙公网安备 33010602011771号