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

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. switch与if 性能测试

    测试结果:switch性能更高. 测试过程:新建一个Win32 Console Application, 在cpp文件中添加下面代码 #include "stdafx.h" #in ...

  2. xCode中去除“Implicit declaration of function 'sysctl' is invalid in C99” 警告

    http://blog.csdn.net/dreambegin/article/details/8609121 一般出现该问题是因为通过C调用了unix/linux 底层接口,所以需要调整c语言的编译 ...

  3. Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】

    转自:http://blog.csdn.net/yikai2009/article/details/8653697 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 阻塞 阻 ...

  4. ACL权限引发的403 Forbidden

    403 Forbidden查看nginx用户 getfacl 查看url实际对应的目录地址.检查权限是否授权有问题,特别是mask mask是最大权限控制查看权限是否有nginx用户以及mask权限, ...

  5. RobotFramework自动化4-批量操作案例【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/robotframework/ 前言 有时候一个页面上有多个对象需要操作,如果一个个去定 ...

  6. Laravel中ajax添加CsrfToken的方法

    //在模板文件的header头中添加 <meta name="_token" content="{{ csrf_token() }}"/> //aj ...

  7. AC日记——[WC2013]糖果公园 cogs 1817

    [WC2013]糖果公园 思路: 带修改树上莫队(模板): 来,上代码: #include <cmath> #include <cstdio> #include <cst ...

  8. (转)Ubuntu安装g++-4.8

    sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install g++-4.8 ...

  9. HDOJ 1300 Pearls 斜率优化dp

    原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1300 题意: 题目太长了..自己看吧 题解: 看懂题目,就会发现这是个傻逼dp题,斜率优化一下就好 代 ...

  10. 分享 | 自定义属于自己的U盘图标

    文章目录 步骤 注意 想不想也可以自定义自己的U盘图标?其实,这并不难 步骤 在网上下载ICO格式的图标,也可以将自己喜欢的图片转换成ICO格式,并将图片命名为demo.ico: 点击这里打开记事本, ...