1. 程式人生 > >LCD1602動態顯示--基於MSP430F149微控制器

LCD1602動態顯示--基於MSP430F149微控制器

main.c

/***************************************************
程式功能:動態顯示文字“welcome!”
----------------------------------------------------
測試說明:觀察液晶顯示
****************************************************/
#include  <msp430.h>
#include  "Cry1602.h"
#define uchar unsigned char
uchar *s1 = "welcome!";

void
main( void ) { uchar i; WDTCTL = WDT_ADLY_250; //間隔定時器,定時16ms LcdReset(); DispStr(4,0,s1); LocateXY(0,9); //確定寫入字元的顯示位置 LcdWriteCommand(0x07, 1); //整體顯示左移 for(i = 12; i > 0; i--) { LcdWriteData(0x20); //延時250ms IFG1 &= ~WDTIFG; while
(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; } while(1) { LcdWriteCommand(0x05, 1); //整體顯示右移 for(i = 24; i > 0; i--) { LcdWriteData(0x20); //延時250ms IFG1 &= ~WDTIFG; while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; } LcdWriteCommand(0x07
, 1); //整體顯示左移 for(i = 24; i > 0; i--) { LcdWriteData(0x20); //延時250ms IFG1 &= ~WDTIFG; while(!(IFG1 & WDTIFG)); IFG1 &= ~WDTIFG; } } }

cry1602.h

void DispStr(unsigned char x,unsigned char y,unsigned char *ptr);
void DispNChar(unsigned char x,unsigned char y, unsigned char n,unsigned char *ptr);
void LocateXY(unsigned char x,unsigned char y);
void Disp1Char(unsigned char x,unsigned char y,unsigned char data);
void LcdReset(void);
void LcdWriteCommand(unsigned char cmd,unsigned char chk);
void LcdWriteData( unsigned char data );
void WaitForEnable(void);
void Delay5ms(void);

cry1602.c

#include <msp430x14x.h>
#include "cry1602.h"
typedef unsigned char uchar;
typedef unsigned int  uint;

/**************巨集定義***************/
#define DataDir     P4DIR
#define DataPort    P4OUT               
#define Busy        0x80
#define CtrlDir     P3DIR
#define CLR_RS P3OUT&=~BIT0;    //RS = P3.0    
#define SET_RS P3OUT|=BIT0; 
#define CLR_RW P3OUT&=~BIT1;   //RW = P3.1
#define SET_RW P3OUT|=BIT1; 
#define CLR_EN P3OUT&=~BIT2;   //EN = P3.2 
#define SET_EN P3OUT|=BIT2; 
/***********************************************
函式名稱:DispStr
功    能:讓液晶從某個位置起連續顯示一個字串
參    數:x--位置的列座標
          y--位置的行座標
          ptr--指向字串存放位置的指標
返回值  :無
***********************************************/
void DispStr(uchar x,uchar y,uchar *ptr) 
{
    uchar *temp;
    uchar i,n = 0;

    temp = ptr;
    while(*ptr++ != '\0')   n++;    //計算字串有效字元的個數

    for (i=0;i<n;i++)
    {
        Disp1Char(x++,y,temp[i]);
        if (x == 0x0f)
        {
           x  = 0; 
           y ^= 1;
        }
    }
}
/*******************************************
函式名稱:DispNchar
功    能:讓液晶從某個位置起連續顯示N個字元
參    數:x--位置的列座標
          y--位置的行座標
          n--字元個數
          ptr--指向字元存放位置的指標
返回值  :無
********************************************/
void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) 
{
    uchar i;

    for (i=0;i<n;i++)
    {
        Disp1Char(x++,y,ptr[i]);
        if (x == 0x0f)
        {
           x = 0; 
        y ^= 1;
        }
    }
}
/*******************************************
函式名稱:LocateXY
功    能:向液晶輸入顯示字元位置的座標資訊
參    數:x--位置的列座標
          y--位置的行座標
返回值  :無
********************************************/
void LocateXY(uchar x,uchar y) 
{
    uchar temp;

    temp = x&0x0f;
    y &= 0x01;
    if(y)   temp |= 0x40;  //如果在第2行
    temp |= 0x80;

    LcdWriteCommand(temp,1);
}
/*******************************************
函式名稱:Disp1Char
功    能:在某個位置顯示一個字元
參    數:x--位置的列座標
          y--位置的行座標
          data--顯示的字元資料
返回值  :無
********************************************/
void Disp1Char(uchar x,uchar y,uchar data) 
{
    LocateXY( x, y );           
    LcdWriteData( data );       
}
/*******************************************
函式名稱:LcdReset
功    能:對1602液晶模組進行復位操作
參    數:無
返回值  :無
********************************************/
void LcdReset(void) 
{
    CtrlDir |= 0x07;                 //控制線埠設為輸出狀態 
    DataDir  = 0xFF;                 //資料埠設為輸出狀態

    LcdWriteCommand(0x38, 0);       //規定的復位操作
    Delay5ms();
    LcdWriteCommand(0x38, 0);       
    Delay5ms();
    LcdWriteCommand(0x38, 0);
    Delay5ms();

    LcdWriteCommand(0x38, 1);       //顯示模式設定
    LcdWriteCommand(0x08, 1);       //顯示關閉
    LcdWriteCommand(0x01, 1);       //顯示清屏
    LcdWriteCommand(0x06, 1);       //寫字元時整體不移動
    LcdWriteCommand(0x0c, 1);       //顯示開,不開遊標,不閃爍
}
/*******************************************
函式名稱:LcdWriteCommand
功    能:向液晶模組寫入命令
參    數:cmd--命令,
          chk--是否判忙的標誌,1:判忙,0:不判
返回值  :無
********************************************/
void LcdWriteCommand(uchar cmd,uchar chk) 
{

    if (chk) WaitForEnable();   // 檢測忙訊號?

    CLR_RS; 
    CLR_RW; 
    _NOP();

    DataPort = cmd;             //將命令字寫入資料埠 
    _NOP();                 

    SET_EN;                     //產生使能脈衝訊號
    _NOP();
    _NOP();
    CLR_EN;         
}

/*******************************************
函式名稱:LcdWriteData
功    能:向液晶顯示的當前地址寫入顯示資料
參    數:data--顯示字元資料
返回值  :無
********************************************/
void LcdWriteData( uchar data ) 
{
    WaitForEnable();        //等待液晶不忙

    SET_RS;
    CLR_RW; 
    _NOP();

    DataPort = data;        //將顯示資料寫入資料埠
    _NOP();

    SET_EN;                 //產生使能脈衝訊號
    _NOP(); 
    _NOP(); 
    CLR_EN;     
}
/*******************************************
函式名稱:WaitForEnable
功    能:等待1602液晶完成內部操作
參    數:無
返回值  :無
********************************************/
void WaitForEnable(void) 
{
    P4DIR &= 0x00;  //將P4口切換為輸入狀態

    CLR_RS;
    SET_RW;
    _NOP();
    SET_EN; 
    _NOP();
    _NOP();

    while((P4IN & Busy)!=0);  //檢測忙標誌

    CLR_EN;

    P4DIR |= 0xFF;  //將P4口切換為輸出狀態
}   

/*******************************************
函式名稱:Delay5ms
功    能:延時約5ms
參    數:無
返回值  :無
********************************************/
void Delay5ms(void)
{ 
    uint i=40000;
    while (i != 0)
    {
        i--;
    }
}