51单片机 | 实现SMC1602液晶屏显示实例
————————————————————————————————————————————
LCD1602
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 1602的意思是每行显示16个字符,一共可以显示两行。如果是12232液晶(图形型液晶)则表示由122列32行组成,即共有122*32个点
- p.s.注意使用温度,通常液晶的工作范围为0~+55℃,存储温度范围为-22~+60℃。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
引脚情况:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
基本操作时序:
|
状态 |
输入 |
输出 |
|
读状态 |
|
|
|
读数据 |
|
|
|
写指令 |
|
无 |
|
写数据 |
|
无 |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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液晶屏显示实例的更多相关文章
- 单片机中不带字库LCD液晶屏显示少量汉字
单片机中不带字库LCD液晶屏如何显示少量汉字,一般显示汉字的方法有1.使用带字库的LCD屏,2.通过SD 卡或者外挂spi flash存中文字库,3.直接将需要的汉字取模存入mcu的flash中. 第 ...
- 51单片机I/O口直接输入输出实例(附调试及分析过程)
51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...
- 51单片机 | I/O口直接输入输出实例
51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...
- 51单片机 | 并行I/O口扩展实例(74LS244/74LS373/4071)
并行I/O口扩展实例 //<51单片机原理及应用(第二版)——基于Keil C与Proteus>第四章例4.4 I/O口不能完全用于输入/输出操作,当需要扩展外部存储器时,P0.P2口用作 ...
- 51单片机 | A/D转换器实现数字电压表实例
———————————————————————————————————————————— ADC0809 - - - - - - - - - - - - - - - - - - - - - - - - ...
- 使用Python控制1602液晶屏实时显示时间(附PyCharm远程调试)
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文介绍一下UP板的GPIO资源使用,以及一个使用Python演示一个简单的demo. 本文使用Markdown写成,为获得更好的 ...
- ESA2GJK1DH1K升级篇: 升级STM32 预热: 单片机定时 使用 http 获取云端文本文件里面的内容,然后显示在液晶屏
前言: 实现功能概要 STM32使用AT指令控制Wi-Fi以TCP方式连接咱上节安装的Web服务器,然后使用http的get协议获取云端文本文件里面的内容, 然后把获取的数据显示在OLED液晶屏. ...
- 51单片机实现对24C02进行页写、顺序读取并显示验证
//************************************************************************************* //**程序名称:51单 ...
- 51单片机—LCD1602显示模块
文章目录 - 什么是LCD1602 - 如何操作LCD1602 - 上代码 - 什么是LCD1602 LCD:Liquid Crystal Display-液晶显示器,简称LCD,其主要显示原理是以电 ...
随机推荐
- 在C中就是字符'\r';换行是<lf>,是字符'\n'。
在C中就是字符'\r':换行是<lf>,是字符'\n'.
- UVA 10801 Lift Hopping 最短路
2种方式直接代码就可以了.注意首次不需要60S的转换 #include <map> #include <set> #include <list> #include ...
- MyBatis学习总结(一)mybatis与spring整合
MyBatis学习总结(一)mybatis与spring整合 一.需要的jar包 1.spring相关jar包 2.Mybatis相关的jar包 3.Spring+mybatis相关jar包 4.My ...
- Spring Cloud之分布式配置中心
用服务的方式来实现 ConfigAppApplication.java package com.packtpub.ConfigApp; import org.springframework.boot. ...
- 使用iframe实现页面无刷新提交表单
iframe提交表单其实比ajax要方便一些,当然ajax也有ajax的好处,只是ajax编码处理有时有些麻烦,虽然经过转码是可以解决中文问题,但如果直接使用iframe不存这些问题了,下面来看看. ...
- (1)powershell使用帮助
一.更新下载帮助 初始powershell是没有文档的,需要用指令更新下载到本地 管理员运行 update-help 好像有的模块需要FQ才能下载 ?? 帮助文档的开源地址 github.com/p ...
- android okhttp3
一. 传键值对 public String webLogin() { String responseData = null; OkHttpClient client = new OkHttpClien ...
- Xamarin XAML语言教程通过ProgressTo方法对进度条设置
Xamarin XAML语言教程通过ProgressTo方法对进度条设置 在ProgressBar中定义了一个ProgressTo方法,此方法也可以用来对进度条当前的进行进行设置,ProgressTo ...
- [Contest20180418]数学竞赛
题意:初始时$x=0$(长度),当$x$为长度时,你可以把$x$变成$\sin^{-1}x,\cos^{-1}x,\tan^{-1}x$之一($x$变为角度),若$x$为角度,你可以把$x$变成$\s ...
- 为添加了自定义域名的GitHub Pages添加SSL,启用强制HTTPS(小绿锁)
直奔主题 为什么要使用https协议? 提高网站访问安全性,网络连接都是加密的 (PS:虽然SSL并不是无懈可击的,但是我们应该尽可能提高窃听成本). 目前越来越多的浏览器会判断当前站点支不支持htt ...