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电位器进行调光

 

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

posted @ 2018-09-21 14:35  xiaobingzzh  阅读(252)  评论(0)    收藏  举报