打印

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

[复制链接]
898|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
必胜客A|  楼主 | 2015-3-9 21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于MSP430F149单片机的1602程序代码 基于MSP430F149单片机的1602程序代码.zip (30.38 KB)
/*****************MSP130F149与1602LCD模块程序***********************/
/*                                                                  */
/**************************Pins defination***************************/
/* RS  P3.0    寄存器选择信号 H-数据寄存器 L-指令寄存器        */
/*  RW  P3.1    读写信号    H-读     L-写             */
/*  E   P3.2    片选信号    下降沿触发                  */
/*  DB0-DB7  P1.0-P1.7   数据线 数据传输             */
/**************************over*************************************/


#include "msp430x14x.h"
#include "stdio.h"


#define uchar unsigned char                                                
#define uint unsigned int

uchar dis1[]="   Welcome to";
uchar dis2[]="     msp437";


void int_clk()//初始化时钟
{
  uchar i;
  BCSCTL1&=~XT2OFF;         //打开XT2振荡器
  BCSCTL2|=SELM1+SELS;     //MCLK为8MHz,SMCLK为8MHz
  
  /*********************************************
  *
  配置主时钟源的时钟源为XT2;
SELMx Bits
7-6
Select MCLK. These bits select the MCLK source.
00 DCOCLK
01 DCOCLK
10 XT2CLK when XT2 oscillator present on-chip. LFXT1CLK when XT2
oscillator not present on-chip.
11 LFXT1CLK
  
配置子系统时钟的时钟源:
SELS Bit 3 Select SMCLK. This bit selects the SMCLK source.
0 DCOCLK
1 XT2CLK when XT2 oscillator present on-chip. LFXT1CLK when XT2
oscillator not present on-chip.
  *
  **********************************************/
  do
  {
     IFG1&=~OFIFG;         //清除振荡错误标志
     for(i=0;i<100;i++)
      _NOP();            //延时等待
   }
   while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
   IFG1&=~OFIFG;
}




void delay(int j)//延时程序函数延时为1ms                                                        
{                                                                          
   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;
    P1DIR=0x00;//p5作为输入
    P3OUT &=~ BIT0 ; //  RS = 0
    P3OUT |= BIT1 ;  //  RW = 1
    P3OUT |= BIT2 ;  //  EN = 1                                                           
    _NOP();                                                               
    busy =P1IN&0x80;//p4.7获取其中p4.7输入的值
    _NOP();
    P3OUT &=~ BIT2 ;  //  EN = 0                                                           
    P3OUT &=~ BIT1 ;  //  RW = 0
    P3OUT |= BIT0 ;   //  RS = 1                                                           
    P1DIR=0XFF;
    return busy;  
}


//写指令数据到LCD  RS=L,RW=L,E=高脉冲,D0-D7=指令码。                                    
void lcd_wcmd(uchar cmd)                                                   
{                                                                          
   while(lcd_busy());                                                      
    P3OUT &=~ (BIT0 + BIT1) ;    // RS = 0  RW = 0  写指令                                                     
    P1OUT = cmd;//向P1写入数据                                                              
    _NOP(); //等待                                                         
    P3OUT |= BIT2 ;   // E = 1                                                         
    _NOP();                                                                                                                              
    P3OUT &=~ BIT2 ;//E=0                                                            
}                                                                          
                                                                           
//写显示数据到LCD        RS=H,RW=L,E=高脉冲,D0-D7=数据。                                       
void lcd_wdat(uchar dat)                                                   
{                                                                          
   while(lcd_busy());                                                      
    P3OUT |= BIT0 ;  // RS = 1
    P3OUT &=~ (BIT1 + BIT2) ; // RW = 0   E = 0
    P1OUT = dat;                                                              
    _NOP();
    P3OUT |= BIT2 ;    //  E = 1
    _NOP();                                                              
    P3OUT &=~ BIT2 ;    //  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();//初始化时钟
  P3DIR |= BIT0 + BIT1 + BIT2 ;//将p3.0/1/2作为输出。
  
  while(1)
  { int i;
    lcd_init();
    lcd_pos(0x00);
    for(i=0;i<13;i++)
    {lcd_wdat(dis1[i]);
    delay(100);
    }
    lcd_pos(0x40);
    for(i=0;i<11;i++)
    {lcd_wdat(dis2[i]);
    delay(100);
    }
    delay(1000);
  }
  


}


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

176

帖子

2

粉丝