手上有一片1602的LCD,ks0066的驅(qū)動芯片,帶LED背光.參考網(wǎng)站上的一些資料,寫了個驅(qū)動程序,寫完了才發(fā)現(xiàn),跟網(wǎng)上流傳的代碼基本上差不多
/*=======================================
1602lcd模塊驅(qū)動程序
==========================================
說明:1.晶體:11.0592MHz
2.1602驅(qū)動:ks0066
******************************************/
#i nclude
#i nclude
#define lcm_rs P2_7 //寄存器選擇
#define lcm_rw P2_6 //讀/寫控制
#define lcm_e P2_5 //讀/寫使能
#define lcm_blk P2_4 //背光led 1.off 0.on
#define lcm_data P0
//函數(shù)聲明
void delay5ms(void);
void delay400ms(void);
void lcm_write_command(unsigned char wc_lcm,busy_c);
/***********************************
//函數(shù)名稱: void lcm_ini(void)
//傳遞參數(shù): 無
//返 回 值: 無
//函數(shù)功能: LCM初始化
//函數(shù)說明:
***********************************/
void lcm_ini(void)
{
lcm_data = 0;
lcm_write_command(0x38,0); //16*2顯示,5*7點陣,8位數(shù)據(jù)接口,不檢測忙
delay5ms();
lcm_write_command(0x38,0);
delay5ms();
lcm_write_command(0x38,0); //三次顯示模式, 不檢測忙
delay5ms();
lcm_write_command(0x38,1); //16*2顯示,5*7點陣,8位數(shù)據(jù)接口,需要檢測忙
lcm_write_command(0x80,1); //關(guān)閉顯示
lcm_write_command(0x01,1); //clear顯示
lcm_write_command(0x06,1); //指針和光標(biāo)+1,不滾屏
lcm_write_command(0x0c,1); //開顯示,不顯示光標(biāo)
}
/***********************************
//函數(shù)名稱: unsigned char lcm_read_status(void)
//傳遞參數(shù): 無
//返 回 值: unsigned char
//函數(shù)功能: 讀lcm狀態(tài),等待lcm空閑
//函數(shù)說明: DB7=1,忙
***********************************/
unsigned char lcm_read_status(void)
{
lcm_data=0xff;
lcm_rs=0;
lcm_rw=1;
lcm_e=0;
lcm_e=0;
lcm_e=1;
while(lcm_data & 0x80);
return lcm_data;
}
/***********************************
//函數(shù)名稱: void lcm_write_data(unsigned char wd_lcm)
//傳遞參數(shù): unsigned char wd_lcm
//返 回 值: 無
//函數(shù)功能: lcm寫數(shù)據(jù)
//函數(shù)說明:
***********************************/
void lcm_write_data(unsigned char wd_lcm)
{
lcm_read_status(); //判斷l(xiāng)cm忙標(biāo)志
lcm_data = wd_lcm;
lcm_rs = 1;
lcm_rw = 0;
lcm_e = 0;
lcm_e = 0;
lcm_e = 1;
}
/***********************************
//函數(shù)名稱: void lcm_write_command(unsigned char wc_lcm, busy_c)
//傳遞參數(shù): unsigned char wc_lcm, busy_c
//返 回 值: 無
//函數(shù)功能: lcm寫命令
//函數(shù)說明: busy_c=0是,不用檢測忙信號
***********************************/
void lcm_write_command(unsigned char wc_lcm, busy_c)
{
if (busy_c)
lcm_read_status();
lcm_data = wc_lcm;
lcm_rs=0;
lcm_rw = 0;
lcm_e = 0;
lcm_e = 0;
lcm_e = 1;
}
/***********************************
//函數(shù)名稱: void disp_one_char(unsigned char x, unsigned char y,unsigned char disp_data)
//傳遞參數(shù): unsigned char x, unsigned char y,unsigned char disp_data
//返 回 值: 無
//函數(shù)功能: 指定位置顯示一個字符
//函數(shù)說明:
***********************************/
void disp_one_char(unsigned char x,unsigned char y,unsigned disp_data)
{
y = y&0x01;
x = x&0x0f; //限制2行,沒行15個字
if (y)
x =x + 0x40; //算RAM地址
x = x + 0x80;
lcm_write_command(x,0);
lcm_write_data(disp_data);
}
/***********************************
//函數(shù)名稱: void disp_one_char(unsigned char x, unsigned char y,unsigned char *disp_data)
//傳遞參數(shù): unsigned char x, unsigned char y,unsigned char *disp_data
//返 回 值: 無
//函數(shù)功能: 指定位置顯示一串字符
//函數(shù)說明:
***********************************/
void disp_list_char(unsigned char x,unsigned char y,unsigned char *disp_data)
{
unsigned char char_length,j;
char_length = strlen(disp_data);
y = y&0x1;
x = x&0x0f;
for (j=0;j { disp_one_char( x,y,disp_data[j]); //顯示一個字符 x++; } } /*********************************** //函數(shù)名稱: void delay5ms(void) //傳遞參數(shù): 無 //返 回 值: 無 //函數(shù)功能: 延時5MS //函數(shù)說明: ***********************************/ void delay5ms(void) { unsigned int TempCyc = 5552; while(TempCyc--); } /*********************************** //函數(shù)名稱: void delay400ms(void) //傳遞參數(shù): 無 //返 回 值: 無 //函數(shù)功能: L延時400MS //函數(shù)說明: LCM開機延時 ***********************************/ void delay400ms(void) { unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); }; } /*****d****************************** //函數(shù)名稱: void main(void) //傳遞參數(shù): 無 //返 回 值: 無 //函數(shù)功能: 主函數(shù) //函數(shù)說明: ************************************/ void main(void) { delay400ms(); lcm_ini(); disp_list_char(1,0,"Welcome"); disp_list_char(1,0,"www.dzkjcn.com") while(1); } 以上的程序只是簡單的顯示兩行字符,沒有滾屏和背光 4線液晶1602的C51程序 ---------------------------------- | LCM-----51 | LCM-----51 | ---------------------------------- |RS-----P2.1 | DB4-----P1.4 | |RW-----P2.0 | DB5-----P1.5 | |E -----P2.2 | DB6-----P1.6 | |VLCD接1K電阻到GND| DB7-----P1.7 | --------------------------------------------------- [注:AT89S51使用12M晶振] =============================================================*/ void writelcd(bit command,unsigned char ddata) { ReadStatusLCM(); //檢測忙 LCM_Data = (ddata&0xf0)|(P1&0x0f); LCM_RW = 0; if(command==0) LCM_RS = 0; else LCM_RS=1; LCM_E = 1; LCM_E = 0; LCM_E = 0; LCM_Data = ((ddata<<4)&0xf0)|(P1&0x0f); if(command==0) LCM_RS = 0; else LCM_RS=1; LCM_E = 1; LCM_E = 0; LCM_E = 0; } //讀狀態(tài) unsigned char ReadStatusLCM(void) { P1_7=1; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while(P1_7&0x01);//檢測忙信號 return(P1_7); } void LCMInit(void) //LCM初始化 { LCM_Data=0xff; writelcd(0,0x28); //三次顯示模式設(shè)置,不檢測忙信號 Delay5Ms(); writelcd(0,0x28); D