这一小节写一个比较简单的显示屏LCD1602的驱动方法。

引脚功能图:

 电压一般接5V。

简单说一下LCD的驱动流程:主要分为两部分,1、写指令,2.写数据。

写指令的作用主要是设置LCD的工作模式指定显示的位置。写数据就是在指定的位置显示字符

那么如何写呢?

LCD就是通过这些引脚的状态来判断你写入的那一串数字是指令还是数据的。

 因为我们一般是用LCD来显示,所以基本上不会去读状态、读数据。所以只要看写指令输入和写数据输入就行了。

---------------------------------------------------------------------------------------------------------------------------------

以下了解即可:

注意需要短暂延时。

---------------------------------------------------------------------------------------------------------------------------------

那么如何在屏幕的某一个位置上显示呢?

1、首先是设置工作模式。

先看一下控制流程。

 1、通过RS引脚确定是写数据还是写指令。

2、读写控制端(RW)设置为写模式。

3、把数据或指令送到数据线上。(D0~D7)

4、给E一个高脉冲,将数据送入液晶控制器。

下面几张图是指令码的说明。

初始化主要涉及4个指令码

分别是: 0X38 0X0C 0X06  0X01

2、指定显示位置

上图就是LCD1602的定位的方法,只要往00~0F、40~4F这个范围的地址里写入字符数据就可以直接显示。(往10~27 、50~67这个范围的地址写字符数据后屏幕上不会直接显示,需要通过移屏指令才能在屏幕上显示)

但注意访问指定地址的方法

例如 首先先在写指令状态写入指令码 (0X80+0X40)定位到第二行开头。

然后再在写数据状态写入数据。比如字符  'A'


这里给个例子:

因为这个例子只涉及到写入没有读取,所以这里我把RW直接接地。

ORG 0000H
LJMP MAINDELAY:                ;延时函数,不多解释MOV R6,#05H
W2:     MOV R7,#0EFH
W1:     DJNZ R7,W1DJNZ R6,W2RET;写指令函数,调用它之前先把指令码放到R0中
WRITE_COM:CLR P3.5       //RS=0MOV P0, R0       //R0 中放入指令代码ACALL DELAYSETB P3.4        //LCDEN =1ACALL DELAYCLR P3.4RET;写数据函数,调用它之前先把数据放到R1中
WRITE_DATA:SETB P3.5MOV P0, R1     //R1中放入数据代码ACALL DELAYSETB P3.4       //LCDEN =1ACALL DELAYCLR P3.4RET;初始化函数
INIT:CLR P3.4MOV  R0,#0MOV R1 ,#0MOV R0, #38H            ;指令码1 0X38ACALL WRITE_COMMOV  R0,#0MOV R0,#0CH            ;指令码2 0X0CACALL WRITE_COMMOV  R0,#0MOV R0,#06H            ;指令码3 0X06ACALL WRITE_COMMOV  R0,#0MOV R0,#01H            ;指令码4 0X01ACALL WRITE_COMRET;主函数
MAIN:ACALL INIT                ;调用初始化函数MOV  R0,#0MOV R0,#80H                ;定位到LCD1602的第一行开头            ACALL WRITE_COMACALL DELAY                ;注意要短暂延时MOV R1,#0MOV R1,#'I'                ;写入数据, 字符‘I’ACALL WRITE_DATAACALL DELAYMOV R1,#'A'ACALL WRITE_DATAACALL DELAYMOV R1,#'Y'ACALL WRITE_DATAACALL DELAYMOV R0,#0MOV R0 ,#0C0H                ;定位到LCD1602的第二行开头,0X80+0X40=0XC0ACALL WRITE_COMACALL DELAYMOV  R1,#0MOV R1,#'3'                ;写入数据 , 字符 ‘3’ACALL WRITE_DATAACALL DELAYJMP $                    END

这里的例子是在指定位置显示某个字符。如果想要显示字符串怎么办呢?在C语言中一般会用数组。那么在汇编里我们可以用定义列表的方法来实现(查表法)。当然还涉及到循环结构。

关于列表法在之前的文章“51单片机汇编学习笔记——IO口的输出” 里面有讲。

51单片机汇编学习笔记5——IO口输出_DIJIANG321的博客-CSDN博客

字符串显示代码:

ORG 0000H
LJMP MAINDELAY:MOV R6,#05H
W2:     MOV R7,#0EFH
W1:     DJNZ R7,W1DJNZ R6,W2RETWRITE_COM:CLR P3.5        //RS=0MOV P0, R0       //R0 中放入指令代码ACALL DELAYSETB P3.4        //LCDEN =1ACALL DELAYCLR P3.4RETWRITE_DATA:SETB P3.5MOV P0, R1     //R1中放入数据代码ACALL DELAYSETB P3.4         //LCDEN =1ACALL DELAYCLR P3.4RETINIT:CLR P3.4MOV  R0,#0MOV R1 ,#0MOV R0, #38HACALL WRITE_COMMOV  R0,#0MOV R0,#0CHACALL WRITE_COMMOV  R0,#0MOV R0,#06HACALL WRITE_COMMOV  R0,#0MOV R0,#01HACALL WRITE_COMRETMAIN:MOV R3,#14                ;字符串长度MOV DPTR ,#TABCLR AACALL INITMOV  R0,#0MOV R0,#80H               ;定位到LCD1602第一行开头ACALL WRITE_COMACALL DELAY
L1:   MOVC A,@A+DPTR          ;循环结构MOV R1,AACALL WRITE_DATAACALL DELAYINC DPTRCLR ADJNZ R3,L1JMP $TAB: DB "I HAVE A APPLE"            ;数据块END

电路图没变,和上面一样。

仿真结果:

------------------------------------------结束--------------------------------------------------------------------------------

51汇编——LCD1602显示相关推荐

  1. 基于51单片机LCD1602显示

    基于51单片机LCD1602显示 要在1602上显示字符,要大概明白1602液晶显示屏工作原理. 一般的液晶显示器(Liquid Crystal Display, LCD) 的主要原理是以电流刺激液晶 ...

  2. Proteus8仿真:51单片机LCD1602显示

    51单片机LCD1602显示 元器件 原理图部分 代码 main.c 工程文件 元器件 元器件 名称 排阻 RESPACK-8 51单片机 AT89C51 LCD1602 LM016L 按键 BUTT ...

  3. 【优秀课设】51单片机LCD1602显示的温度控制系统设计 包括时间显示 校时、设置最值温度报警功能

    1.将DS18B20温度传感器的温度读出来,并在LCD1602上显示出来. 2.在LCD上分别切换显示,软件设计时钟(时.分.秒),和当前温度值,和温度上下控制值.并可以通过按键进行修改设置,温度高于 ...

  4. 51单片机LCD1602显示电子时钟 带按键设置和星期显示

    当时看书看到lcd那章,就想利用定时器做一个电子时钟,当时也不知道有时钟模块的,以为都是定时器定时产生的时间,也是一个main文件从头到尾的版本,注释倒不少,不要说什么模块化编程和代码优化,想到什么就 ...

  5. 简单易懂的51单片机LCD1602显示protues仿真程序

    时序图  仿真效果  #include"AT89X51.h" typedef unsigned char u8; typedef unsigned int u16;#define ...

  6. 【Proteus仿真】51单片机汇编实现DS18B20+LCD1602显示

    [Proteus仿真]51单片机汇编实现DS18B20+LCD1602显示 Proteus仿真 汇编代码(.asm) ;**************************************** ...

  7. 基于51单片机的电子钟万年历LCD1602显示

    本设计是51单片机的电子钟万年历LCD1602显示(proteus仿真+程序+报告+器件清单) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 编号C0002 ...

  8. 【Proteus仿真】51单片机制作简易计算器+ LCD1602显示

    [Proteus仿真]51单片机制作简易计算器+ LCD1602显示 Proteus仿真效果演示 程序代码 #include<reg51.h> //头文件 #define uint uns ...

  9. 51单片机ADC0832模数转换+ LCD1602显示+Proteus仿真

    51单片机ADC0832模数转换+ LCD1602显示+Proteus仿真 Proteus仿真 在Proteus SP2仿真过程中发现无法读取ADC0832的数据.解决办法:在proteus安装目录下 ...

最新文章

  1. 微信生态增长:裂变与分销讲解
  2. Python高级网络编程系列之第二篇
  3. python【数据结构与算法】二分模板
  4. Android 一些比较厉害的大牛博客
  5. intellij默认maven仓库配置路径+默认New Project 工程路径
  6. mysql-5.7.11-winx64.zip 安装配置
  7. arcgis投影数据计算度分秒
  8. 鸿蒙系统手机9月11日,鸿蒙系统9月11日,将有望正式成为国际第三大手机操作生态系统...
  9. 远程ykvm 插件移值java_Centos7 命令行下kvm安装windows,linux
  10. C++ class和struct的区别
  11. linux内核实现ipsec,IP XFRM配置示例:利用linux kernel自带的IPSec实现,手动配置IPSec...
  12. 【MySQL】MySQL自带的数据库
  13. 面试题 01.01. 判定字符是否唯一
  14. 说说代码质量、代码安全和软件测试那些事
  15. dev.c drv.c bus.c
  16. java并发编程(3)避免活跃性危险
  17. 广数980系统锁解除密码
  18. linux 解压war到root_解压war包的解压软件 war包可以用解压工具解开吗
  19. 彻底删除BootCamp Windows分区和合并到Mac分区中教程
  20. 无心剑中译阿道司.赫胥黎《冥思月亮》

热门文章

  1. PS2251-68-25+MLC黑片 U盘修复
  2. Egret中使用TiledMap
  3. 用excel计算分布表
  4. c语言小游戏跳一跳代码及注释,如何获得微信小游戏跳一跳源码以及源代码组合包括哪些...
  5. 战地一服务器性能低怎么办,《战地1》帧数优化图文攻略 战地1帧数低怎么办?...
  6. Oracle 分析函数over,列转行函数pivot理解及综合运用(报表中的小计和合计)
  7. (八)Java算法:堆排序(详细图解)
  8. 【数学之美】第三版推荐序二 摘录
  9. Sketch哪个版本好用?
  10. 你是如何学习一项新技术的?