//LCD0804.h
#include <reg52.h>
#include <string.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCM_DATA P0
sbit LCM_RS =P2^0;
sbit LCM_RW =P2^1;
sbit LCM_E =P2^2;

//LCD0804.c
#include "LCM16X2.h"



/**//*

====================================================================

說 明:由于LCM液晶慢速設備,所以在使用它之前要檢查它是否是處于忙的狀態

如果它處于寫忙的狀態時D7是恒為高電平的!所以只需要檢查D7這一位就OK

函數名稱:IsBusy()

入口參數:無 出口參數:無

設 計 者: 時 間:2008年8月12日

====================================================================

*/

void IsBusy()



{

bit busy;

do


{

LCM_RS=0;

LCM_RW=1;

LCM_E=1;

LCM_DATA=0xff;

busy=LCM_DATA&0x80;

LCM_E=0;

}while(busy);

}


/**//*

====================================================================

說 明:當對該設備進行操作之前一定要檢查它是否處于忙的狀態

RS=1時為數據寄存器,RS=0時為指令寄存器

RW=1時為讀操作, RW=0時為寫操作

函數名稱:LCM_Write_Com

入口參數:uchar comm 出口參數:無

設 計 者: 時 間:2008年8月12日

=====================================================================

*/

void LCM_Write_Com(uchar comm)



{

IsBusy();

LCM_RS=0;

LCM_RW=0;

LCM_E=1;

LCM_DATA=comm;

LCM_E=0;

}


/**//*

=====================================================================

說 明:當對該設備進行操作之前要先檢查它是否處于忙的狀態.

函數名稱:LCM_Write_Data

入口參數: uchar dat 出口參數: 無

設 計 者: 時 間:2008年8月12日

=====================================================================

*/

void LCM_Write_Data(uchar dat)



{

IsBusy();

LCM_RS=1;

LCM_RW=0;

LCM_E=1;

LCM_DATA=dat;

LCM_E=0;

}


/**//*

=====================================================================

說 明:需要注意的是:當E使能端從高電平向低電平跳變的時間,執行指令.

先給DATA初始化為高電平

函數名稱:LCM_Read_Data

入口參數:無 出口參數: uchar

設 計 者: 時 間:2008年8月12日

=====================================================================

*/

uchar LCM_Read_Data()



{

uchar result;

IsBusy();

LCM_DATA=0xff;

LCM_RS=1;

LCM_RW=1;

LCM_E=1;

result=LCM_DATA;

LCM_E=0;

return result;

}


/**//*

=====================================================================

說 明:因為當設備處于寫的狀態時,D7必須恒為1,

第一行的實際寫入地址為80H+XX

第二行的實際寫入地址為80H+40H=C0H, CH+XX

函數名稱:LCM_Display_Char

入口參數:uint ,uint ,uchar 出口參數:無

設 計 者: 時 間:2008年8月12日

=====================================================================

*/

void LCM_Display_Char(uint row,uint col,uchar m_char)



{

if(row==0)


{

LCM_Write_Com(0x80+col);

}

else


{

LCM_Write_Com(0xc0+col);

}

LCM_Write_Data(m_char);

}


/**//*

=====================================================================

說 明:本函數用于輸出一個字符串

函數名稱:LCM_Display_String

入口參數:uint,uint,uchar* 出口參數: 無

設 計 者: 時 間:2008年8月12日

=====================================================================

*/

void LCM_Display_String(uint row,uint col,uchar *m_pStr)



{

uchar m_Length;

m_Length=strlen(m_pStr);

while(m_Length)


{

if(col>=16)


{

row++;

col=0;

}

if(row>=2)row=0;

LCM_Display_Char(row,col,*m_pStr);

m_pStr++;

col++;

m_Length--;

}

}


/**//*

=================================================================

說 明:本函數用于初始化16X2液晶模塊,關于指令請參照說明

函數名稱:LCM_Init

入口參數:無 出口參數:無

設 計 者: 時 間:2008年8月12日

=================================================================

*/

void LCM_Init()



{

LCM_Write_Com(0x38);

LCM_Write_Com(0x0c);

LCM_Write_Com(0x06);

LCM_Write_Com(0x01);

}


/**//*

=================================================================

說 明:本函數用于非準確延時

函數名稱:

入口參數:uint 出口參數:無

設 計 者: 時 間:2008年8月12日

=================================================================

*/

void Delay(uint msecond)



{

int i,j;

for(i=0;i<msecond;i++)

for(j=0;j<100;j++);

}


/**//*

=================================================================

說 明: 主函數 注意在程序剛開始運行時先延時,讓設備就緒

函數名稱:main

入口參數:無 出口參數:int

設 計 者: 時 間:2008年8月12日

=================================================================

*/

int main()



{

Delay(500);

LCM_Init();

LCM_Display_String(0,1,"DG.Boy is a bad boy");

return 0;

}

posted on 2009-03-07 18:19
宇馳 閱讀(94)
評論(0) 編輯 收藏 引用