登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] [解决你的1602液晶问题]1602时序问题解析

[复制链接]
发表于 2019-2-2 23:00:09 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机1602显示。
学习安排: 在89系列单片机的基础上研究12系列的如何显示
开始时间: 2019-02-01
结束时间: 2019-02-02
我在学习1602显示模块的时候遇到了问题,就是说按照金沙滩的教程写的程序能在89系列的单片机上完美实现,但是换到了12系列单片机却无法实现,其中的问题主要是在时序上。由于12系列是比89系列更快的单片机,所以牵扯到时序问题,我们必须要考虑单片机的运行速度。只有我们知道了单片机的运行速度我们才好衡量时序问题。89系列单片机是12T的,也就是说89系列的单片机,一个机器周期是12个时钟周期(其实89系列的单片机也可以用6T模式工作,但是默认的是12T,并且在这里没有相关的特殊功能寄存器供我们配置。6T模式的配置是通过上位机软件实现的,也就是说我们在烧写程序的时候,有一个双倍频硬件选项,当我们勾选了这一项之后呢,单片机用定时器就会按照6T工作模式运行)。时钟周期就是我们所说的晶振的频率分之一秒。关于机器周期的解释呢,也就是说在计算机中为了便于管理,我们常把一条指令的执行过程划分为若干阶段,每一个阶段完成一项工作,比如说取指令-存储器读-存储器写,它的每一项工作成为一个基本操作,那么完成一个基本操作所需要的时间称为机器周期,对于单片机来说呢也是这样。stc12系列是1T单片机,那么也就是说它的机器周期是一个时钟周期,大概是30ns,这个30ns呢,它是非常快的,那么在考虑时序问题的时候,89系列单片机不用考虑的东西,我们在这里要仔细考虑,因为12系列比89系列快了太多太多。我们根据时序图分析我们的程序要怎样写才能满足它的时序要求。我们以写操作举例(写数据/写指令):首先说一下我是怎样理解失去这个概念的,我的理解下时序就是按一定时间顺序发生特定的事情。我们看着时序图,目光从图的左端往右端看,因为时序图它就是从左往右,先后发生的顺序。目光往右边移动就相当于时间的流逝,我们先看见什么说明先发生什么,后看见什么,说明后看见发生了什么。就比如说1602的写时序图,先看到对RS,Rw,DB0-DB7操作,再看到对E端操作,接着又看到对E端操作,最后看到对RS,Rw,DB0-DB7的再次操作,我们就按这些事件发生的顺序来写程序就可以了,但是每一个事件之间间隔的时间是有要求的,具体的要求我们看时序参数表。我们先按时间发生顺序,“把主干的操作写到程序里去,然后再通过调整每个语句之间的时间,来满足它的时序参数要求。”调整的方法可以用加入延时函数。就比如这个写操作,我们先写出如下代码[mw_shl_code=c,true]LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E  = 1;
LCD1602_E  = 0;[/mw_shl_code]金沙滩教程用的89系列的单片机,可以这样直接写上去,完全满足时序要求,但是我们的单片机如果这样写的话是无法正常显示的。[mw_shl_code=c,true] LCD1602_RS = 0;
    LCD1602_RW = 0;
        LCD1602_DB = cmd;[/mw_shl_code]单片机对这三条指令做完之后,要求最少30ns才可以对E拉高,由于指令执行之后,我们单片机无法马上准备好各引脚的状态,所以此时我们可以插入一个1us的延时,过了这个延时,再对E引脚操作。当一脚被拉高之后呢,如果此时不在插入一个延时的话,是无法达到最短150ns的要求,所以再插入一个一微秒的延时。直到此处,我们的代码写成如下的样子:[mw_shl_code=c,true]   LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
        LCD1602_DB = cmd;
    Delay1us();
        LCD1602_E  = 1;//读取状态字
        Delay1us();
    LCD1602_E  = 0;[/mw_shl_code]这个时候呢,就完全满足了时序参数的要求。这时候我们重新改一下程序,下载到12系列单片机中,可以正常显示。我也准备了几张时序不达要求的结果(延时不足等情况)对于延时呢,我们没有必要要求毫秒的延时,有微秒已经足够了,当然还可以更精确‘更充分利用单片机,我们在本征函数库里可以发现_nop_函数,这个函数也就是相当于延时一个机器周期,也就是30ns,在使用这个函数的时候要加一个头文件,#include <intrins.h>。工程我打包了在附件里。
关于这个问题呢,我觉得比较重要的有:
你怎样理解时序这个概念,不同的人可能有不同的理解方式,只要对就可以;
还有一点就是我们怎样估计我们单片机的速度(算出一个机器周期大约为30ns),这就要根据数据手册的说明(1T/单时钟);
看好时序参数。



时序图.png
时序参数表.png
IMG20190202225324.jpg
IMG20190202225407.jpg

# LCD1602.rar

27.52 KB, 下载次数: 740

好懒~~不想说~~~
 楼主| 发表于 2019-2-19 22:57:30 | 显示全部楼层
关于STC ISP软件的介绍,stc12单片机的技术手册里很详细,大家可以了解一下
好懒~~不想说~~~
 楼主| 发表于 2019-2-3 12:24:44 | 显示全部楼层
给大家补充一点,就是说我们这个12系列单片机虽然是1T单片机,但是当我们用定时器的时候,它默认是按照12T自动加一,当然你可以用相应的特殊功能寄存器来配置它,让他1T加一
好懒~~不想说~~~
发表于 2019-2-17 23:22:06 | 显示全部楼层
使用定时器的时候可以用stcISP软件的附加功能来配置寄存器,方便且准确。
Carpe.Diem.
 楼主| 发表于 2019-2-19 22:56:23 | 显示全部楼层
本帖最后由 林雨 于 2019-2-20 10:55 编辑
如果让他嘎斯 发表于 2019-2-17 23:22
使用定时器的时候可以用stcISP软件的附加功能来配置寄存器,方便且准确。


嗯嗯,其实大家可以认真观察那个软件的界面,上面很多选项大家可以看一下,说不定会在什么时候帮到你。
好懒~~不想说~~~
发表于 2019-2-20 08:16:18 | 显示全部楼层
林雨 发表于 2019-2-19 22:57
关于STC ISP软件的介绍,stc12单片机的技术手册里很详细,大家可以了解一下

你试没试nop函数,我在延时的地方加了十几个,才起到作用,理论来说不应该呀
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表