三条口线驱动30位键盘10位LED显示 本文作为抛砖引玉篇献给我们致力于软硬件优化设计的朋友们
1。目的和要求 用三条普通的单片机口线(这里以51单片机为例,但本设计是不针对具体型号单片机的)实现10位LED显示和30位键盘的读取。
要求:运行速度快(要至少比传统方式快4倍以上)占用资源少,便于编程软件规模比传统方式至少要要80%,显示和读键稳定流畅,不存在“未定义键”,显示不“翻红”,严禁出现显示“滚动”,键盘运行不得影响显示,显示运行不得影响键盘,而且严格要求不得有单独的键盘程序和单独的显示程序,二者程序是相互依存密不可分的,此外当单片机死机时显示会“自动判断”出“东家”已经死了,雇员会主动自我地收拾“残显” 2。基本设想和硬件规模 用一片74HC4017十位扫描计数器做10位LED显示位选(共阳驱动),并作10位键盘列编码输出。一片移位带锁存的寄存器74HC595作段码的推移和锁存,而三条口线以高电平、低电平、下跳、上跳和脉冲宽度组合完成显示扫描,段码推移,显示定位、锁存信号产生、读键盘行码、扫描键盘行码和实现单片机死机时自动消影作用。这里采用朋友们称为的“口线上跳巴蕾的技术”,但并非上面每个细节都需要用“身体软件语言来表达”很多是“含蓄”的,需要在动静间去感悟。 四只NPN三极管起倒向作用,其它是二极管电阻电容做辅助。 3。丑媳妇来见公婆 下图是媳妇嘴脸,只解释一点,这里的元件参数是画图默认的,并非真实参数,有时间我把做好的扳子上具体数据和对应的详细软件清单也挂出来请朋友们批判。
4。原理简单唠叨 74HC4017是非常普通通用的芯片,本质是个带10进制记数10进制译码器,这里就理解为来一个脉冲就译一次码输出的显示“位扫描器”,它以上跳沿有效计数,高电平复位,这里用原理图中右上角的NPN管9014非一次,倒过来下跳有效,低电平复位。当且竟当74HC595上的数据时钟两条驱动线同为高电平时,4017的此时钟线出现“短时下跳”,才驱动74HC4017扫描到下一显示位(也同时是扫描下一个键盘列),每10次扫描后还产生一次“长下跳”,以维持“10到20US长”来强制4017复位到“0”,此时扫描也到了第0号位置(也是10号位置)。
下面这样实现单片机内部显示缓冲区和外部显示位的同步和定位的:
单片机内部RAM:70H到79H共10个连续的单元是显示缓冲区,用RO间接寻址,RO每递增到7AH从新修改为70H,同时产生一个10到20US的“长下跳”以后RO递增顺序再产生9次“短下跳”,这样“内外部之间就同步了”肯定说显示不可能出现滚动和翻卷,即使基本不可能的4017硬件出了问题,最多出现10个“错位”后,也会自动纠正过来,这种软硬件的可靠性都非常高,软件提高了硬件可靠性,而软件并不增加多少,因为你本身也要:INC RO CJNE RO,#7AH,短脉冲 MOV R0,#70H SETB PX。Y ;输出长脉冲 呵呵此时心明眼亮的你还猛然发现70H到79H的低四位竟然就是键盘的列编码数字这实际是在位扫描同时无形中完成了键盘列扫描,当有键按下时列编码: MOV A,R0 ANL A,#0FH 你眼更亮点还能发现键盘编码就是:行*10+A哈,别急!你还会发现这里的“行扫描”和定位也是一气呵成的。这里先卖个关子就此打住,但要记住4017的时钟线为高电平时,又作键盘行线使用的,它被按键下拉为低电平表示有键按下,但键盘按下的低电平下拉会不会引起4017扫描甚至复位呢,这是不可能的。这里看一下两只反向三极管的发射极接法就释然了。
5。再唠叨74HC595 595也是非常通用的芯片,用这样数学式子诠释它最为经典 74HC595=74HC164+74HC373+三态控制
因为它需要三条线(时种、数据和锁存允许)大家不太愿意用它,教科书也不以它而以164为蓝本解析串行显示;正是因为它移位(同74HC164)和输出多了条锁存控制,所以它可以边输出边移位二者互不影响,而不会出现显示移位数据突变带来的显示“漏红”,此外它还有三态功能。不就是多了一条锁存线吗?我们一起来省掉它而且附带产生单片机死机自消影信号。这里是纯硬件的勾当和技巧,是软件执行完的后“附带物”,不需要软件实现的
当74HC595在被左下两时钟和数据线推移时,其下跳和低电平,第一:使595左边一堆二极管管中的电容充电,构成倍压整流电路。当正常显示时,时钟和数据上的下拉使电容充电,上跳时形成约二倍VCC电压,这个整流电压经过三极管反向首先作为595三态输出开启信号使用。在经过积分延迟电阻(分压比1/3)分压驱动锁存允许端子,由于有二极管的快速放电,只有当串行推移结束,两串行线维持高电平一段时间后,这个2/3VV的高电平才能累积的起。当单片机死机后,这两条口线无论是高电平还是低电平,倍压整流的电荷都将很快放完,显示由此自动关闭,就屏蔽了一个“很亮的”“死机字”,此外请大家看到:当在作595推移时,4017的位扫描是被无形禁止的,这种“位扫描”,“段禁止”,“段移动”“位禁止”的互锁,保证了两次推移完后位和段的同步和定位。
6。最后看键盘的行扫描,行扫描时机在4017完成位扫描后瞬间 当4017产生下跳完成扫描后(此时595两线肯定为高)此线回跳高电平,我们先延时一个NOP空操作,接下来读595的数据线,此时如数据线猛然被拉低,说明有第三行键按下,其权值为2(0),于是键盘码=2*10+R0-70H。几微妙后因为微分电容充电满将继续维持595数据线为高电平(请见原理图左上角的三极管微分反向器),这里微分时间很短,三行有按键不影响后续的595显示段码的推移,当此口线没有瞬间下拉,我们就继续寻找其它两行线。此时再把595时钟线拉低也延时一个NOP后,再次分别判断595数据线和4017时钟线,那一根线为低那一行被扫,建议只按默认顺序判断行码,有按下就不再判断其它行,这样就实现用减少软件量,不去判断重间的方式实现“顺序优先编码”,呵呵列被硬件编码了,行被程序顺序编码了。有意思吧!它们的权这里只有1(0)和0,到此全部实现30个键的硬和软编码和。
7。下面是595的推移,如果串口,就用单片机的串口方式0,串口占用可选软串口,但我更建议用SPI串口,这样编程量小基本不占CPU时钟,还可实现多任务共享。这里不难看出由于行列都“无形”编码,还自动消除键盘抖动和重键,而且键盘和显示互相依托,程序非常简单程序量也非常小,至于运行速度简直是超快,一定比7289还快,程序还少。
后记:本设计基本是倒过来的是按单片机资源和指令特点,由软件倒过来去编制硬件,这有如我们学信号与系统,开始是典型电路的硬分析,即先做拉谱拉斯正变换去揭示和寻觅电路的“零极点”再做拉谱拉斯反变换回到复指数时域响应,但到后期我们学到了倒回来做,先根据任务需求去描绘“零极点”然后去编制硬件电路,这叫系统综合,而前者叫系统分析。这里零极点是系统本质,电路硬件只是表象,其硬件技巧的高下决定我们的“手艺”“干”与“潮”只不过是匠作的修为而已。本电路也是表象,自然是匠作的手术,希望朋友们超越它,去看到它后面口线上跳巴蕾的灵智,并使它变通和发扬,这才是本文抛其砖引其玉真正目的。 |