当前进展:

一、我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用、积木化、功能重组的智能硬件模块构想

二、别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的!

三、MCU选型:如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢?

四、温湿度传感器DHT11驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(四)——初尝试·把温湿度给收集了(上)!

五、温湿度传感器DHT11驱动封装(中):如何为编程爱好者设计一款好玩的智能硬件(五)——初尝试·把温湿度给收集了(中)!

六、温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)!

七、点阵字符型液晶显示模块LCD1602驱动封装(上)

  

  前几节我们封装好了一个可以采集数据的传感器驱动,接下来两节将介绍一个非常简单的LCD液晶屏,即显示模块的驱动封装。——有采集有显示,才好!考虑刚开始,所以本节介绍一种最常用的液晶屏:LCD1602

· 模块简介

  该模块总共有16个引脚,显示字符为16X2行。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用符号和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母'A'的代码是41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母'A'了。因为1602识别的是ASCII码,可以直接用ASCII码直接赋值。

引脚及功能

  456为控制线,DB0~7为8位数据线,3为为调节对比度的(过小会导致文本不清晰,过大会导致背景掩盖文本)

   

驱动器接口说明(HD44780)

  无论是TFT\LCD\OLCD等都会有一个驱动器,简单理解就是屏幕和控制CPU直接的一个桥梁,该桥梁规定发送什么格式的命令能达到某种效果~此外,一般这种驱动对于类似的显示器时相似的!这里用的是HD44780驱动芯片。

1、基本操作时序:

1.1 读状态:输入:RS=L,RW=H,E=H            输出:D0~D7=状态字
1.2 写状态:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲  输出:无

1.3 读数据:输入:RS=H,RW=H,E=H            输出:D0~D7=数据

1.4 写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲   输出:无

2、状态字说明:

   注:对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0

3、RAM地址映射图

  控制器内部带80X8位(80字节)的RAM缓冲区,对应下图关系为:(因为这个是16X2行的,所以只用了其中一部分)

 4、指令说明

  显示模式设置:    00111000  设置16X2显示,5X7点阵,8位数据接口

  显示开关光标设置:  00001DCB  D=1 开显示;D=0 关显示

                     C=1 显示光标;C=0 不显示光标

                     B=1 光标闪烁;B=0 光标不闪

             000001NS  N=1 当读或者写一个字符后地址指针加一,且光标加一

                     N=0 当读或者写一个字符后地址指针减一,且光标减一

                     S=1 当写一个字符,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而整个屏幕移动的效果

                     S=0 当写一个字符,整个屏幕不移动

  数据控制:      控制器内部设有一个数据地址指针,用户可通过它们来访问内部全部80字节RAM

  数据指针设置:    80H+地址码(0-27H,40H-67H) 

  其他设置:      01H      显示清屏

             02H      显示回车

  初始化过程(复位过程):      ① 延时15ms

                    ② 写指令38H(不检测忙信号)

                    ③ 延时5ms

                    ④ 写指令38H(不检测忙信号)                  

                        ⑤ 延时5ms

                          ⑥ 写指令38H(不检测忙信号)

                        ⑦ (以后每次写指令、读/写数据操作之前均需要忙检测信号)

                        ⑧ 写指令38H:显示模式设置

                        ⑨ 写指令08H:显示关闭

                        © 写指令01H:显示清屏

                        ® 写指令06H:显示光标移动设置

                        〇 写指令0CH:显示开及光标设置

常用链接方式

时序图

读操作时序图

写操作时序图

时序参数表

· 基于51平台的DEMO

下面是基于51平台LCD1602显示静态文本的例子,其连线按照“引脚与功能”左图的方式进行连接,效果如下:

注:看下面代码,注意重点看我加粗的地方~不同颜色表示不同功能块的部分~

 /**********************BST-V51实验开发板例程************************
* 平台:BST-V51 + Keil U3 + STC89C52
* 名称:1602基本驱动的代码
* 公司:深圳市亚博软件开发有限公司
* 淘宝:bstmcu.taobao.com
* 日期:2012-8-12
* 晶振:11.0592MHZ
* 说明:免费开源,不提供源代码分析.
******************************************************************/ //实验目的:
/*-----------------------------------------------
名称:LCD1602
内容:通过标准程序静态显示字符
引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h> sbit RS = P1 ^ ; //定义端口
sbit RW = P1 ^ ;
sbit EN = P2 ^ ; #define RS_CLR RS=0
#define RS_SET RS=1 #define RW_CLR RW=0
#define RW_SET RW=1 #define EN_CLR EN=0
#define EN_SET EN=1 #define DataPort P0 /*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{ while(t--)
{
//大致延时1mS
DelayUs2x();
DelayUs2x();
}
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
66 bit LCD_Check_Busy(void)//蓝色的几个忙检测、写数据和写命令是根据上面《驱动器接口说明》中的第一条和读写时序图写成的
{
DataPort = 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
79 void LCD_Write_Com(unsigned char com)
{
while(LCD_Check_Busy()); //忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
92 void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort = Data;
_nop_();
EN_CLR;
} /*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs();
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x, unsigned char y, unsigned char *s)
{
if (y == )
{
LCD_Write_Com(0x80 + x); //表示第一行
}
else
{
LCD_Write_Com(0xC0 + x); //表示第二行
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x, unsigned char y, unsigned char Data)
{
135 if (y == 0)//根据Y的值确定显示在哪一行,不同行RAM地址不一样
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
145 /*------------------------------------------------和《4、指令说明》的启动阶段描述一样
146 初始化函数
147 ------------------------------------------------*/
148 void LCD_Init(void)
149 {
150 LCD_Write_Com(0x38); /*显示模式设置*/
151 DelayMs(5);
152 LCD_Write_Com(0x38);
153 DelayMs(5);
154 LCD_Write_Com(0x38);
155 DelayMs(5);
156 LCD_Write_Com(0x38);
157 LCD_Write_Com(0x08); /*显示关闭*/
158 LCD_Write_Com(0x01); /*显示清屏*/
159 LCD_Write_Com(0x06); /*显示光标移动设置*/
160 DelayMs(5);
161 LCD_Write_Com(0x0C); /*显示开及光标设置*/
162 }

/*------------------------------------------------
主函数
------------------------------------------------*/
void main(void)
{
LCD_Init();
LCD_Clear();//清屏
while ()
{
LCD_Write_Char(, , 'o');
LCD_Write_Char(, , 'k');
LCD_Write_String(, , "Hard Work");
while();
}
}

小结&接下来计划:

  下一节将把LCD1602的驱动改写成便于移植的版本,同时讨论一些稍微炫一点的效果——滚动、光标等待等。两周内计划是:再研究一个按键的驱动、一个通信的驱动之后就着手写我们的“X-积木”OS了。

@beautifulzzzz

  2015-9-20 持续更新中~

如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上)的更多相关文章

  1. 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  2. 如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  3. 如何为编程爱好者设计一款好玩的智能硬件(十)——无线2.4G通信模块研究·一篇说完

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  4. 如何为编程爱好者设计一款好玩的智能硬件(三)——该选什么样的MCU呢?

    一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计硬件积木的! ...

  5. 程序员编程利器:20款最好的免费的IDEs和编辑器

    程序员编程利器:20款最好的免费的IDEs和编辑器 还没转眼明年可就大年三十了,忙的可真是晕头转了个向,看着亲朋好友们那让人欣羡的小肚腩,不禁感慨,岁月是一把猪饲料,绿了芭蕉,肥了那杨柳小蛮腰,可怜我 ...

  6. IOS开发入门教程-总结篇-写给狂热的编程爱好者们

    程序发轻狂,代码阑珊,苹果开发安卓狂!--写给狂热的编程爱好者们 写在前面的话 学习iOS应用程序开发已有一段时间,最近稍微闲下来了,正好也想记录一下前阶段的整个学习过程.索性就从最基础的开始,一步一 ...

  7. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  8. 五款好玩又好用的Linux网络测试和监控工具

    五款好玩又好用的Linux网络测试和监控工具 [51CTO精选译文]在这篇介绍几款Linux网络测试实用工具的文章中,我们使用Bandwidthd.Speedometer.Nethogs.Darkst ...

  9. 如何从零开始设计一款漂亮的移动APP?

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 我13岁时开始学习平面设计.我从网上课程学会了设计网站,并习惯于全天使用Photoshop和Affi ...

随机推荐

  1. MFC - 微软基础类库和框架

    一 MFC的概念和作用 1 什么是MFC?? 全称 Microsoft Foundation Class Library我们称之为微软基础类库 1)从硬盘的存在形式上来说 MFC就是一个库(静/动态库 ...

  2. UWP中GridView右击选中的实现

    问题帖子 https://social.msdn.microsoft.com/Forums/windowsapps/en-US/68d0e47d-c974-47b9-a6b8-d55b4989d732 ...

  3. [PL/SQL] 如何规避异常ORA-01403

    如果mytable表中不存在 ID = 123 的数据,那么 SELECT Flag INTO flag FROM mytable WHERE ID = 123 将抛出异常ORA-01403 SELE ...

  4. C语言小练习一

    题目要求:国王将金币作为工资,发放给忠诚的骑士.第1天,骑士收到一枚金币:之后两天(第2天和第3天)里,每天收到两枚金币:之后三天(第4.5.6天)里,每天收到三枚金币:之后四天(第7.8.9.10天 ...

  5. JavaScript-cookie是客户端本地,持久存储用户私密数据的文件

    navigator:封装浏览器配置信息的对象 cookieEnabled:判断浏览器是否启用cookie cookie是什么:cookie是客户端本地,持久存储用户私密数据的文件 plugins:包含 ...

  6. 老毛桃u盘装系统制作工具

    老毛桃[url=http://www.laomaotao.cn.com/]一键u盘装系统下载[/url]告别繁琐,简单易用,一盘两用,携带方便.不需要任何技术基础,一键制作,自动完成制作,平时当U盘使 ...

  7. [LeetCode]436 Find Right Interval

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  8. PowerPoint

    工具/原料 PowerPoint 2007 百度经验:jingyan.baidu.com 一.PowerPoint2007基础知识 1 桌面快捷方式:也可以“开始”菜单→程序→Microsoft Of ...

  9. 初学python第一天

    在学习了c++,java后自己又找到一门面向对象的技术.没错,它就是python.首先介绍一下自己所用的python版本,自己在Python官网http://www.python.org下载了IDLE ...

  10. Jetty源码分析(一)

    一.目的 1.了解jetty组成架构: 2.学习jetty启动过程: 3.学习请求访问过程: 4.学习jetty内各模块作用,学习各模块内部代码: 二.jetty版本 本文所学习的jetty版本为:9 ...