您的位置 首页 芯闻

51单片机驱动1602液晶(4线串行)

*单片机IO口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的IO口实现更多的功能是单片机工程师追求的目标

/*单片机I/O口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的I/O口完成更多的功用是单片机工程师寻求的方针,现在的一些串行器材也为这一方针的完成添加了更多的可能性,比方I2C总线,MAXIM力推的1-WIRE等等,都能够以很少的I/O口完成更多的功用,当然这是以下降必定的速度为价值的。

废话少说,进入正题。

显现器材多见的是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行显现,5×8
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}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/318190.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部