我收藏的一個1602顯示漢字程序
//*************************************
//lcd頭文件
//*************************************
#include<reg52.h>
#include<string.h>
#include <absacc.h>
#define lcd_data P0 //定義端口
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^1;
sbit RW=P2^2;
sbit E=P2^3;
sbit BF=P0^7;
//***************************************
//延時函數(shù)
//***************************************
void delay(uint i)
{
while(i--);
}
//***************************************
//寫控制字
//***************************************
void write_struct(uchar temp)
{
E=0;
delay(100);
//while(BF==1);
RW=0;
RS=0;
lcd_data=temp;
delay(3);
E=1;
delay(3);
E=0;
}
//**************************************
//寫數(shù)據(jù)
//**************************************
void write_data(uchar temp)
{
delay(100);
//while(BF==1);
E=0;
RS=1;
RW=0;
lcd_data=temp;
E=1;
delay(3);
E=0;
}
//***************************************
//獲得顯示地址
//x表示是第幾行顯示 (0-1)
//y表示某行的第幾個字符(0-15)
//***************************************
uchar getchar_adress(uchar x,uchar y)
{ uchar address;
if(x==0) address=0x80+y; //第一行
else address=0xc0+y; //第二行
return address;
}
//***************************************
//lcd初始化
//***************************************
void lcd_init()
{
write_struct(0x38); //設(shè)置接口DB寬度(8位)和LCM顯示行數(shù)(2行)
write_struct(0x08); //
write_struct(0x0c); //設(shè)置光標(biāo)為移位模式
write_struct(0x01); //執(zhí)行清屏操作
write_struct(0x06); //設(shè)置光標(biāo)為加1模式
}
//***************************************
//向CGRAM寫入數(shù)據(jù)
//***************************************
void write_cgram(unsigned char adress,unsigned char *p)
{
char i;
for(i=0;i<8;i++)
{ write_struct(adress+i);
write_data(p);
}
}
//***************************************
//顯示CGRAM數(shù)據(jù)
//x表示是第幾行顯示 (0-1)
//y表示某行的第幾個字符(0-15)
//***************************************
void display_cgram(unsigned char x,uchar y,uchar *CgramData)
{
uchar address,cgram_address,p;
address=getchar_adress(x,y); //獲得CGRAM字符顯示位置
cgram_address=0x40+(address&0x07)*8; //CGRAM初始地址
p=address&0x07;
write_cgram(cgram_address,CgramData);
write_struct(address); //設(shè)置DDRAM地址
write_data(p);
}
//顯示字符
//***************************************
void display(char temp0,char *p)
{
write_struct(temp0);
delay(3);
write_data(*p);
}
//****************************************
//顯示字符串
//****************************************
void display_str(uchar x,uchar y,char *p)
{
char i,temp0;
temp0=getchar_adress(x,y);
write_struct(temp0);
for(i=0;i<16;i++)
{
if(*p=='\0')
break;
write_data(*p);
p++;
}
}
//****************************************
//清屏
//****************************************
void lcd_clr()
{
write_struct(0x01);
}
//*****************************************************end