嵌入式系统实践上机实践报告-数码管和键盘控制_第1页
嵌入式系统实践上机实践报告-数码管和键盘控制_第2页
嵌入式系统实践上机实践报告-数码管和键盘控制_第3页
嵌入式系统实践上机实践报告-数码管和键盘控制_第4页
嵌入式系统实践上机实践报告-数码管和键盘控制_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第?次实验实验名称 学号姓名 第1页共12页计算机科学技术系上机实践报告课程名称:嵌入式系统实践年级:上机实践成绩:指导教师:姓名:创新实践成绩:上机实践名称:数码管和键盘控制学号:上机实践日期:上机实践编号:组号:上机实践时间:实验目的通过实验掌握LED的显示控制方法.巩固实验4.1中所掌握的对存储区进行访问的方法。实验设备硬件:EmbestEduKit-III实验平台,EmbestARM标准/增强型仿真器套件,PC机。软件:EmbestIDEProARM集成开发环境,Windows98/2000/NT/XP。实验内容编写程序使实验板上八段数码管循环显示0到9字符。编写程序,获得实验板上5×4键盘输入,并发送到串口显示实验原理八段数码管嵌入式系统中,经常使用八段数码管来显示数字或符号,由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。结构八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日”字形,右下角一个点形的发光管作为显示小数点用,八段数码管能显示所有数字及部份英文字母。见图4-13。类型八段数码管有两种不同的形式:一种是八个发光二极管的阳极都连在一起的,称之为共阳极八段数码管;另一种是八个发光二极管的阴极都连在一起的,称之为共阴极八段数码管。工作原理以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极管点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,控制信号为高电平时点亮。电平信号按照dp,g,e…a的顺序组合形成的数据字称为该字符对应的段码,常用字符的段码表如下:显示方式八段数码管的显示方式有两种,分别是静态显示和动态显示。静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余辉效应,数码管的显示依然是非常稳定的。电路原理EMBESTEduKit-III教学电路中,使用的是共阳极八段数码管,数码管的控制通过芯片ZLG7290控制,各段的控制信号是芯片ZLG7290的SEGA~SEGG引脚控制,需要显示的段码通过IIC总线传送到该芯片,见图4-14、图4-15。图4-14八段数码管连接电路图4-15八段数码管控制电路键盘中断工作示意图键盘工作原理(8×8)8行8列产生64个信号,支持64个键Dig和Seg,分别用作键盘矩阵的行线和列线其中ZLG7290系统框图:实验步骤准备实验环境使用Embest仿真器连接目标板,使用EmbestEduKit-III实验板附带的串口线,连接实验板上的UART0和PC机的串口。串口接收设置在PC机上运行windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。打开实验例程1)拷贝光盘CD1\Software\EduKit44b0文件夹到EmbestIDE\Examples\Samsung\目录下;2)使用EmbestIDE通过EmbestJTAG仿真器连接实验板,打开实验例程目录4.6_8led_test子目录下的8led_test.pjf例程,编译链接工程成功;3)点击IDE的Debug菜单,选择RemoteConnect项或F8键,远程连接目标板;4)点击IDE的Debug菜单,选择Download下载调试代码到目标系统的RAM中;5)点击Debug菜单的Go或F5键运行程序。观察实验结果1).在PC机上观察超级终端程序主窗口,可以看到如下界面:2).实验系统八段数码管循环显示0~9字符。完成实验练习题理解和掌握实验后,完成实验练习题调试过程、结果和分析首先分别装载运行了实验6数码管、实验7键盘的示例程序,了解了试验箱上数码管对应的地址,如下表所示:0x130x120x110x100x170x160x150x14接着观察实验7的程序发现从试验箱上的键盘输入的字符是放在ucChar这个变量中,然后通过串口通信显示在超级终端上的;所以只需要将这个变量记录下,同时调用实验6数码管中的全局数组即可将键盘输入在数码管上显示出来。理清楚这个总体思路后,再根据实验要求上的内容逐步实现:初始化数码管的清空还是很容易的,直接将‘0’写入到数码管地址中即可;0~9、A~F情形类似,新输入的值放入在0x14中之前的值全部左移一位,在写左移这部分代码for循环时由于数码管地址有些混乱所以调试花费了不少时间。在显示‘+’、‘-’、‘*’时需要左移的不再是一位,需要写一个封装的move函数,当判断出ucChar<255时分别对输入的‘+’、‘-’、‘*’调用move函数后再将输入值放到0x16、0x15、0x14中;其中‘FUN'需要单独判断ucChar是否为0xFF再左移、输入。总结这次的实验由于是数码管与键盘两次合并在一起,所以还是给了比较充足的时间来完成。预习时不太清楚怎么将数码管与键盘相联系,在运行了示例程序后了解到变量ucChar和数组f_szDigital[]起到了桥接的作用。总体来说这次实验还是完成得比较成功的,理解示例程序花费了不少的时间,一旦读懂了程序之后这次实验就可以解决了。(创新)下面代码中用颜色标注的部分是我自己写的代码用来实现题目要求。不过那是一个比较直接的方法,简单易懂。为此我还有一种方法:因为L1包含0~3数码管,L2包含4~7数码管,从左向右分别为3,2,1,0,7,6,5,4。为此数码管上的字符移动起来比较麻烦。我们可以新建一个buffer[8]。每次我们往相应的数码管写入字符的时候,我们可以先写入buffer里面,字符的移动也可以先在buffer里面执行。然后,我们将buffer与原来数码管的地址数组相对应。这样我们便于理解问题,写的程序也比较简练。附件程序代码1#include"44b.h"#include"44blib.h"#include"def.h"#include"iic.h"intf_nKeyPress;unsignedcharf_szDigital[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6,//0~90xEE,0xFF,0x9C,0xFD,0x9E,0x8E,//A8.C0.EF0x1,0x2,0x0,0x92,0x90};//,-close三二voidkeyboard_test(void);voidkeyboard_int(void);UINT8Tkey_set(UINT8TucChar);voidkeyboard_test(void){ inti,j,k; UINT8TucChar,t; iic_init(); for(i=0;i<8;i++) iic_write(0x70,0x10+i,0); //setEINT2interrupthandlerpISR_EINT2=(int)keyboard_int; for(;;) { f_nKeyPress=0; rINTMSK=rINTMSK&(~(BIT_GLOBAL|BIT_EINT2)); //enableEINT2int while(f_nKeyPress==0); iic_read(0x70,0x1,&ucChar); /* if(ucChar!=0) { ucChar=key_set(ucChar); if(ucChar<10)ucChar+=0x30; elseif(ucChar<16)ucChar+=0x37; if(ucChar<255) uart_printf("presskey%c\n",ucChar); if(ucChar==0xFF) { uart_printf("presskeyFUN(exitnow)\n\r"); return; } }*/ if(ucChar!=0) {chart; ucChar=key_set(ucChar); if(ucChar<16) { for(j=3;j>0;j--) { i=j-1; iic_read(0x70,0x10+i,&t); iic_write(0x70,0x10+j,t); } iic_read(0x70,0x10+7,&t); iic_write(0x70,0x10,t); for(j=7;j>4;j--) { k=j-1; iic_read(0x70,0x10+k,&t); iic_write(0x70,0x10+j,t); } iic_write(0x70,0x10+4,f_szDigital[ucChar]); delay(500); } elseif(ucChar<255) { if(ucChar=='+') { move_three(); iic_write(0x70,0x16,0xEE); iic_write(0x70,0x15,0xFD); iic_write(0x70,0x14,0xFD); } if(ucChar=='-') { move_three(); iic_write(0x70,0x16,0xB7); iic_write(0x70,0x15,0x7C); iic_write(0x70,0x14,0xFF); } if(ucChar=='*') { move_two(); iic_write(0x70,0x14,0x1c); iic_write(0x70,0x15,0x7C); } } elseif(ucChar==0xFF) {move_three(); iic_write(0x70,0x16,0x8E); iic_write(0x70,0x15,0x7C); iic_write(0x70,0x14,0xEC); } } }while(1);}voidmove_three(void){inti,j;chart; iic_read(0x70,0x10,&t); iic_write(0x70,0x13,t); for(i=5;i<8;i++) { iic_read(0x70,0x10+i,&t); j=i-5; iic_write(0x70,0x10+j,t); } iic_read(0x70,0x14,&t); iic_write(0x70,0x17,t);}voidmove_two(void){ chart; iic_read(0x70,0x11,&t); iic_write(0x70,0x13,t); iic_read(0x70,0x10,&t); iic_write(0x70,0x12,t); iic_read(0x70,0x17,&t); iic_write(0x70,0x11,t); iic_read(0x70,0x16,&t); iic_write(0x70,0x10,t); iic_read(0x70,0x15,&t); iic_write(0x70,0x17,t); iic_read(0x70,0x14,&t); iic_write(0x70,0x16,t); }/**********************************************************************************************name: keyboard_int*func: keyboardinterrupthandler*para: none*ret: none*modify:*comment: ********************************************************************************************/voidkeyboard_int(void){ UINT8TucChar;delay(1000); rINTMSK=rINTMSK|BIT_EINT2; //disableEINT2intrI_ISPC=BIT_EINT2;f_nKeyPress=1;}/**********************************************************

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论