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,其主要显示原理是以电 ...
随机推荐
- 编程中的runtime_error问题
前几天在编程中,代码如下: 头文件:ErrorHandlingModule.h //filename:ErrorHandlingModule.h #ifndef ErrorHandlingModule ...
- C++ emplace_back
在C++开发过程中,我们经常会用STL的各种容器,比如vector,map,set等,这些容器极大的方便了我们的开发.在使用这些容器的过程中,我们会大量用到的操作就是插入操作,比如vector的pus ...
- unicode和utf8之间的关系
,字符编码是计算机技术的基石,想要熟练使用计算机,懂得一点字符编码的知识,还是很有必要的. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit ...
- 本地虚拟机在ubuntu系统搭建nexus服务器
本地虚拟机在ubuntu系统上搭建nexus服务器 本地虚拟机在ubuntu系统上搭建nexus服务器所需软件: 虚拟机:VM或者Oracle VM VirtualBox 系统:ubuntu-14.0 ...
- J.U.C并发框架源码阅读(八)ArrayBlockingQueue
基于版本jdk1.7.0_80 java.util.concurrent.ArrayBlockingQueue 代码如下 /* * ORACLE PROPRIETARY/CONFIDENTIAL. U ...
- codebolcks设置自动补全[转]
熟悉使用一些开发类IDE的朋友对代码自动补全一定印象深刻,如Visual studio,eclipse等,我们在程序中定义的那一个个超长的变量函数名只需打出几个字母就可自动补全,但是在codebloc ...
- ACdream1032(树形DP)
ACdream1032 题意 给出一棵树,每个节点有权值,问由 \(1\) ~ \(n\) 个节点组成的树块的权值和的最小值. 分析 首先发现 \(n\) 很小,那么我们可以开一个二维数组 \(dp[ ...
- C++ 二位数组做参数传递
指针的强大功能,,,,简直牛逼!!! #include<iostream> #include<cstdio> #include<map> using namespa ...
- ST表【p1311】 选择客栈
题目描述 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0~k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
- UIPanGestureRecognizer判断滑动的方向
.h文件 CGFloat const gestureMinimumTranslation = 20.0 ; typedef enum : NSInteger { kCameraMoveDirectio ...