————————————————————————————————————————————

LCD1602

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

  • 1602的意思是每行显示16个字符,一共可以显示两行。如果是12232液晶(图形型液晶)则表示由122列32行组成,即共有122*32个点
  • p.s.注意使用温度,通常液晶的工作范围为0~+55℃,存储温度范围为-22~+60℃。

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

引脚情况:

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

基本操作时序:

状态

输入

输出

读状态

  • RS=0
  • R/W=1
  • E=1
  • D0~D7=状态字

读数据

  • RS=1
  • R/W=1
  • E=1
  • D0~D7=数据

写指令

  • RS=0
  • R/W=0
  • E=1
  • D0~D7=指令码
  • E=1

写数据

  • RS=1
  • R/W=0
  • E=1
  • D0~D7=数据
  • E=1

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

RAM内部映射:80个字节

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

状态字说明://状态字反应了当前液晶屏的情况,当STA7为1时说明显示器正在忙碌状态,不可进行操作

  • STA0~STA6表示当前地址指针的数值
  • STA7表示读/写使能,=1表示进制,=0表示允许

    p.s.原则上每次对控制器读写操作之前都必须进行读写检测,确保STA7=0,实际操作中由于单片机操作速度慢于液晶控制的反应速度,可以不进行读写检测而只进行简短的延时。

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

数据指针设置:

用户可以通过以下的数据地址指针访问内部的80个字节RAM,用来设置数据地址

80H+地址码(0~27H,40~67H)

例:对第一个地址进行操作,0x80+0x01

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

其他指令码:

01H

显示清屏(数据指针清零,所有显示清零)

02H

显示回车(数据指针清零)

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

初始化:

  • 显示模式设置:38H

  • 显示开/关及光标设置

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

读写操作时序:

  • 读操作

  • 写操作

  • 操作时间参数

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

操作方式:

  • 对LCD的操作可以分为数据和指令两部分。
  • 通过操作RS,R/W,E,执行四种操作:读状态,读数据,写指令,写数据
  • D0~D7用来输入输出指令码和数据

————————————————————————————————————————————

LCD1602使用实例:

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

设计要求:

使用LCD1602显示两行字符,显示两行字,两个按键控制着显示或清屏

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

设计思路:

  • 初始化液晶显示屏 //参照上文"初始化"
    • 打开使能
    • 指令码操作
      • 设置16*2显示,5*7点阵,8位数据结构
      • 开显示,显示光标,不闪烁
      • 读写完字符后地址指针+1,光标+1,整屏显示不移动
      • 清屏
      • 设置地址显示的首字符
  • 初始化中断
    • 打开中断
    • 外部中断0和1
  • 死循环等待中断
  • 按键中断
    • 按键"显示"
      • 循环写入数据(字符数组)
      • 指令"换行"
      • 循环写入第二行数据
    • 按键"清屏"
      • 指令"清屏"
  • 子函数 //参照上文"读写操作时序表"
    • 写数据
    • 写指令

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

实现代码:

 #include <reg52.h>
typedef unsigned char uchar;
sbit en = P3 ^ ;
sbit rs = P3 ^ ;
uchar code table1[] =
{
"SMC1602 0x01..."
};
uchar code table2[] =
{
" Hugh Dong."
};
void Delay(uchar m)
{
uchar i, j;
for (i = m; i > ; --i)
for (j = ; j > ; --j);
}
/* 写数据 */
void write_date(uchar date)
{
//参考写操作时序图
rs = ; //RS高电平,写数据
P2 = date; //写入数据,对应时序图t_SP2数据建立
Delay();
en = ; //打开使能,给E一个高脉冲,开始写入数据
Delay();
en = ; //关闭使能,写入数据完成
}
/* 写指令 */
void write_com(uchar com)
{
//基本原理同写数据
rs = ; //RS低电平,写指令
P2 = com;
Delay();
en = ;
Delay();
en = ;
}
/* 初始化LCD */
void Init()
{
en = ;
write_com(0x38); //00111000 设置16*2显示,5*7点阵,8位数据接口
write_com(0x0E); //00001110 开显示,显示光标,不闪烁
write_com(0x06); //00000110 读写字符后地址指针+1,光标+1,屏幕不移动
write_com(0x01); //清屏
write_com(0x80 + 0x01); //设置数据地址指针从第一个开始
}
int main()
{
/* 初始化LCD */
Init();
Delay();
/* 初始化中断 */
EA = ;
EX0 = ;
EX1 = ;
/* 死循环 */
while();
}
void Display()interrupt using
{
uchar i;
for (i = ; i < ; ++i) //遍历逐个写入第一行数据
{
write_date(table1[i]);
Delay();
}
write_com(0x02); //换行
write_com(0x80 + 0x40); //数据地址指针指向第二行
for(i = ; i < ; ++i) //逐个遍历写入第二行数据
{
write_date(table2[i]);
Delay();
}
}
void Clear() interrupt using
{
write_com(0x01);
}

51单片机 | 实现SMC1602液晶屏显示实例的更多相关文章

  1. 单片机中不带字库LCD液晶屏显示少量汉字

    单片机中不带字库LCD液晶屏如何显示少量汉字,一般显示汉字的方法有1.使用带字库的LCD屏,2.通过SD 卡或者外挂spi flash存中文字库,3.直接将需要的汉字取模存入mcu的flash中. 第 ...

  2. 51单片机I/O口直接输入输出实例(附调试及分析过程)

    51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...

  3. 51单片机 | I/O口直接输入输出实例

    51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...

  4. 51单片机 | 并行I/O口扩展实例(74LS244/74LS373/4071)

    并行I/O口扩展实例 //<51单片机原理及应用(第二版)——基于Keil C与Proteus>第四章例4.4 I/O口不能完全用于输入/输出操作,当需要扩展外部存储器时,P0.P2口用作 ...

  5. 51单片机 | A/D转换器实现数字电压表实例

    ———————————————————————————————————————————— ADC0809 - - - - - - - - - - - - - - - - - - - - - - - - ...

  6. 使用Python控制1602液晶屏实时显示时间(附PyCharm远程调试)

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文介绍一下UP板的GPIO资源使用,以及一个使用Python演示一个简单的demo. 本文使用Markdown写成,为获得更好的 ...

  7. ESA2GJK1DH1K升级篇: 升级STM32 预热: 单片机定时 使用 http 获取云端文本文件里面的内容,然后显示在液晶屏

    前言: 实现功能概要 STM32使用AT指令控制Wi-Fi以TCP方式连接咱上节安装的Web服务器,然后使用http的get协议获取云端文本文件里面的内容, 然后把获取的数据显示在OLED液晶屏.   ...

  8. 51单片机实现对24C02进行页写、顺序读取并显示验证

    //************************************************************************************* //**程序名称:51单 ...

  9. 51单片机—LCD1602显示模块

    文章目录 - 什么是LCD1602 - 如何操作LCD1602 - 上代码 - 什么是LCD1602 LCD:Liquid Crystal Display-液晶显示器,简称LCD,其主要显示原理是以电 ...

随机推荐

  1. 【linux高级程序设计】(第十一章)System V进程间通信 3

    信号量通信机制 可以看到,跟消息队列类似,也是包括两个结构. int semget (key_t __key, int __nsems, int __semflg) : 创建信号量集合 第一个参数:f ...

  2. Selenium2+python自动化4-Pycharm使用【转载】

    前言 在写脚本之前,先要找个顺手的写脚本工具.python是一门解释性编程语言,所以一般把写python的工具叫解释器.写python脚本的工具很多,小编这里就不一一列举的,只要自己用着顺手就可以的, ...

  3. python每日一类(3):os和sys

    os与sys模块的官方解释如下: os: This module provides a portable way of using operating system dependent functio ...

  4. SqlServer高版本数据库数据备份到低版本数据库上

    想要将Sqlserver2014高版本备份的数据还原到低版本SqlServer2012上去,但是这在SqlServer中是没法直接还原数据库的,通过以下方法可以顺利还原. 通过高版本生成sql脚本在低 ...

  5. 基于django rest framework的mock server实践

    网上找了一下mock server的实现,发现python的基本都是基于flask来实现的,因最近在学django,就尝试用drf实现了下: A brief introduction of sui_m ...

  6. C++之++运算符重载问题

    记录++之前先记一下左右值和存取数据的问题 数据的存放分三个部分,堆区,栈区和静态变量区 左值可以更改,右值不能更改 栈区和堆区存储的都是左值,可以随意更改其值,静态变量区部分数据是右值,比如cons ...

  7. Uva 11542 Square

    题目中说数组中的数的最大质因子不超过500,我们筛出≤500的质数,然后考虑对每个质数列一个方程组.. 然后这几乎就是高斯消元求解异或方程组的模板题了.... 注意答案是 2^(自由元数量)-1,因为 ...

  8. [POI2014]Solar Panels

    题目大意: $T(T\le1000)$组询问,每次给出$A,B,C,D(A,B,C,D\le10^9)$,求满足$A\le x\le B,C\le y\le D$的最大的$\gcd(x,y)$. 思路 ...

  9. php的一些语法

    命名空间: 一个类为App/Http/Controllers/Controller,则该类的命名空间为App/Http/Controllers,可以通过use关键字导入该类,也可以导入命名空间,但是该 ...

  10. Struts2笔记--文件下载

    Struts2提供了stream结果类型,该结果类型是专门用于支持文件下载功能的.配置stream类型的结果需要指定以下4个属性. contentType:指定被下载文件的文件类型 inputName ...