目录第一章引言 (1)1.1 键盘及LED扩展电路概述 (1)1.2 系统的主要功能 (1)第二章系统的硬件设计 (2)2.1 系统的硬件构成及功能 (3)2.2 主控模板硬件设计 (3)2.3 ARM芯片及引脚说明 (3)2.4 LED数码显示管 (6)2.5 键盘设计 (8)第三章系统的软件设计 (12)3.1 软件总体功能设计 (12)3.2各功能模块软件设计 (16)第四章结束语 (18)致谢 (18)参考文献 (18)附录 (19)第一章引言1.1键盘及LED扩展电路概述键盘及LED扩展电路主要是由74HC164移位寄存器、数码显示管、按键、电阻、电容、导线等构成的。
将8个按键用总线分别与两个74HC164移位寄存器、数码显示管联接起来,两个74HC164移位寄存器联接起来。
一个用来存段码,一个用来存位码。
在没有按键动作时,74HC164 移位寄存器的数据输入端AB(A 和B 作为一个2 个输入端的与门为74HC164 提供数据,在此电路里并联)的输入电平为1,供电路产生移位逻辑时钟脉冲信号的输入端CP也为1 电平。
此时按下键就给了CP 端一个低电平,当键松开后CP端即恢复高电平,于是CP端就得到了一个输入翻转兼移位的低电平脉冲信号.当74HC164得到了一个0 数据的同时输出端Q7~Q0 的数据将全部左移一位。
通过DATA端持续给其传送数据,当装满寄存器后开始循环,而寄存器与数码显示管是相通的,寄存器把对应位的高、低电平传给数码管,使符合条件(段码、位码)的0-9在数码管上显示出来。
1.2系统的主要功能该系统使用前后台的程序编写方法,完成三个基本的功能。
1.任意按下键盘,能在数码显示管上将按下的键对应的十六进制数显示出来图1.1.13. 键盘扫描的流程图如右:系统的硬件设计1.3系统的硬件构成及功能2.1.1 74HC164 移位寄存器在计算机系统中为了高效地实现计算机系统之间的远距离通信,且要使通信电路简单、可靠,则采用串行输入、输出的方式,例如串行口、I2C 和SPI 通信等,甚至当今广泛应用的互联网通信,都采用了这种方式来实现,移位寄存器的作用就是实现并行输入、串行输出或串行输入、并行输出。
图2.1.174HC164 是一种常用的八位串入并出移位寄存器,它的电路原理图及逻辑符号见图2.1.1 所示。
在电路原理图中,8 个D 触发器首尾相接,数据输入端A 和B 通过与门G 接到F1 的输入端作为整个移位寄存器的串行输入,触发器F1~F8 的输出分别为芯片的并行输出Q0~Q7,8 个触发器的时钟输入端连接在一起形成芯片的时钟输入端CP,这样在时钟上升沿的作用下,串行输入数据A·B 逐位从左向右移动。
它的特性表如表 4.19 所示,从表中可以看出若要将八位数据D7~D0 传送到输出Q7~Q0,必须在8 个CP 脉冲的作用下,从D7到D0 逐位送到输入D。
例如将二进制数(11010110)B 串行传送到74HC164 并行输出(Q7 为高位,Q0 为低位),时序图如图2.1.2 所示。
图中横坐标表示时间,纵坐标表示高、低电平,因此波形中串行数据从左至右、由高位Q7(本例为1)至低位Q0(本例为0)输入,在时钟脉冲的作用下,逐位从左至右移位,8 个时钟脉冲过后,二进制数(11010110)B 在Q7~Q0 并行输出。
图中纵向虚线表示相位对准每个CP 脉冲的上升沿;阴影部分表示不必关心这时的状态;方向指向右下方的8 个箭头表示最早输入的1 经过8 次移位到达Q7。
图2.1.2 移位寄存器时序图图中纵向虚线表示相位对准每个CP 脉冲的上升沿;阴影部分表示不必关心这时的状态;方向指向右下方的8 个箭头表示最早输入的1 经过8 次移位到达Q7。
1.4主控模板硬件设计1.EasyARM2103开发板2.74LS164芯片3.8位数码显示管4.引脚芯片5.四脚按键、电阻、电容、发光二极管、跳线若干1.5ARM芯片及引脚说明2.LPC2103芯片(1)引脚图2.3.1 LPC2103引脚(2)元件布局图EasyARM2103开发板的底板与PACK板的元件布局如图2.8、图2.9所示。
图2.3.2 底板元件布局图图2.3.3 PACK板元件布局图1.6LED数码显示管LED数码管分共阳极与共阴极两种,其工作特点是,当笔段电极接低电平,公共阳极接高电平时,相应笔段可以发光。
共阴极LED数码管则与之相反,它是将发光二极管的阴极(负极)短接后作为公共阴极。
当驱动信号为高电平、控制端接低电平时,才能发光。
1. LED封装图图2.4.1LED封装图2.数码管结构数码管由8个发光二极管(以下简称字段)构成,通过不同的合可用来显示数字0~9,字符A~F、H、L、P、R、U、Y等符号及小数点“.”。
数码管又分为共阴极和共阳极两种类型。
3.数码管工作原理共阳极数码管中8个发光二极管的阳极(二极管正端)连接一起,即为共阳极接法,简称共阳数码管。
通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。
当某段驱动电路的输入端为低电平时,该端所连接的字段导通并点亮。
根据发光字段的不同组合可显示出各种数字或字符。
此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
共阴极数码管中8个发光二极管的阴极(二极管负端)连接在一起,即为共阴极接法,简称共阴数码管。
通常,共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。
当某段驱动电路的输出端为高电平时,该端所连接的字符导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。
同样,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
4.单片机LED断码表单片机LED共阳极段码表【0-F】DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H[0-7]DB 80H,90H,88H,83H,0c6H,0a1H,86H,8eH[8-F]单片机LED共阴极段码表【0-F】DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H[0-7]DB 7FH,6FH ,77H,7CH,39H,5EH,79H,71H,76H[8-F]为了满足某些特殊用户需要有时也会用到以下特别字符的段码表单片机LED共阳极段码表【HLPRUY-.熄灭】DB 89H,0C7H,8CH,0CEH,0C1H,91H,0BFH,7FH,0FFH [ HLPRUY -.熄灭 ]单片机LED共阴极段码表【HLPRUY-.熄灭】DB 76H,38H,73H,31H,3EH,6EH,40H,80H,00H [ HLPRUY-.熄灭 ]其中 [ HLPRUY-,熄灭 ],这些特殊字符中有些看起来不是很形象,但有时不可避免的会用到.1.7键盘设计图2.5.1 独立式按键原理图图2.5.2 矩阵式按键原理图无论是单片机控制系统还是单片机测量系统,都需要一个人机对话装置,这种人机对话装置通常采用键盘和显示器。
键盘是单片机应用系统中人机对话常用的输入装置,而显示器是单片机应用系统人机对话中的常用输出装置。
键盘是由若干个按键开关组成,键的多少根据单片机应用系统的用途而定。
键盘由许多键组成,而每个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。
单片机接收到按键的触点信号后作相应的功能处理。
因此对于单片机系统来说键盘接口信号是输入信号。
单片机的键盘接口分为独立式和矩阵式。
独立式键盘的每个按键都有一个信号线与单片机电路相连,所有按键有一个公共地或公共正端,每个键相互独立互不影响。
如图2.5.1所示,当按下键1时,无论其它键是否按下,键1的信号线就由1变0;当松开键1时,无论其它键是否按下,键1的信号线就由0变1。
矩阵式键盘的按键触点接于由行、列母线构成的矩阵电路的交叉处,每当一个按键按下时通过该键将相应的行、列母线连通。
若在行、列母线中把行母线逐行置0(一种扫描方式),那么列母线就用来作信号输入线。
矩阵式键盘原理图如图2.5.2所示。
针对以上两大类键盘工作方式,单片机又有三种键盘扫描方式:查询方式;定时扫描方式和中断扫描方式。
查询方式是指在程序中用一段专门的扫描和读按键程序不停查询有无按键按下,确定键值。
这种方式电路简单,但需要占用单片机的机器时间。
定时扫描方式是指利用单片机内的定时器来产生定时中断,然后在定时中断的服务程序中扫描,检查有无按键按下,确定键值。
这种方式的电路也比较简单,不占用单片机的机器时间,但需要占用一个定时器,同时定时的时间不能过长,否则可能检测不到相应得按键。
中断扫描方式是指当有键按下时由相应的硬件电路产生中断信号,单片机在中断服务程序中扫描,检查有无按键按下,确定键值。
这种方式硬件电路上必须要产生中断线,需要与门和非门来产生。
但中断方式不占用单片机的机器时间,也不会出现定时方式时的检测不到键盘的情况。
系统的软件设计1.8软件总体功能设计/******************************************************************** **************************************程序名称:SPI驱动键盘板(按键显示键的编号)**所用芯片:ARM2103**引脚设置:P0.4为SPI的CLK(时钟线);P0.5为GPIO输入;P0.6为SPI的MOSI(数据传输线)**功能描述:按下键盘板上的一个键,就在8个数码管上都显示它的编号**程序作者:张会**编写日期:2010年11月16日********************************************************************* ***********************************/#define key (1<<5)#include "config.h"uint8 data[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};//段码表uint8 bit[ ]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位码表uint32 Flags=FALSE;char i=0; //位码循环变量char whichkeydown=8; //标志哪一个键按下了,0~7号键。
/******************************************************************** ********** delay延时函数 delay(1000000)防抖效果最好********************************************************************* *******/void delay(uint32 time){while(time>0){time--;}}/********************************************************************************/void __irq Timer0ISR(void){Flags=TRUE;T0IR=0x01;VICVectAddr=0x00;}/******************************************************************** **********/void Timer0Init(void){T0TCR=0x02; //TC复位T0PR=0x00; //不分频T0MCR=0x03; //MR0匹配时,发生中断和TC复位T0MR0=Fpclk/400; //25msT0IR=0x01;//中断设置VICIntSelect&=~(1<<4);VICVectCntl0=0x20|4;VICVectAddr0=(uint32)Timer0ISR;VICIntEnable=1<<4;T0TCR=0x01; //启动timer0}/******************************************************************** ******************************************************************************* *******/void SPIInit(void){SPI_SPCCR=0x08; //设置传输速率,此处设为最大速率Fpclk/8SPI_SPCR=SPI_SPCR&(0<<2) //每次传送的数据由8~11位设置|(1<<3) //起始和结束:数据在SCK第二个时钟沿采样|(1<<4) //时钟极性控制:SCK低有效|(1<<5) //选择为主模式&(~(1<<6)) //设置为数据传送时高位在先【高位在先是键盘板使用模式,由74HC164移位寄存器特点决定的】|(0<<7); //SPI中断使能}/******************************************************************** ******************************************************************************* *******/void SendData(uint8 number){SPI_SPDR=number; //传送的数据A内容(段码)IOCLR=1<<7;while((SPI_SPSR & (1<<7))==0); //等待传送结束(SPI_SPSR第七位置1时表示传送结束)IOSET=1<<7;}/******************************************************************** ********** main函数*********************************/int main (void){PINSEL0=PINSEL0 &(~(0x03<<8))|(1<<8) //设置P0.4为SPI的CLK(时钟线)&(~(1<<10)) //设置P0.5为GPIO&(~(0x03<<12))|(1<<12); //设置P0.6为SPI的MOSI(数据传输线)PINSEL0&=~(0x03<<14);IODIR|=1<<7;PINSEL1&=~(0x03<<2);IODIR|=1<<17;IOSET=1<<17;Timer0Init( );IRQEnable( );while(1){if(TRUE==Flags){Flags=FALSE; //清零SendData(data[i]);SendData(bit[i]);if((IO0PIN&(1<<5))==0){whichkeydown=i;}else{if(whichkeydown==6) //按下6号键,点亮灯{whichkeydown=8;IOCLR=1<<17;}}i=(i+1)%8;}}return 0;}/**************************文件结束********************************/1.9各功能模块软件设计1.delay延时函数功能:用来防止键盘抖动 [delay(1000000)键盘防抖效果最好]相关知识:如果不处理键抖动,则有可能引起一次按键被误读成多次,所以为了确保能够正确地读到按键,必须去除键抖动,确保在按键的稳定闭合和稳定断开的时候来判断按键状态,判断后再做处理。