专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 硬件开发

MSP430F149驱动1602,不显示啊请大侠们帮忙~该如何解决

发布时间:2010-06-13 21:42:20 文章来源:www.iduyao.cn 采编人员:星星草
MSP430F149驱动1602,不显示啊,请大侠们帮忙~~
C/C++ code


#include<msp430x14x.h>
//#include"lcd1602.h"

typedef unsigned char uchar;
typedef unsigned int uint;

#define RS0 P4OUT&=~BIT0
#define RS1 P4OUT|=BIT0
#define RW0 P3OUT&=~BIT4
#define RW1 P3OUT|=BIT4
#define EN0 P3OUT&=~BIT5
#define EN1 P3OUT|=BIT5
#define DATA P5OUT

unsigned char XPOS,YPOS;

void delay(unsigned int t)
{  unsigned int i,j;
   for(i=0;i<t;i++)
      for(j=0;j<2;j++)
         ;
}

void lcdwaitidle(void)
{  DATA |= 0xff;
   RS0;
   RW1;
   EN1;
   DATA &= 0;
   P5DIR &= 0;
   while((DATA&0x80)==0x80);
   EN0;
   P5DIR |= 0xff;
}

void lcdwcn(unsigned char c)
{  RS0;
   RW0;
   DATA = c;
   EN1;
   delay(1);
   EN0;
}

void lcdwc(unsigned char c)
{  lcdwaitidle();
   lcdwcn(c);
}

void lcdwd(unsigned char d)
{  lcdwaitidle();
   RS1;
   RW0;
   DATA = d;
   EN1;
   delay(1);
   EN0;
}

void lcdpos(void)
{  XPOS &= 0x0f;
   YPOS &= 0x03;
   if(YPOS == 0x00)
      lcdwc(XPOS | 0x80);
   else if(YPOS == 0x01)
      lcdwc((XPOS + 0x40) | 0x80);
}

void lcdreset()
{  delay(15); lcdwcn(0x38);
   delay(5); lcdwcn(0x38);
   delay(5); lcdwcn(0x38);
   lcdwc(0x38);
   lcdwc(0x08);
   lcdwc(0x01);
   lcdwc(0x06);
   lcdwc(0x0c);
}

void lcdfill(unsigned char n)
{
   for(YPOS=0;YPOS<2;YPOS++)
      for(XPOS=0;XPOS<16;XPOS++)
      {  
        lcdpos();
        lcdwd(n);
      }
}

void lcdwda(unsigned char x,unsigned char y,unsigned char *s)
{  YPOS=y;
   for(XPOS=x;XPOS<16;XPOS++)
   {  
     lcdpos();
     lcdwd(*s);
     s++;
     delay(40);
   }
}


void IniTa(void)
{
  //启用定时器A的增计数模式
  TACTL = TASSEL_1 + MC_1 + TACLR;
  CCTL0 = CCIE;
  CCR0 = 32768;
  TACTL |= MC0;
  //_EINT();
}

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P5DIR |= 0xff;
  P4DIR |= 0x01;
  P3DIR |= 0x30;
  P1DIR |= BIT0;
  P1OUT |= BIT0;
  P3OUT &= 0;
  P4OUT &= 0;
  P5OUT &= 0;
  IniTa();
  
  
  _BIS_SR(LPM3_bits + GIE);
}


#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
  unsigned char i;
  P1OUT ^= BIT0;
 
  lcdreset();
  for(i=0x30;i<=0x3a;i++)
  {  
    lcdfill(i);
    delay(350);
  }
  lcdfill(' ');
  delay(200);
  lcdwda(0,0,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  lcdwda(0,1,"ZYXWVUTSRQPONMLKJIHGFEDCBA");
  delay(200);
}


------解决方案--------------------
这句似乎不妥:
while((DATA&0x80)==0x80);
因为
#define DATA P5OUT
改为
#define DATA P5IN

其它时序上就不看了
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: