51单片机实战:液晶显示器のLCD1602

文章框架

文章框架


前言

好吧,最终我还是决定把LCD和串口通信分开写。

首先祝各位新春快乐,鸡年大吉。上班的事业有成,上学的天天向上。过大年呢,还真没啥心情码字。

借着爆竹声咱扯会儿LCD(液晶显示器,Liquid Crystal Display)。今天要实战的这款俗称为LCD1602,尤其注意这个1602,他说明了这款显示器的显示能力:每行16个字符,共2行,乃字符显示器(仅ASCII)。


参数

显示容量|芯片工作电压|工作电流|模块最佳工作电压
:---:|:---:|:---:|:---:|:---:
16×2 Char|4.5~5.5V|2.0mA(5.0V)|5.0V

引脚

Vss Vdd VO RS R/W E D0~7 BLA BLK
接地 正极 对比度调节 数据(H)/命令(L)选择端 读(H)/写(L)选择端 使能(Enable)信号 数据口 背光电源正极 背光电源负极

LCD上也有一个单片机,用于控制屏幕显示。我们并不是直接操作那块屏幕,而是与那个单片机交互。
其中D0~7这8个数据口就是用于交互的,为并行传输

指令

因为我们要和LCD内嵌的单片机交互,所以需要指令。下面所列的东西都是当RS为低电平时发送的(若为高电平,就识别为数据)。

  • 数据指针
第一行 第二行
0x80 0xC0 (0x80+0x40)
  • 显示相关

模式:

指令 功能
0x38 设置16×2显示,5x7点阵,8位数据接口

方式:

0 0 0 0 1 D C B
||||Display,1:开显示 Cursor,1:显示光标 Blink,1:光标闪烁
0 0 0 0 0 1 N S
|||||Next,1:读/写一个字符后,指针自动加1 Shift,1:写字符时,相对字符静止的屏幕移动

清屏:

指令 功能
0x01 数据指针清0且所有指针清空
0x02 仅数据指针清0
  • 操作
指令 功能
0x10 光标左移
0x14 光标右移
0x18 整体左移
0x1c 整体右移

电平

简单说下,逻辑电路中只有高电平和低电平,也就是程序里面的1和0。但是在物理层面上,它需要一个具体的表现,然后整理成标准。
TTL就是本例中要用到的一种电平,单片机和LCD通过引脚传递电信号,从而达到1和0的传递。
TTL中的低电平(0)表现为0V,高电平(1)表现为5V


实例

界内显示

  • 电路
电路

在Proteus里,1602就是LM016L,除了没有背光灯电源外用法一致(VEE是对比度调节,本例不用)。
RP1为上拉电阻,用于提高电压。由于这款单片机的P0引脚组的电压低于5V,所以需要上拉至5V,达到TTL的标准。
那个圆形的刻着Volts字样的东西是电压表,连接两个没被上拉电压的P0引脚,具体数值看后面的演示图。

  • 代码
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
    
//coefficient of 1602 display(16 row 2 col. 5*7px per Char)
#define LCD_CLEAR 0x01      //宏定义:清屏
#define DISPLAY_MODE_1602 0x38  //宏定义:1602显示模式

#define DISPLAY_OFF 0x08  //宏定义:关显示
#define DISPLAY_ON_NO_CURSOR 0x0c  //宏定义:开显示且无光标
#define DISPLAY_ON_WITH_CURSOR_NO_BLINK 0x0e  //宏定义:开显示且有光标但不闪烁
#define DISPLAY_ON_WITH_CURSOR_BLINK 0x0f  //宏定义:开显示且有光标且闪烁

#define AUTO_BACK_STEP 0x04  //宏定义:读/写时指针自动减1
#define AUTO_NEXT_STEP 0x06  //宏定义:读/写时指针自动加1
#define AUTO_DISPLAY_MOVE_LEFT 0x07  //宏定义:字符相对静止,整屏左移
#define AUTO_DISPLAY_MOVE_RIGHT 0x05  //宏定义:字符相对静止,整屏右移

#define ALL_MOVE_LEFT 0x18  //宏定义:屏幕左移
#define ALL_MOVE_RIGHT 0x1c  //宏定义:屏幕右移
#define CURSOR_MOVE_LEFT 0x10  //宏定义:光标左移
#define CURSOR_MOVE_RIGHT 0x14  //宏定义:光标右移

#define FIRST_ROW 0x80  //宏定义:第一行头地址
#define SECOND_ROW FIRST_ROW+0x40  //宏定义:第二行头地址


uchar code fst[] = "Hello World!";  //第一行要显示的数据数组
uchar code sec[] = "";  //第二行要显示的数据数组
uchar num;  //字符计数
sbit enable = P0^5;  //使能端
sbit RS = P0^7;  //数据/命令切换
sbit RW = P0^6;  //读/写切换

sbit anode = P0^0;  //连接电压表阳极
sbit cathode = P0^1;  //连接电压表阴极

//粗制的延时器,没走一次这个函数大约为1ms,适用于11.0592MHz及附近
void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}

//写命令
void writeCmd(uchar cmd)
{
    RS = 0;  //切换为写命令模式
    P2 = cmd;
    delay(1);  //注意
    enable = 1;  //执行!
    delay(1);  //注意
    enable = 0; //执行完毕!
}

void writeDat(uchar dat){
    RS = 1; //切换为数据模式
    P2 = dat;
    delay(1);  //注意
    enable = 1;
    delay(1);  //注意
    enable = 0;
}

//初始化函数
void init(){
    anode = 1;
    cathode = 0;
    
    RW = 0;  //写模式,本例只往LCD写数据
    enable = 0;
    writeCmd(DISPLAY_MODE_1602);  //发送命令:1602模式
    writeCmd(DISPLAY_ON_WITH_CURSOR_BLINK);  //发送命令:开始显示并闪烁光标
    writeCmd(AUTO_NEXT_STEP);  //发送命令:数据指针自动加1
    writeCmd(LCD_CLEAR);  //发送命令:清屏
}

void main(){
    init();
    writeCmd(FIRST_ROW);  //发送命令:开始从第一行写入
    for(num=0;num<=12;num++){
        writeDat(fst[num]);  //发送数据,每次一字节
    }
    while(1);
}

好,说一下上面代码中标//注意的地方,全都是delay(1)
为了什么呢,不是蛋疼,是因为单片机给LCD传送信号时,数据是要放在数据线上的,要是LCD还没读完单片机给它发的啥就把内容撤走的话,就会造成数据丢失。
就是这个道理,为了传输稳定,所以延时一小会儿。这个延时的数值需要大家自己去试,并不一定所有的情况都延时大约1ms就够的。

  • 效果
GIF.gif

越界显示

本例用于显示字符数超过16个的情况。
代码改动

uchar code fst[] = "1234567890ABCDEF";  //第一行要显示的数据数组
uchar code sec[] = "1234567890ABCDEFGHIJK";  //第二行要显示的数据数组
  • 初始化函数
void init(){
    anode = 1;
    cathode = 0;
    
    RW = 0;
    enable = 0;
    writeCmd(DISPLAY_MODE_1602);
    writeCmd(DISPLAY_ON_NO_CURSOR);  //换成不闪的,虽然跟这个新需求没什么联系,就是给你演示下效果
    writeCmd(AUTO_NEXT_STEP);
    writeCmd(LCD_CLEAR);
}
  • 主函数
void main(){
    init();
    writeCmd(FIRST_ROW);  //发送命令:开始从第一行写入
    for(num=0;num<=16;num++){
        writeDat(fst[num]);
    }
    writeCmd(SECOND_ROW);  //发送命令:开始从第二行写入
    for(num=0;num<=20;num++){
        writeDat(sec[num]);
    }
    while(1){
        //向左移动三次,每次间隔500ms
        for(num=0;num<=3;num++) {
            writeCmd(ALL_MOVE_LEFT);  //发送命令:整屏左移
            delay(500);
        }
        delay(1000);  //暂停大约1s
        //向右移动三次,每次间隔500ms
        for(num=0;num<=3;num++) {
            writeCmd(ALL_MOVE_RIGHT);  //发送命令:整屏右移
            delay(500);
        }
        delay(3000);  //暂停大约3s后开始下一轮
    }
}

效果

效果

移屏只移3个字符距离,所以并没有把第二行的K显示出来。


结语

这次单讲LCD的入门应用,送给不爱看春晚的你。前两天搞定了科二考试,年后准备科三了。《扯单》系列的一周目大概还差两三篇就完结了,下集预告:串口应用。好了,看完文章实践实践后就该打麻将打麻将,该放炮仗放炮仗吧!总之大家吃好玩好。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 1、嵌入式系统的定义 (1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本...
    荣卓然阅读 1,745评论 0 5
  • 什么是嵌入式 IEEE(Institute of Electrical and Electronics Engin...
    Leon_Geo阅读 3,606评论 1 20
  • 51单片机控制LCD1602模块 视频地址:LCD1602视频 (1)LCD1602概述 先来看看LCD1602什...
    ppptalk阅读 4,520评论 3 14
  • " 前方有人晕倒了,现场环境安全,我具备急救知识,我是救护员,请大家为我作证。" "同志 同志 你怎么...
    JINJIN哈哈哈阅读 502评论 0 0
  • 我个人写作一般还是在电脑上进行。因为最近参加打卡活动,我觉得先关注然后投稿就比较容易找到想要投稿的专题。 但当我对...
    李福东阅读 759评论 0 1