求用MSP430F149控制单摆程序?在此先表示感谢!

2019-07-15 16:30发布

求用MSP430F149控程序显示在1602上?在此先,表示感谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
骨灰级发烧友
1楼-- · 2019-07-15 19:41
给你一个参考
/*****************MSP430F149与1602LCD模块程序***********************/

/**************************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);
  }


}

一周热门 更多>