×
嵌入式 > 技术百科 > 详情

MSP430F149与1602LCD模块程序

发布时间:2020-06-20 发布时间:
|
/*****************MSP430F149与1602LCD模块程序***********************/
/*                ShangYu                                          */
 
 
/**************************Pins defination***************************/
/* RS  P4.4    寄存器选择信号 H-数据寄存器 L-指令寄存器        */
/*  RW  P4.5    读写信号    H-读     L-写             */
/*  E   P4.6    片选信号    下降沿触发                  */
/*  DB0-DB7  P5.0-P5.7   数据线 数据传输             */
/**************************over*************************************/
 
#include "msp430x14x.h"
#include "stdio.h"
 
#define uchar unsigned char                                                
#define uint unsigned int 
 
 
uchar dis1[]="ShangYu";
uchar dis2[]="       AnNa";
 
void int_clk()
{
  uchar i;
  BCSCTL1&=~XT2OFF;         //打开XT振荡器
  BCSCTL2|=SELM1+SELS;     //MCLK为8MHz,SMCLK为8MHz
  do
  {
     IFG1&=~OFIFG;         //清除振荡错误标志
     for(i=0;i<100;i++)
      _NOP();            //延时等待
   }
   while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
   IFG1&=~OFIFG;
}
 
 
void delay(int j)                                                         
{                                                                          
   int i;                                                                  
   while(j--)                                                             
   {                                                                       
     for(i = 0; i< 2000; i++)                                               
     {                                                                     
      _NOP();                                                             
      _NOP();                                                             
      _NOP();                                                             
      _NOP();                                                             
     }                                                                     
   }                                                                       
}   
 
 
/*******************  检查LCD忙状态   *********************/
/*************  lcd_busy为1时,忙,等待   *****************/
/*************  lcd-busy为0时,闲,可写指令与数据  *********/              
int lcd_busy()                                                             
{                                                                          
    int busy; 
    P5DIR=0x00;
    P4OUT &=~ BIT4 ; //  RS = 0
    P4OUT |= BIT5 ;  //  RW = 1 
    P4OUT |= BIT6 ;  //  EN = 1                                                           
    _NOP();                                                               
    busy =P5IN&0x80;
    _NOP();
    P4OUT &=~ BIT6 ;  //  EN = 0                                                           
    P4OUT &=~ BIT5 ;  //  RW = 0 
    P4OUT |= BIT4 ;   //  RS = 1                                                           
    P5DIR=0XFF;
    return busy;  
 
//写指令数据到LCD  RS=L,RW=L,E=高脉冲,D0-D7=指令码。                                     
void lcd_wcmd(uchar cmd)                                                   
{                                                                          
   while(lcd_busy());                                                      
    P4OUT &=~ (BIT4 + BIT5) ;    // RS = 0  RW = 0                                                       
    P5OUT = cmd;                                                              
    _NOP();                                                           
    P4OUT |= BIT6 ;   // E = 1                                                          
    _NOP();                                                                                                                              
    P4OUT &=~ BIT6 ;                                                            
}                                                                          
                                                                           
//写显示数据到LCD        RS=H,RW=L,E=高脉冲,D0-D7=数据。                                       
void lcd_wdat(uchar dat)                                                   
{                                                                          
   while(lcd_busy());                                                      
    P4OUT |= BIT4 ;  // RS = 1
    P4OUT &=~ (BIT5 + BIT6) ; // RW = 0   E = 0
    P5OUT = dat;                                                              
    _NOP(); 
    P4OUT |= BIT6 ;    //  E = 1
    _NOP();                                                              
    P4OUT &=~ BIT6 ;    //  E = 0
}                 
 
 
void lcd_pos(uchar pos)                                                    
{                                                                          
   lcd_wcmd(pos|0x80);      //数据指针=80+地址变量                         
}
 
void lcd_clr()                                                             
{                                                                          
    lcd_wcmd(0x01);          //清除LCD的显示内容                           
    delay(1);                                                              
}
 
                                                                    
void lcd_init()                                                            
{                                                                          
    delay(10);                     //等待LCD电源稳定                       
    lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据                  
    delay(1);                                                              
    lcd_wcmd(0x38);                                                        
    delay(50);                                                              
    lcd_wcmd(0x38);                                                        
    delay(1);                                                              
                                                                           
    lcd_wcmd(0x0c);          //显示开,关光标                              
    delay(1);                                                              
    lcd_wcmd(0x06);          //移动光标                                    
    delay(1);                                                              
    lcd_wcmd(0x01);          //清除LCD的显示内容                           
    delay(1);                                                              
}                                                                          
      
 
 
 
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  int_clk();
  P4DIR |= BIT4 + BIT5 + BIT6 ;
  
  while(1)
  { int i;
    lcd_init();
    lcd_pos(0x00);
    for(i=0;i<7;i++)
    {lcd_wdat(dis1[i]);
    delay(100);
    }
    lcd_pos(0x40);
    for(i=0;i<11;i++)
    {lcd_wdat(dis2[i]);
    delay(100);
    }
    delay(1000);
  }
  
 
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
SMT 110问