列表 上一篇 下一篇

C51单片机驱动LCD想法

从问题开始吧,看linux驱动的时候,从来没有听说过要看看LCD的时序图,而51单片机的驱动LCD时为什么还要看时序图呢??

从计算机的结构说说吧,就是将计算机分为几个部分,如CPU、内存、外设等等,CPU与外设通信就是访问相应的内存,而考虑现在的51单片机呢,几个管脚本身就是内存,而LCD的控制器部分的寄存器也算是内存,所以数据的传输整体上是CPU——》内存——》内存(外设寄存器),其中的一步内存——》内存貌似是错误的,因为一般的都是内存——》CPU——》内存,而这里的内存——》内存的根本没有经过CPU。错在什么地方呢?这里要从CPU——》内存说起了,CPU读取内存的时候是有时序的,也就是书上所说的CPU取数据、取指令的时序图,所以要重新改改驱动程序的定义,在这里严格的把驱动读取外设寄存器、读写数据等等的时序也作为驱动程序,而且在这里C51单片机的读取指令、数据等时序与LCD的时序不同,怎么办呢?这里就通过管脚实现时序的协调,这是的管脚寄存器本身就不算是内存的一部分了,就像在51单片机的扩展模式下,P0、P2也就失去了内存的作用。所以整体上的情况就是,LCD还是外设,也有其控制器,而管脚的作用就是协调LCD控制器的时序。

在这里说明一下,控制器本身只是时序逻辑电路,要想控制还是通过时序的输入去控制的,内存本身就是一个时序逻辑电路,CPU本身也是时序逻辑电路,但是为什么CPU运行的是指令呢(而不是时序驱动的)??因为CPU内部有控制器这一部分,它可以把指令解析为时序信号(所以这里说的CPU内部的控制器与外设的控制器是有区别的,CPU控制器负责产生时序信号,输入到一个时序电路,而外设的控制器也就是一个时序电路)。

为什么读内存的时候不用管时序呢,因为CPU访问内存的时序信号是由CPU内部的控制器产生的,进而来驱动内存控制器(也就是访问内存)。另外各种各样的接口PCI等通过设定频率等来设置其时序,所以CPU在读取这些设备时就不用管时序了,以为CPU控制器读取这些设备的时序信号时对这个接口的,控制器访问设备的时序信号就有接口控制器负责。

另外还可以考虑,单片机开发时通过GPIO模拟某一种接口(如改变GPIO高低电平来模拟串口)。

还要注意STM32F103GPIO管脚与串口管脚的区别,GPIO相当于系统内存,而串口管脚相当于外设的部分。

7段数码管的思考,在思考7段数码管的接口时,想是输入三位二进制数呢、还是输入7个呢?只要考虑到7段数码管内部有没有逻辑部件,问题就迎刃而解了

数字逻辑的一点小知识,锁存器、缓冲器比较,两者最大的区别就是锁存器的输出可以不随输入改变(这也就是锁的意思),从某种程度上来说有了存储器的作用,如何一个7段数码管连用,就可以看做是数码管的内存。缓冲器的作用就不说了,但是这一三态缓冲器的说法,这要是常规缓冲器总是将值直接输出,用在推进电流到高一级的电路系统。三态缓冲器除了常规缓冲器的功能外,还有一个选项卡通输入端,用E表示。当E=0和E=1时有不同的输出值。若E=0,缓冲器被阻止,无论输入什么值,输出的总是高阻态,用Z表示。高阻态能使电流降到足够低,以致于象缓冲器的输出没有与任何东东相连。锁存器的应用参考8282锁存器,因为数据线与地址线是复用的,cpu先发出地址数据,而后发出相应的数据,此时会对地址的0~7的地址位影响(因为与0~7位总线是复用的),所以需要锁存,其实这完全可以在内存内部实现地址的锁存,这样就不用8282来锁存了。这里面就有涉及到寄存器的读写原理了,地址信号相当于使能相应的内存单元,在时钟信号到来时数据进入内存单元,所以地址信号要一直有效,所以地址信号(复用时的数据到来)的改变其实是改变了使能的内存单元,所以需要进行锁存。当然了这就要看内存的时序图了,如果内存的时序图里要求地址信号一直有效的话,就需要自己添加锁存器了,如果不要求有效,就不用锁存器了

对C51单片机设计小系统的一点思考,

比如想制作一个时钟程序,这是就不要想什么通过现有的数字模块来实现可以自动增加(如数字逻辑中所说的计时器实现)并显示的问题,而是怎么通过变量、定时修改变量、显示变量的方法来实现。将表面的东西抽象为计算机数据可以表示的东西,把表面的东西是做成系统的内存呢?还是扩展的系统内存呢?还是外设的内存呢?如51单片机驱动四个数码管,如果直接连接在四个端口上,就相当于作为系统内存访,而如果通过4个74LS373就相当于组成了扩展的系统内存(虽然这跟单片机支持的扩展系统内存不太一样,只是地址锁存、数据锁存、时序要自己通过读写管脚实现,还要注意单片机支持的扩展内存模式时,其实管脚寄存器是可以用的,只不过CPU在读写外部内存时会自动把管脚对应的寄存器置1,所以建议不要用,注意管脚与对应的寄存器是不一样的,特别是在STM32F103中,寄存器的值在某个时钟读取管脚得到的,而对于复用时的管脚就不连接寄存器,而且管脚实际是连接到其他外设的,如串口、ADC等),每个74LS373锁存的相当于一个字节的内容。4个数码管也就是2位地址线+8位数据线而已。而驱动LCD是外设内存,注意扩展的系统内存与外设内存的区别。其实到底层了都是时序逻辑的相关部分。

这时候与上面的LCD一起总结一下,自己扩展内存、扩展外设,都要根据合适的时序重新实现内存、寄存器的读写微指令。