51单片机驱动1602液晶(4线串行)
废话少说,进入正题。
显示器件多见的是LED数码管,LCD液晶屏等。一般的数码管成本低廉,在显示内容要求不多的时候适用;LCD液晶屏以更多的显示空间得到了许多人的爱好,不过成本上要高的多(市场价在20元左右),本文以LCD1602为例说明如何驱动液晶屏。
LCD1602外接的控制接口有RS,R/W,E;数据接口为DB7--DB0。总共有11跟线与单片机的I/O口连接,若使用标准的51单片机,至少占用了一个端口再加上另一个端口的部分I/O口。这再很多应用场合是不大可取的。所以很有必要减少连接数。从其数据手册上介绍的4线连接方式可以达到只使用7个I/O口即可满足要求,其中为3个控制口RS,R/W,E和数据口的DB7--DB4;写入数据或指令的顺序是先写高半个字节,再写低半个字节。
其中P0口的高四位接到LCD1602的DB7-DB4,P3.0-P3.1分别接RS,R/W,E;
下面给出驱动源程序*/
#include
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define TRUE 1
#define FALSE 0
#define nop _nop_()
#define PtData P0 //定义连接口线,
#define PtContr P3
sbit RS="PtContr"^0;
sbit RW="PtContr"^1;
sbit E="PtContr"^2;
void InitialLcd();
void WriteLcdInstr(uchar);
void WriteLcdData(uchar);
void CheckLcdBusy();
uchar HexToDdram(uchar);
void Delay(unsigned int);
main()
{Delay(1000);
InitialLcd();
WriteLcdInstr(0x80);
WriteLcdData(e);
WriteLcdData(l);
WriteLcdData(k);
WriteLcdData(e);
WriteLcdData(l);
WriteLcdData(i);
WriteLcdData(k);
WriteLcdData(e);
WriteLcdInstr(0xc0);
WriteLcdData(L);
WriteLcdData(C);
WriteLcdData(D);
WriteLcdData(1);
WriteLcdData(6);
WriteLcdData(0);
WriteLcdData(2);
while(1)
{
WriteLcdInstr(0x0f);
Delay(30000);
WriteLcdInstr(0x08);
Delay(40000);
}
}
//----------------LCD1602函数---------------------//
//---初始化
void InitialLcd()
{Delay(600);//延时应大于15ms,不同的晶振使需要修改,本程序再6M下调试通过
RS=0;
RW=0;nop;
E=0;nop;
E=1;nop;
PtData=0x20;//
nop;
E=0;
Delay(200);//延时应大于4.1ms
E=1;nop;
PtData=0x20;//
nop;
E=0;
Delay(5);//延时应大于100us
E=1;nop;
PtData=0x20;//
nop;
E=0;//设置4位操作;
WriteLcdInstr(0x01);//清屏
WriteLcdInstr(0x28);//设置4位操作,1行显示,5x8
WriteLcdInstr(0x02);//光标归位
WriteLcdInstr(0x06);//AC自动加1,画面不动
WriteLcdInstr(0x0f);//0x0f:光标闪烁开;
}
//---写指令
void WriteLcdInstr(uchar Temp)
{CheckLcdBusy();
RS=0;
RW=0;
E=0;nop;
E=1;nop;
PtData=Temp;
nop;
E=0;nop;
E=1;nop;
PtData=(Temp<4);
nop;
E=0;nop;
}
//---写数据
void WriteLcdData(uchar Temp)
{
CheckLcdBusy();
RS=1;
RW=0;
E=0;nop;
E=1;nop;
PtData=Temp;
nop;
E=0;nop;
E=1;nop;
PtData=(Temp<4);
nop;
E=0;nop;
}
//---查忙
void CheckLcdBusy()
{uchar Temp,t;
PtData=0xff;
RW=1;
RS=0;nop;
E=0;nop;
do
{nop;
E=1;nop;
Temp=PtData;
nop;nop;nop;
E=0;nop;nop;
E=1;nop;
t=PtData;
nop;nop;nop;
E=0;nop;nop;
Temp&=0x80;
}while(Temp==0x80);
}
//---delay
void Delay(unsigned int N)
{unsigned int i;
for(i=0;i
51单片机1602液晶4线串 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)