分享

第七课 控制液晶屏LCD1602《中学生C51单片机易学实战入门教程》

 岐岐feng 2018-03-26
  • 实验准备

  • 课程内容

第七课 控制液晶屏LCD1602

实验准备:

LCD1602 面包板 杜邦线

电阻:10k 8只 或排阻(用于P0上拉)

(或直接使用完整的开发板)

课程内容:

一、 原理图与接线

第七课 控制液晶屏LCD1602《中学生C51单片机易学实战入门教程》

这里分析下 几个接口信号 V0、RS、RW、EN 表示的意义:

3脚:V0,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,注意此脚电压为0时可以得到最强的对比度。

4脚:RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而为低电平时,则是进行命令字节的传输操作。命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示的字节。值得一提的是,LCD1602的数据是8位的。

5脚:R/W,读写选择端。当此脚为高电平可对LCD1602进行读数据操作,反之进行写数据操作。

6脚:E,使能信号(LCDE),其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。

7~14脚:8位并行数据口,使得对LCD1602的数据读写大为方便。

还有就是在单片机开发板上的接线:数据线接P0,控制线用P2中的三个IO

sbit LCD_RS = P2^6;

sbit LCD_RW = P2^5;

sbit LCD_EP = P2^7;

二、 底层操作

写命令 RS=L,RW=L,D0—D7=命令,EN=高脉冲 H

写数据 RS=H,RW=L,D0—D7=数据,EN=高脉冲H

三、 时序图

第七课 控制液晶屏LCD1602《中学生C51单片机易学实战入门教程》

这节课引入时序图,其他器件类似,只要看懂时序图,就可以通过编程轻松控制这些器件按自己的需求工作,注意时间轴从左往右。

我们先不读出它的数据的状态或者数据本身。所以只需要看两个写时序:

① 当我们要写指令字,设置LCD1602的工作方式时:需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

② 当我们要写入数据字,在1602上实现显示时:需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。

发现了么,写指令和写数据,差别仅仅在于RS的电平不一样而已。

操作步骤:(要对照时序图)

1) RS 确定 写数据还是命令

2) RW写模式 给0

3) P0 放数据或命令,延时5微秒

4) EN 给 1 延时5微秒 再给0 (即是给了脉冲)

第七课 控制液晶屏LCD1602《中学生C51单片机易学实战入门教程》

这个表的命令也不需要记,在下面例程中LCD初始化部分就有厂家提供的代码.

还有下表是控制操作需要消耗的时间:ns表示纳秒

第七课 控制液晶屏LCD1602《中学生C51单片机易学实战入门教程》

四、 按时序图编程

一个 _nop_(); 大约1微秒

void lcd_cmd(BYTE cmd)

{ // 写入指令数据到LCD

LCD_RS = 0;

LCD_RW = 0;

LCD_EP = 0;

P0 = cmd;

_nop_();_nop_();_nop_();_nop_();_nop_();

LCD_EP = 1;

_nop_();_nop_();_nop_();_nop_();_nop_();

LCD_EP = 0;

}

void lcd_wdat(BYTE dat)

{ //写入字符显示数据到LCD

LCD_RS = 1;

LCD_RW = 0;

LCD_EP = 0;

P0 = dat;

_nop_();_nop_();_nop_();_nop_();_nop_();

LCD_EP = 1;

_nop_();_nop_();_nop_();_nop_();_nop_();

LCD_EP = 0;

}

void lcd_init()

{ //LCD初始化设定

lcd_cmd(0x38); //16*2显示,5*7点阵,8位数据

lcd_cmd(0x0c); //显示开,关光标

lcd_cmd(0x06); //移动光标

lcd_cmd(0x01); //清除LCD的显示内容

}

BYTE code dis1[] = {' WELCOME TO '}; //要放最前面定义

BYTE code dis2[] = {' My C51 '};//要放最前面定义

main()

{

BYTE i;

lcd_init(); // 初始化LCD

delay(10);

while(1)

{

lcd_wcmd(0x06); //向右移动光标

lcd_ wcmd (0x80); //设置显示位置为第一行的第1个字符

i = 0;

while(dis1[ i ] != '\0') // \0 是C语言中字符串最后一个字符

{ //显示字符'WLCOME TO'

lcd_wdat(dis1[ i ]);

i++;

}

lcd_ wcmd (0x80+0x40); //设置显示位置为第二行第1个字符

i = 0;

while(dis2[ i ] != '\0')

{

lcd_wdat(dis2[ i ]); //显示字符' My C51'

i++;

delay(30); //控制两字之间显示速度

}

}

}

可以修改程序 让向左显示 ,或者移出移入

可以在在程序 中 需要的位置加入 延时 让数据稳定

五、增补C语言基础--数组

简单理解:数组是同种类型元素的集合。(特别注意:同种类型)

1. 一维数组定义

int a[10];

这样我们便定义了一个数组a,它分配10个int类型空间。

2.数组的初始化

例程中:

BYTE code dis1[] = {' WELCOME TO '};

定义了一个类型为 BYTE code 的数组,同时做初始化,这数组的各个元素都是一个字符,其中有空格,字母.

3.数组元素的访问

访问数组中的元素可以采用数组名加下标的方式,下标是从0开始,C语言并不检查数组下标是否越界,所以在访问数组中的元素时需要注意,需要对数组下标做判断,防止访问数组越界。

例子:

int a[10];

int i;

for (i = 0; i < 10;="">

{

a[i] = i + 1;

}

至于二维数组,简单可理解为一个XX行YY列的表格,本教程现时还没有用到,所以暂时不作详解.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多