MSP430與DS1302之1602顯示
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;
/**************宏定義***************/
#define DS_RST BIT7 //DS_RST = P2.7
#define DS_SCL BIT5 //DS_SCL = P2.5
#define DS_SDA BIT6 //DS_SDA = P2.6
#define DS_RST_IN P2DIR &= ~DS_RST
#define DS_RST_OUT P2DIR |= DS_RST
#define DS_RST0 P2OUT &= ~DS_RST
#define DS_RST1 P2OUT |= DS_RST
#define DS_SCL_IN P2DIR &= ~DS_SCL
#define DS_SCL_OUT P2DIR |= DS_SCL
#define DS_SCL0 P2OUT &= ~DS_SCL
#define DS_SCL1 P2OUT |= DS_SCL
#define DS_SDA_IN P2DIR &= ~DS_SDA
#define DS_SDA_OUT P2DIR |= DS_SDA
#define DS_SDA0 P2OUT &= ~DS_SDA
#define DS_SDA1 P2OUT |= DS_SDA
#define DS_SDA_BIT P2IN & DS_SDA
ucharflag;//定義一個讀標志位
uchar second,minute,hour,week,day,month,year;//秒、分、時、星期、日、月、年
/*******************************************
函數(shù)名稱:delay
功 能:延時一段時間
參 數(shù):time--延時長度
********************************************/
void delay(uint time)
{
uint i;
for(i = 0;i < time;i++) _NOP();
}
/*******************************************
函數(shù)名稱:Delay5ms 功 能:延時約5ms
********************************************/
void Delay5ms(void)
{
uint i=40000;
while (i != 0)
{
i--;
}
}
/*******************************************
函數(shù)名稱:WaitForEnable
功 能:等待1602液晶完成內(nèi)部操作
********************************************/
void WaitForEnable(void)
{
P4DIR &= 0x00; //將P4口切換為輸入狀態(tài)
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P4IN & Busy)!=0); //檢測忙標志
CLR_EN;
P4DIR |= 0xFF; //將P4口切換為輸出狀態(tài)
}
/*******************************************
函數(shù)名稱:write_com
功 能:向液晶模塊寫入命令
********************************************/
void write_com(uchar cmd)
{
WaitForEnable(); // 檢測忙信號?
CLR_RS;
CLR_RW;
_NOP();
DataPort = cmd; //將命令字寫入數(shù)據(jù)端口
_NOP();
SET_EN; //產(chǎn)生使能脈沖信號
_NOP();
_NOP();
CLR_EN;
}
/*******************************************
函數(shù)名稱:write_data
功 能:向液晶顯示的當前地址寫入顯示數(shù)據(jù)
參 數(shù):data--顯示字符數(shù)據(jù)
返回值 :無
********************************************/
void write_data( uchar data )
{
WaitForEnable(); //等待液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort = data; //將顯示數(shù)據(jù)寫入數(shù)據(jù)端口
_NOP();
SET_EN; //產(chǎn)生使能脈沖信號
_NOP();
_NOP();
CLR_EN;
}
void Write1602(uchar add,uchar dat)
{
write_com(add);
write_data(dat);
}
void zifuchuan(uchar *ch)
{
while(*ch!=0)
write_data(*ch++);
Delay5ms();
}
/*******************************************
函數(shù)名稱:LcdReset
功 能:對1602液晶模塊進行復位操作
********************************************/
void LcdReset(void)
{
CtrlDir |= 0x07; //控制線端口設為輸出狀態(tài)
DataDir = 0xFF; //數(shù)據(jù)端口設為輸出狀態(tài)
write_com(0x38);//規(guī)定的復位操作
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);//顯示模式設置
write_com(0x06);//寫字符時整體不移動
write_com(0x0c);//顯示開,不開游標,不閃爍
write_com(0x01);//顯示清屏
Write1602(0x80,2);
Write1602(0x81,0);
Write1602(0x80+4,-);
Write1602(0x80+7,-);
Write1602(0x80+0x40+5,:);
Write1602(0x80+0x40+8,:);
}
評論