【TI 技术资料分享】+基于MSP430F149单片机的1602程序代码

2019-07-30 18:44发布

基于MSP430F149单片机的1602程序代码 基于MSP430F149单片机的1602程序代码.zip (30.38 KB, 下载次数: 7) 2015-3-9 21:53 上传 点击文件名下载附件
  1. /*****************MSP130F149与1602LCD模块程序***********************/
  2. /*                                                                  */
  3. /**************************Pins defination***************************/
  4. /* RS  P3.0    寄存器选择信号 H-数据寄存器 L-指令寄存器        */
  5. /*  RW  P3.1    读写信号    H-读     L-写             */
  6. /*  E   P3.2    片选信号    下降沿触发                  */
  7. /*  DB0-DB7  P1.0-P1.7   数据线 数据传输             */
  8. /**************************over*************************************/


  9. #include "msp430x14x.h"
  10. #include "stdio.h"


  11. #define uchar unsigned char                                                
  12. #define uint unsigned int

  13. uchar dis1[]="   Welcome to";
  14. uchar dis2[]="     msp437";


  15. void int_clk()//初始化时钟
  16. {
  17.   uchar i;
  18.   BCSCTL1&=~XT2OFF;         //打开XT2振荡器
  19.   BCSCTL2|=SELM1+SELS;     //MCLK为8MHz,SMCLK为8MHz
  20.   
  21.   /*********************************************
  22.   *
  23.   配置主时钟源的时钟源为XT2;
  24. SELMx Bits
  25. 7-6
  26. Select MCLK. These bits select the MCLK source.
  27. 00 DCOCLK
  28. 01 DCOCLK
  29. 10 XT2CLK when XT2 oscillator present on-chip. LFXT1CLK when XT2
  30. oscillator not present on-chip.
  31. 11 LFXT1CLK
  32.   
  33. 配置子系统时钟的时钟源:
  34. SELS Bit 3 Select SMCLK. This bit selects the SMCLK source.
  35. 0 DCOCLK
  36. 1 XT2CLK when XT2 oscillator present on-chip. LFXT1CLK when XT2
  37. oscillator not present on-chip.
  38.   *
  39.   **********************************************/
  40.   do
  41.   {
  42.      IFG1&=~OFIFG;         //清除振荡错误标志
  43.      for(i=0;i<100;i++)
  44.       _NOP();            //延时等待
  45.    }
  46.    while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
  47.    IFG1&=~OFIFG;
  48. }




  49. void delay(int j)//延时程序函数延时为1ms                                                        
  50. {                                                                          
  51.    int i;                                                                  
  52.    while(j--)                                                            
  53.    {                                                                       
  54.      for(i = 0; i< 2000; i++)                                               
  55.      {                                                                     
  56.       _NOP();                                                            
  57.       _NOP();                                                            
  58.       _NOP();                                                            
  59.       _NOP();                                                            
  60.      }                                                                     
  61.    }                                                                       
  62. }   




  63. /*******************  检查LCD忙状态   *********************/
  64. /*************  lcd_busy为1时,忙,等待   *****************/
  65. /*************  lcd-busy为0时,闲,可写指令与数据  *********/              
  66. int lcd_busy() //检测是否为忙??                                                            
  67. {                                                                          
  68.     int busy;
  69.     P1DIR=0x00;//p5作为输入
  70.     P3OUT &=~ BIT0 ; //  RS = 0
  71.     P3OUT |= BIT1 ;  //  RW = 1
  72.     P3OUT |= BIT2 ;  //  EN = 1                                                           
  73.     _NOP();                                                               
  74.     busy =P1IN&0x80;//p4.7获取其中p4.7输入的值
  75.     _NOP();
  76.     P3OUT &=~ BIT2 ;  //  EN = 0                                                           
  77.     P3OUT &=~ BIT1 ;  //  RW = 0
  78.     P3OUT |= BIT0 ;   //  RS = 1                                                           
  79.     P1DIR=0XFF;
  80.     return busy;  
  81. }


  82. //写指令数据到LCD  RS=L,RW=L,E=高脉冲,D0-D7=指令码。                                    
  83. void lcd_wcmd(uchar cmd)                                                   
  84. {                                                                          
  85.    while(lcd_busy());                                                      
  86.     P3OUT &=~ (BIT0 + BIT1) ;    // RS = 0  RW = 0  写指令                                                     
  87.     P1OUT = cmd;//向P1写入数据                                                              
  88.     _NOP(); //等待                                                         
  89.     P3OUT |= BIT2 ;   // E = 1                                                         
  90.     _NOP();                                                                                                                              
  91.     P3OUT &=~ BIT2 ;//E=0                                                            
  92. }                                                                          
  93.                                                                            
  94. //写显示数据到LCD        RS=H,RW=L,E=高脉冲,D0-D7=数据。                                       
  95. void lcd_wdat(uchar dat)                                                   
  96. {                                                                          
  97.    while(lcd_busy());                                                      
  98.     P3OUT |= BIT0 ;  // RS = 1
  99.     P3OUT &=~ (BIT1 + BIT2) ; // RW = 0   E = 0
  100.     P1OUT = dat;                                                              
  101.     _NOP();
  102.     P3OUT |= BIT2 ;    //  E = 1
  103.     _NOP();                                                              
  104.     P3OUT &=~ BIT2 ;    //  E = 0
  105. }                 




  106. void lcd_pos(uchar pos)//设置显示初始位置                                                   
  107. {                                                                          
  108.    lcd_wcmd(pos|0x80);      //数据指针=80+地址变量                        
  109. }


  110. void lcd_clr()//清除屏幕内容                                                            
  111. {                                                                          
  112.     lcd_wcmd(0x01);          //清除LCD的显示内容                           
  113.     delay(1);                                                              
  114. }


  115.                                                                     
  116. void lcd_init()//初始化程序                                                            
  117. {                                                                          
  118.     delay(10);                     //等待LCD电源稳定                       
  119.     lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据                  
  120.     delay(1);                                                              
  121.     lcd_wcmd(0x38);                                                        
  122.     delay(50);                                                              
  123.     lcd_wcmd(0x38);                                                        
  124.     delay(1);                                                              
  125.                                                                            
  126.     lcd_wcmd(0x0c);          //显示开,关光标,关闭闪烁                              
  127.     delay(1);                                                              
  128.     lcd_wcmd(0x06);          //移动光标 往后移动一位                                   
  129.     delay(1);                                                              
  130.     lcd_wcmd(0x01);          //清除LCD的显示内容                           
  131.     delay(1);                                                              
  132. }                                                                          
  133.       






  134. int main( void )
  135. {
  136.   // Stop watchdog timer to prevent time out reset
  137.   WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  138.   int_clk();//初始化时钟
  139.   P3DIR |= BIT0 + BIT1 + BIT2 ;//将p3.0/1/2作为输出。
  140.   
  141.   while(1)
  142.   { int i;
  143.     lcd_init();
  144.     lcd_pos(0x00);
  145.     for(i=0;i<13;i++)
  146.     {lcd_wdat(dis1[i]);
  147.     delay(100);
  148.     }
  149.     lcd_pos(0x40);
  150.     for(i=0;i<11;i++)
  151.     {lcd_wdat(dis2[i]);
  152.     delay(100);
  153.     }
  154.     delay(1000);
  155.   }
  156.   


  157. }
复制代码

0条回答

一周热门 更多>