实验报告
课程名称: 嵌入式系统原理课程设计 姓名: 应海东
实验项目: 矩阵键盘驱动、看门狗实验 班级: 10052313 指导教师: 任彧 学号: 10051329 日期: 2012.11.27 实验目的 键盘驱动实验: 掌握嵌入式系统中断的处理流程; 学习中断式矩阵键盘的驱动原理; 掌握通过CPU 的I/O 扩展键盘的方法。 看门狗实验: 了解看门狗的作用; 掌握看门狗的使用方法。 实验环境 硬件: DM2410实验板; 测控与显示扩展板; PC机; J-Link V8仿真器; 软件: PC机操作系统(WINDOWS XP); ARM Developer Suite v1.2; J-link ARM V4.081; 实验内容矩阵键盘驱动实验代码: (算法、程#include \"def.h\" 序、步骤和#include \"option.h\" 方法) #include \"2410addr.h\" #include \"2410lib.h\" #include \"2410slib.h\" void Led_Test(void); void Led_8_Display(int data); void Led_Output(U8 data); U8 DAT[10]={ 0xfa,0x60,0xdc,0xf4,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //----------------------------------------------------------------- // 函数定义区 //----------------------------------------------------------------- /***************************************************************** * * 函数名 : Key_Test 功能 : 实现键盘扫描 * 参数 : void * 返回值 : void ******************************************************************/ void Key_Test(void) { if(~(rGPFDAT|0xffffff71)) { switch(~(rGPFDAT|0xffffff71)) { case 0x2 :{i=1;break;} case 0x4 :{i=2;break;} case 0x8 :{i=3;break;} case 0x80:{i=4;break;} } rGPBDAT=rGPBDAT|0x80; //GPBCON GPB7 [15:14] = 01 : OUTPUT //GPBCON GPB8 [17:16] = 01 : OUTPUT //GPBCON GPB9 [19:18] = 01 : OUTPUT //GPBCON GPB10 [21:20] = 01 : OUTPUT rGPBCON=rGPBCON|0x154000; rGPBCON=rGPBCON&0x157fff; Uart_Printf(\"\\n\\nPRESS ANY KEY OF PC TO STOP.\\n\"); while(!Uart_GetKey()) { //GPBDAT [10: 7] = 0000 rGPBDAT=rGPBDAT&0x7f; int i,j,count=0; int key = 0; Led_Test(); Uart_Printf(\"\\n\\nPRESS ANY KEY ON ECPEND BOARD\\n\"); //GPFCON GPF [ 1: 0] = 00 : INPUT //GPFCON GPF [ 3: 2] = 00 : INPUT //GPFCON GPF [ 5: 4] = 00 : INPUT //GPFCON GPF [15:14] = 00 : INPUT rGPFCON=rGPFCON&0x3f03;//pf1237=input //GPBDAT [10,9,8,7] = 0001 rGPBDAT=rGPBDAT&0x6ff; rGPBDAT=rGPBDAT&0x5ff; rGPBDAT=rGPBDAT&0x3ff; if(!(~(rGPFDAT|0xffffff71))){j=1;} else { //GPBDAT [10,9,8,7] = 0010 rGPBDAT=rGPBDAT&0x77f; rGPBDAT=rGPBDAT|0x100; rGPBDAT=rGPBDAT&0x5ff; rGPBDAT=rGPBDAT&0x3ff; if(!(~(rGPFDAT|0xffffff71))){j=2;} else { //GPBDAT [10,9,8,7] = 0100 rGPBDAT=rGPBDAT&0x77f; rGPBDAT=rGPBDAT&0x6ff; rGPBDAT=rGPBDAT|0x200; rGPBDAT=rGPBDAT&0x3ff; if(!(~(rGPFDAT|0xffffff71))){j=3; else { j=4; //GPBDAT [10,9,8,7] = 1000 rGPBDAT=rGPBDAT&0x77f; } rGPBDAT=rGPBDAT&0x6ff; rGPBDAT=rGPBDAT&0x5ff; rGPBDAT=rGPBDAT|0x400; } } } Delay(1); if(i == 4 ) { if(j == 1)//a~i key = 41; else if(j == 2)//j~r key = 42; else if(j == 3)//s~z key = 43; else key = 0; } else if(j == 4) { if(i == 1)//A~I key = 14; else if(i == 2)//J~R key = 24; else if(i == 3) key = 34; } Delay(1); switch(i*10 + j)//S~Z { case 11: if(key == 0) Led_8_Display(1); else if(key == 41) Led_8_Display(97);//a else if(key == 42) Led_8_Display(106);//j else if(key == 43) Led_8_Display(115);//s else if(key == 14) Led_8_Display(65); else if(key == 24) Led_8_Display(74); else if(key == 34) Led_8_Display(83); break; case 12: if(key == 0) Led_8_Display(2); else if(key == 41) Led_8_Display(98);//b else if(key == 42) Led_8_Display(107);//k else if(key == 43) Led_8_Display(116);//t else if(key == 14) Led_8_Display(66); else if(key == 24) Led_8_Display(75); else if(key == 34) Led_8_Display(84); break; if(key == 0) Led_8_Display(3); else if(key == 41) Led_8_Display(99);//c else if(key == 42) Led_8_Display(108);//l else if(key == 43) Led_8_Display(117);//u else if(key == 14) Led_8_Display(67); else if(key == 24) Led_8_Display(76); else if(key == 34) Led_8_Display(85); case 13: break; case 21: if(key == 0) Led_8_Display(4); else if(key == 41) Led_8_Display(100);//d else if(key == 42) Led_8_Display(109);//m else if(key == 43) Led_8_Display(118);//v else if(key == 14) Led_8_Display(68); else if(key == 24) Led_8_Display(77); else if(key == 34) Led_8_Display(86); break; case 22: if(key == 0) Led_8_Display(5); else if(key == 41) Led_8_Display(101);//e else if(key == 42) Led_8_Display(110);//n else if(key == 43) Led_8_Display(119);//w else if(key == 14) Led_8_Display(69); else if(key == 24) Led_8_Display(78); else if(key == 34) Led_8_Display(87); break; case 23: if(key == 0) Led_8_Display(6); else if(key == 41) Led_8_Display(102);//f else if(key == 42) Led_8_Display(111);//o else if(key == 43) Led_8_Display(120);//x else if(key == 14) Led_8_Display(70); else if(key == 24) Led_8_Display(79); else if(key == 34) Led_8_Display(88); break; case 31: if(key == 0) Led_8_Display(7); else if(key == 41) Led_8_Display(103);//g else if(key == 42) Led_8_Display(112);//p else if(key == 43) Led_8_Display(121);//y else if(key == 14) Led_8_Display(71); else if(key == 24) Led_8_Display(80); else if(key == 34) Led_8_Display(89); break; case 32: if(key == 0) Led_8_Display(8); else if(key == 41) Led_8_Display(104);//h else if(key == 42) Led_8_Display(113);//q else if(key == 43) Led_8_Display(122);//z else if(key == 14) Led_8_Display(72); else if(key == 24) Led_8_Display(81); else if(key == 34) Led_8_Display(90); break; case 33: } if(key == 0) Led_8_Display(9); } Delay(1); else if(key == 41) Led_8_Display(105);//i else if(key == 42) Led_8_Display(114);//r else if(key == 43) Led_8_Display(0); else if(key == 14) Led_8_Display(73); else if(key == 24) Led_8_Display(82); break; } } Uart_Printf(\"\\n\\nTEST FINISHED!!\"); //================================= //名称:Led_8_Display //功能:将8位数据诸位送出 //参数: void //返回值: void //================================= void Led_Test(void) { } void Led_8_Display(int data) { int j,i=7; U8 num; j=data; for (i=7;i>=0;i--) { num=j%10; j=j/10; Led_Output(DAT[num]); } rGPGDAT=rGPGDAT&0xfeff; //GPGCON GPG5 [11:10] = 01 : Output : RCK //GPGCON GPG6 [13:12] = 01 : Output : DATA OUT //GPGCON GPG7 [15:14] = 01 : Output : CLK rGPGCON=rGPGCON&0xfffd5fff; rGPGCON=rGPGCON|0x15000; } //RCK rGPGDAT=rGPGDAT|0x100; Delay(1); rGPGDAT=rGPGDAT&0xfeff; Delay(1); //================================== //名称:Led_Output //功能:将每位数的8位段数据送出 //参数: void //返回值: void //================================== void Led_Output(U8 data) { } 看门狗实验代码: #define UP_KEY #define void WDTimer_reset (void) { int i = 35; int k = 0; int i = 7; int isWdtInt = 0; rWTCON = ((PCLK/1000000-1)*5<<8) | (3<<3) | (1); Uart_Printf(\"\\nI will restart after %d sec!!!\\n\ 0x41 0x1b if (j%2) else rGPGDAT=rGPGDAT&0xffbf; j=j/2; rGPGDAT=rGPGDAT|0x80; rGPGDAT=rGPGDAT&0xff7f; } rGPGDAT=rGPGDAT|0x40; int i,j; j=data; for (i=7;i>=0;i--)//共8段 { Delay(1); #define DOWN_KEY 0x42 ESC_KEY Uart_Printf(\"\\n[ WatchDog Timer Request Test ]\\n\"); } rWTCNT = 8448*i; rWTDAT = 8448*i; rWTCON = rWTCON | (1<<5); rINTMSK &= ~(BIT_WDT); Uart_Printf(\"Press ESC key to disable the \\\"watch-dog\\\"timer.\\n\"); while (1) { while((k = Uart_GetKey()) != ESC_KEY) { if(k == UP_KEY && --i >= 1) { } else if(k == DOWN_KEY && ++i <= 7) { } Uart_Printf(\"%d \rWTCNT = 8448*i; isWdtInt = 0; rWTCNT = 8448*i; isWdtInt = 0; rGPBDAT = rGPBDAT & 0x7f; Delay(500); rGPBDAT = rGPBDAT | 0x80; rGPBDAT = rGPBDAT | 0x100; Delay(500); } rWTCNT = 8448*7; isWdtInt = 0; } 结论 数码管可以显示0-9,a-z,A-Z的ASCII码值。 通过按键可以更改看门狗定时的时间。 实验心得与1.通过实验了解了中断的处理流程和中断式矩阵键盘的驱动原理,也进一步了解了看门狗小结 的使用方法、功能和作用。 2.多动手,态度要认真,只要坐下来钻研进去没有解决不了的难题。 指导教师
成绩评定: 指导教师签名:
因篇幅问题不能全部显示,请点此查看更多更全内容