看代码是asm版本的,大家/自己理解起来诸多不便,于是转换成c语言版本之后再理解了,利己达人!(上一楼的头文件)
注意:为了便于大家查看。所有的空格就转给不可见字符了。20 20 20 20 转 a1 a1 a1 a1
请大家下载附件中的代码编译,请勿直接复制!
//以下为液晶1602的显示程序(作为头文件调用)
#include "at89x52.h"
#include "intrins.h"
//==============特殊声明=====================
#define uint unsigned int
#define uchar unsigned char
//=============管脚定义=================
#define lcmdata p0
sbit lcmrs = p2^5; //0-命令,1-数据
sbit lcmrw = p2^6; //0-写lcm,1-读lcm
sbit lcme = p2^7; //下降沿有效
sbit bf = lcmdata^7;
//以下命令 lcmrs=0,lcmrw=0;
//lcmdata = b(00000001),清显示,光标复位到地址00h位置
//lcmdata = b(0000001x),光标复位,光标返回到地址00h
//lcmdata = b(000001[i/d]s),i/d=1,光标右移,i/d=0,左移;s:屏幕上所有文字是(s=1)否(s=0)左移或者右移
//lcmdata = b(00001dcb),d:控制整体显示的开(d=1)与关(d=0),c:控制光标的开(c=1)与关(c=0),b:控制光标是(b=1)否(b=0)闪烁
//lcmdata = b(0001[s/c][r/l]xx),s/c=1,移动光标和显示的文字, s/c=0,移动光标;r/l=1,右移,r/l=0,左移
//lcmdata = b(001[dl]nfxx),dl=0,4位总线,d7~d4,dl=1,8位总线;n=0,单行显示,n=1,双行显示;f=0,显示5x7的点阵字符,f=1,显示5x10的点阵字符
//lcmdata = b(01aaaaaa),字符发生器ram地址设置
//lcmdata = b(1aaaaaaa),ddram地址设置
//以下命令 lcmrs=0,lcmrw=1
//lcmdata = b([bf]aaaaaaa),bf=1,忙,bf=0,闲
//以下命令 lcmrs=1,lcmrw=0
//写数据
//以下命令 lcmrs=1,lcmrw=1
//读数据
//===============函数===============
lcminit();
lcmdelay();
lcmcon(char c);
lcmchr(char chr,char hang,char wei);
lcmnxchr(char chr);
lcmstr(char * str,char hang,char wei);
//================液晶初始化=============
lcminit()
{
lcmcon(0x38); //00111000
lcmcon(0x38);
lcmcon(0x38);
lcmcon(0x38);
lcmcon(0x01); //00000001
lcmcon(0x06); //00000110
lcmcon(0x0c); //00001100
}
//============液晶显示忙等待==============
lcmdelay()
{
while(1)
{
lcmdata = 0xff;
lcmrs = 0;
lcmrw = 1;
lcme = 0;
_nop_();
lcme = 1;
if(bf == 0)
{
break;
}
}
}
//===============液晶命令============
lcmcon(char c)
{
lcmdata = c;
lcmrs = 0;
lcmrw = 0;
lcme = 0;
lcmdelay();
lcme = 1;
}
//=========液晶显示lcmchr()==============
lcmchr(char chr,char hang,char wei)
{
lcmcon(0x80+0x40*hang+wei);
lcmdata = chr;
lcmrs = 1;
lcmrw = 0;
lcme = 0;
lcmdelay();
lcme = 1;
}
//============液晶显示lcmnxchr()==========
lcmnxchr(char chr)
{
lcmdata = chr;
lcmrs = 1;
lcmrw = 0;
lcme = 0;
lcmdelay();
lcme = 1;
}
//==========液晶显示lcmpstr()=============
lcmstr(char *str,char hang,char wei)
{
lcmcon(0x80+0x40*hang+wei);
while(*str!='\0')
{
lcmdata = *str++;
lcmrs = 1;
lcmrw = 0;
lcme = 0;
lcmdelay();
lcme = 1;
}
}