本程序的pdf格局的原理图下载:http://www.51hei.com/f/ks51.pdf
/***********写1602液晶**************/
/**
*功用:写1602液晶
*时刻:二〇一四年三月十五日 08:59:26
*作者:寒竹子
**/
#include
#include
typedef unsigned int uint;
typedef unsigned char uchar;
//LCD1602
sbit LCD1602_RS = P1^0;
sbit LCD1602_RW = P1^1;
sbit LCD1602_EN = P1^5;
void LCD1602_Wait();
void writeCmd_LCD1602(uchar cmd);
void writeData_LCD1602(uchar dat);
void LCD1602_Init();
void writeString_LCD1602(uchar * pstr);
void LCD1602_ShowStr(uchar x, uchar y, uchar * pstr);
void main()
{
LCD1602_Init();
/*
writeCmd_LCD1602(0x00 | 0x80);
writeData_LCD1602(C);
writeString_LCD1602(“Hanzhuzi”);
*/
LCD1602_ShowStr(0, 0, “han zhu ying xue”);
LCD1602_ShowStr(0, 1, “QQ:1754410821”);
while (1);
}
//LCD1602判忙预备
void LCD1602_Wait()
{
uchar sta = 0;//读取液晶当时状况
P0 = 0xFF;//读取状况时有必要把总线拉高才干正确的读取其状况!不然写入有时不成功!!!
LCD1602_RS = 0;
LCD1602_RW = 1;
do
{
LCD1602_EN = 1;
sta = P0;//读取状况
LCD1602_EN = 0;//防止液晶输出数据影响到总线P0上的其他器材
} while (sta & 0x80);//检测第七位是否为1,若为1持续等候直到0停止
}
//LCD1602写指令
void writeCmd_LCD1602(uchar cmd)
{
//在进行读写数据之前要进行液晶繁忙等候
LCD1602_Wait();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_EN = 0;
P0 = cmd;
LCD1602_EN = 1;//高脉冲送入指令
LCD1602_EN = 0;//防止液晶输出数据影响其他的器材
}
//LCD1602写数据
void writeData_LCD1602(uchar dat)
{
LCD1602_Wait();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_EN = 0;
P0 = dat;//送入数据
LCD1602_EN = 1;//高脉冲
LCD1602_EN = 0;//防止液晶输出数据影响到其他器材
}
//LCD1602初始化
void LCD1602_Init()
{
writeCmd_LCD1602(0x38);//5*7点阵,16*2显现
writeCmd_LCD1602(0x0C);//开显现,不显现光标
writeCmd_LCD1602(0x06);//数据指针++,光标++
writeCmd_LCD1602(0x01);//清屏
}
//LCD1602写String
void writeString_LCD1602(uchar * pstr)
{
while (*pstr)
{
writeData_LCD1602(*pstr++);
}
}
//LCD1602按地址写
void LCD1602_ShowStr(uchar x, uchar y, uchar * pstr)
{
uchar addr = 0;
//判别RAM地址
if (y == 0) //LCD1602的左上角地址是 (0, 0)
{
addr = (0x00 + x);//确认x坐标,x为偏移量
}
else
{
addr = (0x40 + x);//第二行
}
//写入地址
writeCmd_LCD1602(addr | 0x80);//地址是从0x80H开端的
//写入数据
while (*pstr != )
{
writeData_LCD1602(*pstr++);
}
}