#include "reg51.h"
#define uchar unsigned char
#define port P3
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
/***********************************
***00000 5*7 -> 0xff
*****0** /5*8 0x40
*****0** 0x40 ----> I
*****0** 0x40 ---->
*****0** 0x40
*****0** 0x40
***00000 0x1f
添加自己的自定义字符
***********************************/
code uchar ziku[]=
{
0x04,0x05,0x06,0x07,0x13,0x16,0X15,0x0C,
0xff,0xff,0x55,0xff,0x55,0xff,0xff,0xff
};
/*************************************
函数声明区
*************************************/
uchar lcd_readcom(void);
void check_busy(void);
void lcd_writecom(uchar dat);
uchar lcd_readdat(void);
void lcd_writedat(uchar dat);
void lcd_gets(char *dat);
void lcd_xy(uchar x,uchar y);
void lcd_init(void);
/*******************************
读取lcd1602状态
*******************************/
uchar lcd_readcom(void)
{
uchar temp;
e=0;
port=0xff;
rs=0;
rw=1;
e=1;
temp=port;
e=0;
return temp;
}
/***************************************
检测 lcd 是否忙碌 阿飞天天忙绿
***************************************/
void check_busy(void)
{
uchar temp;
do{
temp=lcd_readcom();
}while((temp&0x80)==0x80);
}
/*****************************************
向lcd里写命令
*****************************************/
void lcd_writecom(uchar dat)
{
check_busy();
e=0;
rs=0;
rw=0;
e=1;
port=dat;
e=0;
}
/***************************************
读取lcd对应地址数据
*****************************************/
uchar lcd_readdat(void)
{
uchar temp;
check_busy();
e=0;
port=0xff;
rs=1;
rw=1;
e=1;
temp=port;
e=0;
return temp;
}
/****************************************
向lcd里写数据
****************************************/
void lcd_writedat(uchar dat)
{
check_busy();
e=0;
rs=1;
rw=0;
e=1;
port=dat;
e=0;
}
/****************************************
向lcd写字符串
*****************************************/
void lcd_gets(char *dat)
{
while(*dat!=0)
{
lcd_writedat(*dat);
dat++;
}
}
/*****************************************
确定要写的位子即x y 坐标
******************************************/
void lcd_xy(uchar x,uchar y)
{
switch(y)
{
case 0:lcd_writecom(0x80+x);break;
case 1:lcd_writecom(0xc0+x);break;
}
}
/****************************************************
单行显示才有5*10 其他5*8 MODE=1 5*8 MODE=0 5*10
****************************************************/
add_custom_word(uchar *dat,uchar len,uchar mode)
{
uchar n,m;
for(n=0;n<len;n++)
{
if(mode)
{
lcd_writecom(0x40+8*n);
for(m=0;m<8;m++)
{
lcd_writedat(*dat);
dat++;
}
}
else
{
lcd_writecom(0x40+10*n);
for(m=0;m<10;m++)
{
lcd_writedat(*dat);
dat++;
}
}
}
}
/********************************************
初始化lcd
********************************************/
void lcd_init()
{
lcd_writecom(0x01) ;//清屏
lcd_writecom(0x03) ;
lcd_writecom(0x3c) ;
lcd_writecom(0x40) ;
lcd_writecom(0x0c) ;
add_custom_word(ziku,2,1); //初始化自定义字符
}
/**********************************************
主程序 实现显示
***********************************************/
main()
{
lcd_init();
lcd_xy(0,0);
lcd_gets(" I LOVE YOU");
lcd_xy(0,1);
lcd_gets("afei time:12:00");
lcd_xy(0,0);
lcd_writedat(0);
lcd_xy(15,0);
lcd_writedat(1);
while(1);
}