花了比較長的時間才理解明白,當中還受到了1份錯誤的文檔導至設定4線模式寄存器錯誤.
以下是1602頭文件代碼:
#ifndef __lcd1602_H__
#define __lcd1602_H__
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^1;//RS接P1.1
sbit rw=P1^2;//RW接1.2
sbit en=P1^3;//EN接P1.3
#define lcdbus P1//LCD總線接P1高4位,P1.4-DB4/P1.5-DB5/P1.6-DB6/P1.7-DB7/
uchar code table2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//0,1,2,3,4,5,6,7,8,9
//--------延時
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//////////查忙
/*void chk_bus(void)
{
rs=0;
rw=1;
en=1;
while(lcdbus&0x80);
en=0;
}
*/
//--------1602寫命令4bit
void write_com(uchar com)
{
//chk_bus();
rs=0;//RS=0寫命令
rw=0;
en=1;
lcdbus=(com&0xf0)|(lcdbus&0xf);//將高4位命令與P1低4位組合后送出到LCD
en=0;
delay(5);
en=1;
lcdbus=((com&0xf)<<4)|(lcdbus&0xf);//將低4位命令與P1低4位組合后送出到LCD
en=0;
}
//--------1602寫數據4bit
void write_date(uchar date)
{
//chk)bus();
rs=1;//RS=1寫數據
rw=0;
en=1;
lcdbus=(date&0xf0)|(lcdbus&0xf);//將高4位數據與P1低4位組合后送回lcdbus端口
en=0;
delay(5);
en=1;
lcdbus=((date&0xf)<<4)|(lcdbus&0xf);//將低4位數據與P1低4位組合后送回lcdbus端口
en=0;
}
//--------1602初始化
void lcdinit()
{
write_com(0x02);//光標復位
write_com(0x28);//28=4bit模式/38=8bit模式
write_com(0x0c);//1100//11開顯示/光開開關/閃爍開關
write_com(0x06);//110//1=AC+1,0=AC-1,/1=畫面平移,0=畫面不動
write_com(0x01);//清屏*/
}
//--------1602确定位置
void LcdPos(uchar xPos,uchar yPos)
{
uchar tmp;
if(xPos>15)xPos=15;//x位置不能達於15
if(yPos>1)yPos=1; //Y位置不能大於1
if(yPos==0)
tmp=xPos+0x80; //第1行從0x80開始
else
tmp=xPos+0xc0; //第2行從0xC開始
write_com(tmp); //將地址寫入LCD
}
//--------1602指定位置輸入單個字符
void write_char(uchar xPos,uchar yPos,uchar c)
{
LcdPos(xPos,yPos); //調用位置確定程序
write_date(c); //寫入數據
}
//---------1602指定位置寫字符串
void write_char1(uchar xPos,uchar yPos,uchar *date)
{
LcdPos(xPos,yPos); //調用位置確定程序
while(*date>0)write_date(*date++);//連續寫入字符串
}
//////////////////////////////////////////////
#endif
主程序測試代碼:
#include"lcd1602.h"//調用LCD1602頭文件
void main()
{
lcdinit(); //LCD初始化
write_char1(1,0,"Heoll LCD1602!"); //第1行寫入字符串
write_char1(1,1,"2012.5.5"); //第2行寫入字符串
while(1);
}
|