/*******************************************************************************
* 标题: 1602显示驱动程序 *
* 文件: 1602lcd.h 1602lcd.c *
* 日期: 2010-3-11 *
* 版本: 1.12(试验通过版)可用51hei单片机开发板 *
* 邮箱: acsdf139@163.com qq:526083029 *
* 网站: 无 *
********************************************************************************
* 描述: *
* 用法:首先在主程序内添加头文件#include"1602lcd.c" *
* 再在mian()中初始化液晶即可 *
* *
********************************************************************************
*【版权】自己参照网上,朋友,以及书本资料上写的,所以没有版权 *
*【声明】此程序,可用于学习,参考及实际设计中,欢迎转载复制以及建议批评 *
*【技术支持】qq:526083029 小张 *
********************************************************************************/
#ifndef _LCD1602_H_
#define _LCD1602_H_
#define delaynop(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define uchar unsigned char
#define SETXY 1
#define XYPRS 1
#define XYPRC 1
#define LEFTRIGHT 0
/************************************/
//函数声明
extern bit lcdbusy(void);
extern void lcdwcmd(uchar cmd); //写命令函数1
extern void lcdwdat(uchar dat); //写数据1
extern void lcdpos(uchar x,bit y); //行设置1
extern void lcdinit(void); //初始化1
extern void lcdprc(uchar ch); //写字符1
extern void lcdprs(uchar *string); //写字符串1
extern void lcdsetxy(uchar X,uchar Y);//显示坐标设置
extern void lcdxyprs(uchar X,uchar Y,char *String);//指定坐标显示字符串
extern void lcdxyprc(uchar X,uchar Y,char ch);
extern void lcdsetxs(bit D,bit C,bit B);
extern void lcdsetim(bit I_D,bit S);
extern void lcdclear(); //清屏函数
extern void lcdenter(); //显示回车
extern void lcdcri(unsigned char n);
extern void lcdcle(unsigned char n);
extern void lcdright(unsigned char n);
extern void lcdright(unsigned char n);
#endif
//////////////////////////////////////////////////////c程序/////////////////////////////////////////////////////
#include
#include "1602lcd.h"
#include
//管角定义
sbit RSlcd=P2^0; //数据命令选择
sbit RWlcd=P2^1; //数据读写
sbit EPlcd=P2^2; //使能
/************************************
函数名:lcdbusy
函数功能:1602忙闲信号
参数:无
返回:bit类型值 1为忙,0为闲
备注:
************************************/
bit lcdbusy(void)
{ bit result;
RSlcd = 0;
RWlcd = 1;
EPlcd = 1;
delaynop();
result = (bit)(P0 & 0x80);
EPlcd = 0;
return result;
}[page]
/*************************************
函数名:lcdwcmd
函数功能:向1602中写指令
参数:cmd(命令)
返回:无
备注:无
*************************************/
void lcdwcmd(uchar cmd)
{
while(lcdbusy());
RSlcd=0;
RWlcd=0;
EPlcd=0;
_nop_();
_nop_();
P0=cmd;
delaynop();
EPlcd = 1;
delaynop();
EPlcd = 0;
}
/*************************************
函数名:lcdwdat
函数功能:向1602中写数据
参数:dat(数据)
返回:无
备注:无
*************************************/
void lcdwdat(uchar dat)
{
while(lcdbusy());
RSlcd=1;
RWlcd=0;
EPlcd=0;
P0=dat;
delaynop();
EPlcd=1;
delaynop();
EPlcd=0;
}
/*************************************
函数名:lcdprc
函数功能:写一个字符
参数:zifu(字符)
返回:无
备注:无
*************************************/
void lcdprc(uchar zifu)
{
lcdwdat(zifu);
}
/*************************************
函数名:lcdprs
函数功能:写字符串
参数:zifu(字符)
返回:无
备注:无
*************************************/
void lcdprs(uchar *string)
{
while(*string)
{lcdwdat(*string);string++;}
}
/*************************************
函数名:lcdclear
函数功能:清屏
参数:无
返回:无
备注:无
*************************************/
void lcdclear(void)
{
lcdwcmd(0x01);
}
/*************************************
函数名:lcdenter
函数功能:软复位
参数:无
返回:无
备注:无
*************************************/
void lcdenter(void)
{
lcdwcmd(0x2);
}
/*************************************
函数名:lcdsetxs
函数功能:显示设置
参数:d(显示)c(光标)b(闪烁)
返回:无
备注:d=1(开显示),d=0(关显示)
c=1(显示光标),c=0(不显示光标)
b=1(光标闪烁),b=0(不闪烁)
*************************************/
void lcdsetxs(bit D,bit C,bit B)
{
unsigned char order;
order=0x8;
if(D)
order=order+0x4;
if(C)
order=order+0x2;
if(B)
order=order+0x1;
lcdwcmd(order);
}
/*************************************
函数名:lcdsetim
函数功能:左右移动
参数:I_D(地址指针), S(整行移动)
返回:无
备注:I_D=1(光标右移),I_D=0(光标左移)
S=1(整行左右移),S=0(整行不动)
*************************************/
void lcdsetim(bit I_D,bit S)
{
unsigned char order;
order=0x4;
if(I_D)
order=order+0x2;
if(S)
order=order+0x1;
lcdwcmd(order);
}
/*************************************
函数名:lcdinit
函数功能:初始化
参数:无
返回:无
备注:无
*************************************/
void lcdinit()
{
lcdwcmd(0x38);
_nop_();
_nop_();
_nop_();
_nop_();
lcdwcmd(0x38);
_nop_();
_nop_();
_nop_();
_nop_();
lcdwcmd(0x38);
_nop_();
_nop_();
_nop_();
_nop_();
lcdsetxs(1,0,0); //设置输入模式,默认增量方式,画面不动,光标向右边移动
lcdsetim(1,0);
lcdwcmd(0x01); //清屏
}
/*************************************
函数名:lcdsetxy
函数功能:坐标设置
参数:x(列数),y(行数)
返回:无
备注:配合lcdxyprc,lcdxyprs函数使用
列数小于39,行数小于2
*************************************/
void lcdsetxy(uchar X,uchar Y)
{
uchar Address;
if(X>39)
X=39;
if (Y == 0)
{
Address = 0x80 + X;
}
else
{
Address = 0xc0 + X;
}
lcdwcmd(Address);
}
[page]
#if XYPRC
/*************************************
函数名:lcdxyprc
函数功能:在特定行列内显示字符
参数:X(列),Y(行),ch(字符)
返回:无
备注:列数小于16,行数小于2
*************************************/
void lcdxyprc(uchar X,uchar Y,char ch)
{
lcdsetxy(X,Y);
lcdwdat((uchar)ch);
}
#endif
#if XYPRS
/*************************************
函数名:lcdxyprs
函数功能:在特定行列内显示字符串
参数:X(列),Y(行),String(字符)
返回:无
备注:列数小于16,行数小于2
*************************************/
void lcdxyprs(uchar X,uchar Y,char *String)
{
if(Y==0)
{
if(X<16)
{
lcdsetxy(X,Y);
for(;X<16 && *String!='