⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display.c

📁 MSP430F133驱动液晶的程序
💻 C
字号:
//
// 
//
// MSP430F133
// ---------------
// /|\| XIN|- 
// | | |
// --|RST XOUT|-
// | |
// | P3.0|-->EN
// | P3.1|-->RW
// | P3.2|-->RS 
// | P3.3|-->BACK 
// | =P4.0-4.7|-->D0-D8 
// | | 
// TANG MING BD4WE 2004.5.1 
//******************************************************************************
#define  Uchar unsigned char
#define Uint unsigned int
#define DataPort P4OUT        // 
#define Busy  0x80

#define BACK_UP_OFF P3OUT&=~BIT3;  
#define BACK_UP_ON P3OUT|=BIT3;
#define CLR_RS P3OUT&=~BIT2;  
#define SET_RS P3OUT|=BIT2;  
#define CLR_RW P3OUT&=~BIT1;  
#define SET_RW P3OUT|=BIT1;  
#define CLR_EN P3OUT&=~BIT0;  
#define SET_EN P3OUT|=BIT0;  

#include <msp430x13x.h>

long int fq=0x00;

void Delay400Ms(void);
void Delay5Ms(void);
void WaitForEnable( void );
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdReset( void );
void Display( Uchar dd );
void DispOneChar(Uchar x,Uchar y,Uchar Wdata);
void ePutstr(Uchar x,Uchar y, Uchar *ptr);

void main(void)
{ 
unsigned int i;

Uchar dis1[]="You're wellcome!This is domo.\n";
Uchar dis2[16]="The freqncy is:\n"; 
Uchar dis3[16]="12.345678MHz \n";

WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 &= ~XT2OFF; // XT2 = HF XTAL

do 
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set? 

BCSCTL2 |= SELM1; // MCLK = XT2 (safe)

P3OUT&=0X00;
P3DIR |= 0x0F; // P3.0-P3.3output
P4DIR |= 0xFF; // P4.0 DATA output



TACTL = TASSEL1 + TACLR; // SMCLK, clear TAR
CCTL1 = CCIE; // CCR1 interrupt enabled
CCR1 = 50000;
P1OUT=0X00;
P1DIR |= BIT7+BIT1; // Set P1.0 to output direction
TACTL |= MC1; // Start Timer_A in continuous mode
_EINT(); // Enable interrupts

BACK_UP_ON;
Delay400Ms();
LcdReset();
ePutstr(0,0,dis1);  

P1OUT |= BIT7; // Toggle P1.0
Delay400Ms();
Delay400Ms();
Delay400Ms();
P1OUT &=~BIT7; // Toggle P1.0
Delay400Ms();
Delay400Ms();
Delay400Ms();


while(1)
{ 
ePutstr(0,0,dis2);     // 
ePutstr(0,1,dis3);
}
}

/*=======================================================
DISPLAY STRING
=======================================================*/
void ePutstr(Uchar x,Uchar y, Uchar *ptr) {
Uchar i,l=0;

  while (ptr[l] >31){l++;};
  for (i=0;i<l;i++)
  {
    DispOneChar(x++,y,ptr[i]);
    if ( x == 0x0f )
    {
     x = 0; y ^= 1;
    }
  }
}

/*=======================================================
Display one line continue string,display string moving 
=======================================================*/
void Display( Uchar dd ) {

Uchar i;
  
  for (i=0;i<16;i++) {
    DispOneChar(i,1,dd++);
    dd &= 0x7f;
    if (dd<32) dd=32;
  }
}

/*=======================================================
display cursor location
=======================================================*/
void LocateXY( char posx,char posy) {

Uchar temp;

  temp = posx & 0xf;
  posy &= 0x1;
  if ( posy )temp |= 0x40;
  temp |= 0x80;
  LcdWriteCommand(temp,1);
}

/*=======================================================
display a char in sigined location
=======================================================*/
void DispOneChar(Uchar x,Uchar y,Uchar Wdata) {

  LocateXY( x, y );        //
  LcdWriteData( Wdata );      //
}

/*=======================================================
LCD reset
=======================================================*/
void LcdReset( void ) {

  LcdWriteCommand( 0x38, 0);      // 
    Delay5Ms();
  LcdWriteCommand( 0x38, 0);      // 
    Delay5Ms();
  LcdWriteCommand( 0x38, 0);
    Delay5Ms();

  LcdWriteCommand( 0x38, 1);      //display mode set
LcdWriteCommand( 0x08, 1);      //display close
  LcdWriteCommand( 0x01, 1);      //clr dis
  LcdWriteCommand( 0x06, 1);      //dis cursor location
  LcdWriteCommand( 0x0f, 1);      //dis enable & cursor set
}

/*=======================================================
write control char sub routin: E=1 CLR_RS CLR_RW
=======================================================*/
void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {

  if (AttribC) WaitForEnable();        // 检测忙信号?
  
  CLR_RS;  
  CLR_RW; 
  _NOP();

  DataPort = CMD; 
  _NOP();          // 送控制字子程序
  
  SET_EN;
  _NOP();
  _NOP();
  CLR_EN;      // 操作允许脉冲信号  
}
  
/*=======================================================
current location write char: E =1 SET_RS CLR_RW
=======================================================*/
void LcdWriteData( char dataW ) {

  WaitForEnable();              // 检测忙信号

  SET_RS;
   CLR_RW; 
  _NOP();

DataPort = dataW; _NOP();

  SET_EN; 
  _NOP(); 
  _NOP(); 
  CLR_EN;    // 操作允许脉冲信号    

}
/*=======================================================
busy bit detect: E =1 SET_RS CLR_RW
=======================================================*/
void WaitForEnable( void ) {

  P4DIR &= 0x00;

  CLR_RS;
  SET_RW;
  _NOP();
  SET_EN; 
  _NOP();
  _NOP();
  
  while((P4IN & Busy)!=0);

  CLR_EN;
  P4DIR |= 0xFF;
}  

/*=======================================================
Delay5Ms
=======================================================*/

void Delay5Ms(void)
{ unsigned int i;
i = 40000; // Delay
do (i--);
while (i != 0);
}

/*=======================================================
Delay400Ms
=======================================================*/

void Delay400Ms(void)
{Uchar i =50;
  Uint j;
  while(i--)
  {
    j=7269;
    while(j--);
  };
}

/*=======================================================
TIMER_A INTRRUPT
=======================================================*/
#pragma vector=TIMERA1_VECTOR // Timer_A3 Interrupt Vector (TAIV) handler
__interrupt void Timer_A (void)
{
switch( TAIV )
{
case 2: // CCR1 
{
fq=fq+1000;
CCR1 += 50000; // Add Offset to CCR1
}
break;
case 4: break; // CCR2 not used 
case 10: break; // overflow not used
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -