1602液晶使用范例.docx

上传人:b****3 文档编号:3940119 上传时间:2023-05-06 格式:DOCX 页数:13 大小:452.72KB
下载 相关 举报
1602液晶使用范例.docx_第1页
第1页 / 共13页
1602液晶使用范例.docx_第2页
第2页 / 共13页
1602液晶使用范例.docx_第3页
第3页 / 共13页
1602液晶使用范例.docx_第4页
第4页 / 共13页
1602液晶使用范例.docx_第5页
第5页 / 共13页
1602液晶使用范例.docx_第6页
第6页 / 共13页
1602液晶使用范例.docx_第7页
第7页 / 共13页
1602液晶使用范例.docx_第8页
第8页 / 共13页
1602液晶使用范例.docx_第9页
第9页 / 共13页
1602液晶使用范例.docx_第10页
第10页 / 共13页
1602液晶使用范例.docx_第11页
第11页 / 共13页
1602液晶使用范例.docx_第12页
第12页 / 共13页
1602液晶使用范例.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

1602液晶使用范例.docx

《1602液晶使用范例.docx》由会员分享,可在线阅读,更多相关《1602液晶使用范例.docx(13页珍藏版)》请在冰点文库上搜索。

1602液晶使用范例.docx

1602液晶使用范例

一个1602的例子

液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。

    这里介绍的字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等等,这里以常用的2行16个字的1602液晶模块来介绍它的编程方法。

 

1602采用标准的16沤涌冢渲?

1602B引脚说明:

编号

符号

引脚说明

编号

符号

引脚说明

1

VSS

电源地

9

D2

双向数据口

2

VDD

电源正极

10

D3

双向数据口

3

VL

对比度调节

11

D4

双向数据口

4

RS

数据/命令选择

12

D5

双向数据口

5

R/W

读/写选择

13

D6

双向数据口

6

E

模块使能端

14

D7

双向数据口

7

D0

双向数据口

15

BLK

背光源地

8

D1

双向数据口

16

BLA

背光源正极

注意事项:

从该模块的正面看,引脚排列从右向左为:

15脚、16脚,然后才是1-14脚(线路板上已经标明)。

第1脚:

VSS为地电源

第2脚:

VDD接5V正电源

第3脚:

V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度

第4脚:

RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:

RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:

E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:

D0~D7为8位双向数据线。

第15~16脚:

BLA(BL1):

LED背光正极。

需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右,一般接一个几十欧姆的电阻,47欧、33欧等;

BLK(BL2):

LED背光地端。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:

阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”

1602液晶模块内部的控制器共有11条控制指令,如表2所示,

它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

(说明:

1为高电平、0为低电平)

指令1:

清显示,指令码01H,光标复位到地址00H位置

指令2:

光标复位,光标返回到地址00H

指令3:

光标和显示模式设置I/D:

光标移动方向,高电平右移,低电平左移S:

屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效

指令4:

显示开关控制。

D:

控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:

控制光标的开与关,高电平表示有光标,低电平表示无光标B:

控制光标是否闪烁,高电平闪烁,低电平不闪烁

指令5:

光标或显示移位S/C:

高电平时移动显示的文字,低电平时移动光标

指令6:

功能设置命令DL:

高电平时为4位总线,低电平时为8位总线N:

低电平时为单行显示,高电平时双行显示F:

低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(有些模块是DL:

高电平时为8位总线,低电平时为4位总线)

指令7:

字符发生器RAM地址设置

指令8:

DDRAM地址设置

指令9:

读忙信号和光标地址BF:

为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。

指令10:

写数据

指令11:

读数据

    DM-1602液晶显示模块可以和单片机AT89C51直接接口,电路如图1所示。

为了节约I/O口也可以采用6线接法,只用4根数据线,高低位分别传输,把RW接地,只写不读。

这样可以省下5根I/O口线。

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。

要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3是DM-162的内部显示地址.

比如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?

这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)

    以下是在液晶模块的第二行第一个字符的位置显示字母“A”的程序:

ORG0000H

RSEQUP3.7;确定具体硬件的连接方式

RWEQUP3.6;确定具体硬件的连接方式

EEQUP3.5;确定具体硬件的连接方式

MOVP1,#00000001B;清屏并光标复位

ACALLENABLE;调用写入命令子程序

MOVP1,#00111000B;设置显示模式:

8位2行5x7点阵

ACALLENABLE;调用写入命令子程序

MOVP1,#00001111B;显示器开、光标开、光标允许闪烁

ACALLENABLE;调用写入命令子程序

MOVP1,#00000110B;文字不动,光标自动右移

ACALLENABLE;调用写入命令子程序

MOVP1,#0C0H;写入显示起始地址(第二行第一个位置)

ACALLENABLE;调用写入命令子程序

MOVP1,#01000001B;字母A的代码

SETBRS;RS=1

CLRRW;RW=0;准备写入数据

CLRE;E=0;执行显示命令

ACALLDELAY;判断液晶模块是否忙?

SETBE;E=1;显示完成,程序停车

AJMP$

ENABLE:

CLRRS;写入控制命令的子程序

CLRRW

CLRE

ACALLDELAY

SETBE

RET

DELAY:

MOVP1,#0FFH;判断液晶显示器是否忙的子程序

CLRRS

SETBRW

CLRE

NOP

SETBE

JBP1.7,DELAY;如果P1.7为高电平表示忙就循环等待

RET

END

程序在开始时对液晶模块功能进行了初始化设置,约定了显示格式。

注意显示字符时光标是自动右移的,无需人工干预,每次输入指令都先调用判断液晶模块是否忙的子程序DELAY,然后输入显示位置的地址0C0H,最后输入要显示的字符A的代码41H。

6线范例:

//编译器:

ICC-AVR v6.31A 日期:

 2005-11-24 20:

29:

57

//目标芯片 :

 M16

//时钟:

 8.0000Mhz

/*-------------------------------------------------------------

LCD引脚定义

1---GND 

2---VCC

3---VO

4---RS

5---RW

6---EN

7到14--D0-D7

15--背景灯+

16--背景灯-

-----------------------------------------------------------------*/

#include 

#include 

/*---------------------------------------------------------------

下面是AVR与LCD连接信息

PA2 ->RS

PA3 ->EN

地  ->RW

PA4 ->D4

PA5 ->D5

PA6 ->D6

PA7 ->D7

要使用本驱动,改变下面配置信息即可

-----------------------------------------------------------------*/

#define LCD_EN_PORT    PORTA   //以下2个要设为同一个口

#define LCD_EN_DDR     DDRA

#define LCD_RS_PORT    PORTA   //以下2个要设为同一个口

#define LCD_RS_DDR     DDRA

#define LCD_DATA_PORT  PORTA   //以下3个要设为同一个口

#define LCD_DATA_DDR   DDRA    //一定要用高4位

#define LCD_DATA_PIN   PINA

#define LCD_RS         (1<

#define LCD_EN         (1<

#define LCD_DATA       ((1<

/*------------------------------------------------------------------------------

函数说明

------------------------------------------------------------------------------*/

void LCD_init(void);

void LCD_en_write(void);

void LCD_write_command(unsigned  char command) ;

void LCD_write_data(unsigned char data);

void LCD_set_xy (unsigned char x, unsigned char y);

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);

void delay_nus(unsigned int n);

void delay_nms(unsigned int n);

/*==========================================================*/

void LCD_init(void)         //液晶初始化

{

  LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出

  LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出

  LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出

  LCD_write_command(0x28); 

  LCD_en_write();

  delay_nus(40);

  LCD_write_command(0x28);  //4位显示

  LCD_write_command(0x0c);  //显示开

  LCD_write_command(0x01);  //清屏

  delay_nms

(2);

}

void LCD_en_write(void)  //液晶使能

{

  LCD_EN_PORT|=LCD_EN;

  delay_nus

(1);

  LCD_EN_PORT&=~LCD_EN;

}

void LCD_write_command(unsigned char command) //写指令

{

  delay_nus(16);

  LCD_RS_PORT&=~LCD_RS;        //RS=0

  LCD_DATA_PORT&=0X0f;         //清高四位

  LCD_DATA_PORT|=command&0xf0; //写高四位

  LCD_en_write();

  command=command<<4;          //低四位移到高四位

  LCD_DATA_PORT&=0x0f;         //清高四位

  LCD_DATA_PORT|=command&0xf0; //写低四位

  LCD_en_write();

  

}

void LCD_write_data(unsigned char data) //写数据

{

  delay_nus(16);

  LCD_RS_PORT|=LCD_RS;       //RS=1

  LCD_DATA_PORT&=0X0f;       //清高四位

  LCD_DATA_PORT|=data&0xf0;  //写高四位

  LCD_en_write();

  data=data<<4;               //低四位移到高四位

  LCD_DATA_PORT&=0X0f;        //清高四位

  LCD_DATA_PORT|=data&0xf0;   //写低四位

  LCD_en_write();

}

void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数

{

    unsigned char address;

    if (y == 0) address = 0x80 + x;

    else   address = 0xc0 + x;

    LCD_write_command( address);

}

  

void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s) //列x=0~15,行y=0,1

{

    LCD_set_xy( X, Y ); //写地址    

    while (*s)  // 写显示字符

    {

      LCD_write_data( *s );

      s ++;

    }

      

}

void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data) //列x=0~15,行y=0,1

{

  LCD_set_xy( X, Y ); //写地址

  LCD_write_data( data);

  

}

/*=============================================================*/

void delay_1us(void)                 //1us延时函数

  {

   asm("nop");

  }

void delay_nus(unsigned int n)       //N us延时函数

  {

   unsigned int i=0;

   for (i=0;i

   delay_1us();

  }

void delay_1ms(void)                 //1ms延时函数

  {

   unsigned int i;

   for (i=0;i<1140;i++);

  }

void delay_nms(unsigned int n)       //N ms延时函数

  {

   unsigned int i=0;

   for (i=0;i

   delay_1ms();

  }

/*============================================================*/

void init_devices(void)

{

  CLI(); //disable all interrupts

  LCD_init();

  MCUCR = 0x00;

  GICR  = 0x00;

  TIMSK = 0x00; //timer interrupt sources

  SEI(); //re-enable interrupts

}

void main(void)

{

   init_devices();

   LCD_write_string(1,0,"Hi!

!

");

   for(;;)

   {

   LCD_write_string(0,1,"archeng504");

   LCD_write_char(6,0,'8');   

   }

 

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2