//接口定义
#define Lcd1602_RS OC1
#define Lcd1602_RW OC2
#define Lcd1602_E OC3
#define BF IC7
#define BF_DDR RC7
#define BF_OUT OC7
#define Lcd1602_Port_PORT PORTC
#define Lcd1602_Port_Read PINC
#define Lcd1602_Port_DDR DDRC
unsigned char DataString[]="0123456789";
/*********************************************
读忙,e=1;rw=0;rs=0;读BF,如果为1则LCM忙,反之闲
*********************************************/
void ReadBusy(void)
{
BF_DDR=0;
BF_OUT=1; //设置为上拉输入
Lcd1602_RS=0;
Lcd1602_RW=1;
Lcd1602_E=1;
while(BF); //读取IC7的值
Lcd1602_E=0;
BF_DDR=1; //设置为输出口
}
/*lcd1602_写指令*/
void WriteComand(uchar Comand)
{
ReadBusy();
Lcd1602_RS=0;
Lcd1602_RW=0;
Lcd1602_Port_DDR|=0xff; //设置为输出口
Lcd1602_Port_PORT&=0x0f; //高4位清零
Lcd1602_Port_PORT|=Comand&0xf0; //输出数据高4位
Lcd1602_E=1;
asm("nop");
asm("nop");
Lcd1602_E=0;
Lcd1602_Port_PORT&=0x0f; //高4位清零
Lcd1602_Port_PORT|=(Comand<<4)&0xf0; //输出数据低4位
Lcd1602_E=1;
asm("nop");
asm("nop");
Lcd1602_E=0;
}
/*lcm1602_写数据*/
void WriteData(uchar data)
{
ReadBusy();
Lcd1602_RS=1;
Lcd1602_RW=0;
Lcd1602_Port_DDR=0XFF;
Lcd1602_Port_PORT&=0x0f; //高4位清零
Lcd1602_Port_PORT|=data&0xf0; //输出数据高4位
Lcd1602_E=1;
asm("nop");
asm("nop");
Lcd1602_E=0;
Lcd1602_Port_PORT&=0x0f; //高4位清零
Lcd1602_Port_PORT|=(data<<4); //输出数据低4位
Lcd1602_E=1;
asm("nop");
asm("nop");
Lcd1602_E=0;
}
/***对1602进行定位显示字符*****/
/*/********************************************************************
* 名称 :void coordinate(uchar x, uchar y)
* 功能 :定位要显示的数据在液晶屏上的位置
* 输入 : uchar x, uchar y
显示字符串的位置,X:0-15,Y:0-1
LCD第一行显示寄存器地址:0X80-0X8F
LCD第一行显示寄存器地址:0XC0-0XCF
***********************************************************************/
void coordinate(uchar x,uchar y)
{
uchar address;
if (y==0)
{
address=0x80+x;
}
else
{
address=0xC0+x;
}
WriteComand(address);
}
/***********************************************************
显示一个字符子程序
************************************************************/
void dislayonechar(uchar x,uchar y,uchar wdata) //显示一个字符
{
coordinate(x,y); //定位置显示地址 //在x,y位置上显示开始写一个字符wdata
WriteData(wdata); //写数据子程序//
}
/************************************************************
显示一个字符串子程序
************************************************************/
void displaymorechar(uchar x,uchar y,char *s)
{
coordinate(x,y);
while(*s)
{
WriteData(*s);
s++;
x++;
if(x==16)
{
x=0;
y++;
if(y==2) y=0;
coordinate(x,y);
}
}
}
//显示一个整数的子函数
void displayint(uchar x,uchar y,int num)
{
coordinate(x,y);
WriteData(' ');
WriteData(' ');
WriteData(' ');
WriteData(' ');
WriteData(' ');
coordinate(x,y);
if(num>=10000)WriteData(DataString[num/10000]);
if(num>=1000)WriteData(DataString[num%10000/1000]);
if(num>=100)WriteData(DataString[num%1000/100]);
if(num>=10)WriteData(DataString[num%100/10]);
WriteData(DataString[num%10]);
}
//1602液晶显示器驱动的初始化函数
void init_lcm(void)
{
uchar i;
_delay_ms(20);
WriteComand(0x30);
_delay_ms(3);
WriteComand(0x30);
for(i=0;i<6;i++)
{
_delay_ms(20);
}
WriteComand(0x30);
_delay_ms(1);
WriteComand(0x02);
WriteComand(0x28); /*4位总线....*/
WriteComand(0x01); /*清屏*/
WriteComand(0x02); /*归位*/
WriteComand(0x0c); /*显示开,光标开,闪烁开*/
WriteComand(0x06); /*光标自动右移,显示文字不动*/
}