资源描述:
《键盘实验_4.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、键盘实验要求:掌握键盘硬件电路,掌握键盘软件程序键盘识别电路图4×4的行、列结构可以构成一个有16个按键的键盘。4×4的行、列结构可以构成一个有16个按键的键盘。工作过程S3CEV40实验板由3个74HC08"与"门器件U9B,U9C和U9D组成中断输入电路(外部中断1),锁存器74HC17(U11)和74HC541(U10)以及4个二极管组成键盘检测电路部分.按键按下相当于连接J7键盘接口的航线和列线,即第1-4脚任意连通第5-8脚形成一个键盘动作.当没有按键按下时,数据线被上拉为高电平;当有按键按下时,硬件电路产生硬件通知CPU.中断处理程序通过行线与列线对应的地址读数据.这样,从按键
2、所对应的行或者列对应的地址读出来的数据与初始状态不同(不全为高电平,即通过U10把数据线拉低);然后再根据数据判断按键所在的行或列(对应数据为低电平).这样4*4键盘要使用4根地址线和4根数据线来识别4行4列按键.工作原理使用实验板上4×4用户键盘,编写程序通过中断的方式读入键值,并在实验板的LED码管上显示读到的键值在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地址读取数据线上的状态,判断哪个按键被按下。实验操作步骤(1)准备实验环境。使用Embest仿真器连接目标办,使用EmbestS3CEV40实验板附带的串口线连接实验板上的UART0和PC机串口。(2)在PC机
3、上运行Windows自带的超级终端串口通信程序(设置波特率为115220b/s,1各停止位,无校验位,无硬件流控位);或者使用其他的串口通信程序。(3)使用EmbestIDE并通过Embest仿真器连接实验板,打开实验例程目录下Keyboard_test子目录中的Keyboard_Test.ews例程。编译、连接通后,连接目标板,下载并运行它。(4)在PC上观察超级终端程序主窗口,可以看到如下显示:Embest44B0XEvalutionBoard(S3CEV40)KeyboardTestExamplePleasepressonekeyonkeyboardandlookatLED...(5
4、)用户可以按下实验系统中的4×4键盘,在8段数码管上观察显示结果。程序变量初始化硬件使用外部中断1,程序设计可以先进行初始化,例如变量及相关中断控制寄存器等。volatileUCHAR*keyboard_base=(UCHAR*)0x06000000;//键盘访问硬件基地址#defineKEY_VALUE_MASK0x0F;//初始数据状态主要程序init_keyboard键盘控制初始化KeyboardInt中断服务程序8led.c8段数码管程序//Digit_Led_Test循环显示数字和字符Digit_Led_Symbol在8段数码管上显示指定的十六进制数字//key_read读键盘值
5、*键盘检测程序*中断服务程序voidKeyboardInt(void){Intvalue;rI_ISPC=BIT_EINT1;//中断清除rEXTINTPND=0xf;//清寄存器EXTITPNDvalue=key_read();if(value>-1)Digit_Led_Symbol(value);Uart_Printf("Keyis:%xr",value);}8段数码管程序intSymbol[]={DIGIT_0,DIGIT_1,DIGIT_2,DIGIT_3,DIGIT_4,DIGIT_5,DIGIT_6,DIGIT_7,DIGIT_8,DIGIT_9,DIGIT_A,DIGIT_
6、B,DIGIT_C,DIGIT_D,DIGIT_E,DIGIT_F};#defineLED8ADDR(*(volatileunsignedchar*)(0x2140000))//*定义8段数码管控制地址*//voidDigit_Led_Test(void){Inti;/*循环显示0~F的十六进制数*/for(i=0,i<16,i++){Digit_Led_Symbol(i);Delay(4000);}}//循环显示数字和字符voidDigit_Led_Symbol(intvalue){if((value>=0)&&(value<16))LED8ADDR=~Symbol[value];}//
7、在8段数码管上显示指定的十六进制数字键盘检测程序读键盘值inlineintkey_read(){intvalue;chartemp;temp=*(keyboard_base+0xFD);//读地址1(A1为低)if((temp&KEY_VALVE_MASK)!=KEY_VALUE_MASK)//判断是否有按键按下{if((temp&0x1)==0)//判断按键索对应的数据位value=3;elseif((temp&0x2