您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 电子设计创新训练(提高)第四章 常用典型外设使用方法与编程技术1
第四章常用典型外设使用方法与编程技术§4-1常用键盘与显示器接口单片机的应用越来越广泛,因此它的接口也是品种繁多,但是从类别上看,也不过是人机接口、模入模出和开入开出这么几类。在速度要求不是很高的情况下,从系统的简洁性考虑,目前MCU的系统中,串行接口的器件获得了越来越多的应用。串行器件的操作目前主要有三种接口标准:移位寄存器方式、SPI标准接口和I2C总线。本章将就一些常见的接口类型进行一些介绍,主要是讨论接口驱动编程。并口器件的驱动相对简单,而且几乎所有的接口类参考书中都有很详尽的介绍,因此本章不介绍标准并口器件的驱动,而是侧重于串行器件和简洁灵活的接口应用及编程介绍。一、键盘接口驱动程序设计图4-14×4扫描键盘电路扫描式键盘是MCU系统中常用的输入设备,本小节的例子是使用51单片机的一个八位I/O口设计一组16键的小键盘。16键的小键盘比较常用,采用4×4方式,市场上甚至有很多成品的薄膜式16键盘组出售。见图4-1是本例的硬件原理图,采用51的P1口完成键盘硬件驱动。它的检测原理是:P1.4—P1.7作为4行键盘的分时低电平驱动输出,P1.0—P1.3作为4列键盘按键的输入检测。无键盘按下时,输入检测中P1.0—P1.3获得的结果是高电平,而有按键输入时,扫描到相应按键所在行时,列输出将有低电平存在,根据输出和输入状态就可以确定是那个按键按下。这里需要指出的是,在P1.0—P1.3上分别加了10KΩ的上拉电阻,使用目的是辅助上拉,保证无按键时输入高电平。尽管单片机的P1口有内部上拉,但很微弱,当键盘连接线很短时,可以不加上拉电阻,如果键盘连接线比较长,容易受到干扰,则需要使用这四只上拉电阻。下面是具体的驱动程序://键盘扫描函数,无键盘返回0,有则返回0xf0—0xff,低4位的0—f表示键值号,高位标示有按键。key_scan_dat(){unsignedchardataI,j,k;unsignedcharcodek_dat[17]={0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7b,0xed,0xdd,0xbd,0x7d,0xee,0xde,0xbe,0x7e,0x00};//定义0—F共16个键的行列扫描结果,制作键值时用,多定义了一个空白符用于非法按键判别P1=0xff;//准备扫描,P1口全部输出高电平j=0xf7;//准备扫描,下一个为P1.4,依次为P1.5、P1.6、P1.7k=0x0f//预置输入状态为无键盘,准备输入while((j!=0x70)&&(k==0x0f))//做P1.4—P1.7扫描有按键退出,无键扫到P1.7后退出{j=j1;//移到下一个I/O扫描P1=P1&0x0f;P1=P1|j;//I/O输出k=P1&0x0f;//读入P1.0—P1.3的扫描结果,只留低4位}if(k==0x0f)//扫描出口无按键,返回0{i=0;}else//扫描出口有按键,处理{delay(20);//按键前沿20ms延时去抖动,delay为ms延时函数while((P1&0x0f)!=0x0f);//等待按键抬起delay(20);//按键抬起后,做按键后沿20ms去抖动j=j&0xf0;j=j|k;//合成行列信息,准备制作键值k=0;while((j!=k_dat[k])&&(k17))//查表做键值{k++;}if(k==16)//如果查到表尾,则可能是非法的多键按下{i=0;//本函数不支持多键同时按下组合操作,返回0}else{i=k|0xf0;//检测的键是合法按键,返回0xf0—0xff}}returni;//返回检测结果}上面的例子符合模块化编程原则,能够返回容易识别和使用的键值,它可以嵌入应用程序的任何位置来进行扫描按键。应用中需要注意它的调用频率,一般来讲,人对一个动作的反应速度是200ms,所以为保证不至于漏掉按键操作,程序中必须保证及时调用按键函数。还需要指出的是,这个键盘函数不支持多键同时操作的定义。这个程序只能够识别单键,不能够识别组合按键。二、LED显示接口驱动程序设计智能设备的显示器目前主要有LED和LCD两类。LED一般都是采用动态扫描方式来驱动。LCD产品有简单的是段驱动类数码类型显示板,复杂的则是内置CPU驱动器的点阵图形模块,并且都提供标准的串口或并口逻辑,驱动简单,一般厂家都提供51及C的驱动程序。本小节主要以LED扫描驱动和静态驱动设计为主要内容,介绍显示器的设计和软件驱动程序。(一)4位LED动态扫描驱动程序设计要求:使用单片机的一个8位I/O口设计一个4位动态LED显示接口。单片机使用标准8051内核的芯片,时钟为12MHz。分析要求,8根I/O口线显然无法直接完成位和段的扫描驱动,只能采用比较灵活的接口方案。比较可行的就是采用BCD—7段译码驱动器芯片做段扫描驱动,只需要4根I/O口线,余下4根I/O口做位驱动。本例使用74LS247芯片作为BCD—7段译码驱动器,做为4只共阳LED数码管的段驱动,使用P1.0—P1.3做BCD码输出。使用P1.4—P1.7作为位选通控制,通过4只PNP三极管做LED的位控,具体硬件见图4-2。图4-24位LED扫描驱动接口电路图图中具体参数是这样确定的:LED静态驱动段电流应该为5mA才能够达到足够亮度,LED位数比较少时,扫描时也应该保持这样一个平均电流水平,因此4只LED扫描时,每段驱动电流应该为20mA,LED的管压降为2V,系统电压为5V,因此段限流电阻应该为150Ω。位控制三极管选用C9012,它的β值在100倍以上,扫描时LED包括小数点的8个管芯全亮时总电流为160mA,因此基极电流应该保持1.6mA以上,因为基极驱动电压为4.3V左右,可以计算出基极限流电阻应该2.7KΩ以下,这里取2KΩ。软件上,使用T0定时器产生2ms的中断,使用中断服务程序做显示扫描,每次中断扫描一位LED,4次中断扫描一个周期,整体刷新速度为125Hz。具体驱动程序如下:#includereg51.hunsignedintdatadisdat;//定义显示数据变量,为无符号整形unsignedchardatadiscount=0;//定义扫描显示状态变量,为0—3//T0中断函数,2ms间隔,每次扫描一位LED,4个扫描周期循环扫描4位LED。voidt0_int()interrupt1{TH0=63536/256;//中断入口重新初始化计数器TL0=63536%256;switch(discount)//根据扫描状态计数器扫描4个LED中的1个{case0:P1=((disdat/1000)&0x0f)|0x70;//扫描显示千位,送BCD码和位选信号break;case1:P1=(((disdat%1000)/100)&0x0f)|0xb0;//扫描百位break;case2:P1=((((disdat%1000)%100)/10)&0x0f)|0xd0;//扫描十位break;case3:P1=((((disdat%1000)%100)%10)&0x0f)|0xe0;//扫描个位break;default:break;}discount++;//扫描计数器移动到下一个状态if(discount==4)discount=0;}//主函数初始化部分voidmain(){TMOD=0x01;TH0=63536/256;TL0=63536%256;EA=1;ET0=1;··}本例软件相当简洁,但该例有一些应用限制,首先是没有小数点显示,如果需要显示小数点,也只能在硬件上接固定位置的小数点,例如在图4-2中的LED3的小数点段上对+5V电源接一个150Ω电阻就可以点亮十位上的小数点。其次是这个显示器没有考虑显示负数的问题,并且它的入口参数disdat的值不能超过9999。(二)LED静态驱动方法及驱动程序在LED显示应用领域中,一般要求控制芯片使用简单、功能多样化、多级灰度调节、外围电路精简可靠、译码与功率驱动于一体。MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。MAX7219与SPI™、QSPI™以及MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。一个方便的四线串行接口可以联接所有通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219/MAX7221同样允许用户对每一个数据选择编码或者不编码。整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。当使用多于8位LED时,只需将N片级联,便可轻松实现N×8位LED显示。当N≥8时,应考虑到提高总线驱动能力。引脚名称功能1DIN串行输入。当LOAD为高电平,串行输入数据的最后16位被锁定12LOAD装载数据输入。在CLK的下降沿,数据被加载到内部16位移位寄存器中13CLK时钟输入。最高频率为10MHz。在CLK的上升沿,数据被移入到内部移位寄存器中。在CLK的下降沿,数据从DOUT输出。24DOUT串行数据输出。输入到DIN的数据在16.5个时钟周期后在DOUT端有效,用于N片级联。18ISET通过一个电阻(RSET)连接到V+,用于设定段电流。19V+供电电源+4,9GND供电电源-2,3,5~8,10,11DIG0~78位数据驱动线,它从显示器吸入电流14~17,20~23SEGA~G,DP7段数码和小数点线,它供给显示器源电流图4-3MAX7219引脚表4-1MAX7219引脚功能表图4-4MAX7219内部结构原理图图4-5MAX7219操作时序图详细描述(一)MAX7219硬件特点(1):MAX7219的段驱动有上升速度限制,可以减少EMI;(2):MAX7219的串行口和SPI完全兼容。(二)串行地址格式对MAX7219来说,串行数据在DIN输入16位数据包,无论LOAD端处于何种状态,在时钟的上升沿数据均移入到内部16位移位寄存器。然后数据在LOAD/的上升沿被载入数据寄存器或控制寄存器。LOAD/端在第16个时钟的上升沿同时或之后,下个时钟上升沿之前变为高电平,否则数据将会丢失。在DIN端的数据传输到移位寄存器在16.5个时钟周期之后出现在DOUT端。数据位标记为D0-D15(如表4-2表示)。D8-D11为寄存器地址位。D0-D7为数据位。D12-D15为无效位。D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0××××地址MSB数据LSB表4-2MAX7219串行数据格式表4-3数据寄存器与控制寄存器表理论上,只使用3根I/O口即可进行多片MAX7219的级联,具体芯片数量只受片选与时钟端的总并联电容限制。采用级联的方法,可以驱动大量的LED。但是级联数量越大,驱动所需要的时间越长,因此在实际使用中,需要对驱动速度、驱动目标的数量及所使用的I/O口进行折中设计。下面的例子是扩展两片MAX7219,但不是采用级联的方法,而是仅二组显示器公用时钟和片选,数据输入采用独立输入端。这样,每扩展一个芯片需要增加一根I/O的开销,速度基本不降低。图4-6MAX7219静态驱动原理图A图4-7MAX7219静态驱动原理图B//显示函数.二组显示器公用时钟和片选(锁存控制).第1,2组为MAX7219.//显示函数1,对第1,2组显示器,仅输入一组信息,可以是命令或者数据.voiddisplay0(unsignedcharadd,unsignedchardat1,unsignedchardat2){unsignedchardatai;sclk=0;cs=0;for(i=0;i8;i++){
本文标题:电子设计创新训练(提高)第四章 常用典型外设使用方法与编程技术1
链接地址:https://www.777doc.com/doc-5518638 .html