矩阵键盘驱动、看门狗实验报告
- 格式:doc
- 大小:63.00 KB
- 文档页数:8
单片机矩阵键盘实验实验报告一、实验目的本次实验的目的是掌握原理和方法,利用单片机识别矩阵键盘并编程实现键码转换功能,控制LED点亮显示。
二、实验原理矩阵键盘是一种由多路单向控制器输入行选择信号与列选择信号连接而形成的一一对应矩阵排列结构。
它广泛应用于电子游戏机、办公自动化设备、医疗仪器、家电控制及书籍检索机器等方面。
本次实验采用的矩阵键盘是一个4 x 4矩阵,用4段数码管显示按键编码,每个按键都可以输入一个代码,矩阵键盘连接单片机,实现一个软件算法来识别键码转化。
从而将键盘中的按键的按下信号转换成程序能够识别的代码,置于相应的输出结果中,控制LED点亮,从而可以实现矩阵键盘按键的转换功能。
三、实验方法1.硬件搭建:矩阵键盘(4行4列)与单片机(Atmel AT89C51)相连,选择引脚连接,并将数码管和LED与单片机相连以实现显示和点亮的功能。
2.程序设计:先建立控制体系,利用中断服务子程序识别和码值转换,利用中断服务子程序实现从按键的按下信号转换为程序能够识别的代码,然后将该代码段编写到单片机程序中,每次按下矩阵键盘按键后单片机给出相应的按键编码输出,用数码管显示,控制LED点亮。
四、实验结果经过实验,成功实现了矩阵键盘与单片机之间的连接,编写了中断服务子程序,完成了按键编码输出与LED点亮的功能。
实验完成后,数码管显示各种按键的编码,同时LED会点亮。
本次实验介绍了矩阵键盘的原理,论述了键码转换的程序设计步骤,并实验完成矩阵键盘与单片机的连接,实现用LED点亮以及数码管显示按键的编码。
通过本次实验,受益匪浅,使我对使用单片机编写算法与程序有了更深入的认识,同时丰富了课堂学习的内容,也使我更加热爱自己所学的专业。
杭州电子科技大学实验报告课程名称:嵌入式系统原理课程设计姓名:应海东实验项目:矩阵键盘驱动、看门狗实验班级: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 DA T[10]={ 0xfa,0x60,0xdc,0xf4,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//-----------------------------------------------------------------// 函数定义区//-----------------------------------------------------------------/***************************************************************** * 函数名: Key_Test* 功能: 实现键盘扫描* 参数: void* 返回值: void******************************************************************/ void Key_Test(void){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 : INPUTrGPFCON=rGPFCON&0x3f03;//pf1237=input//GPBCON GPB7 [15:14] = 01 : OUTPUT//GPBCON GPB8 [17:16] = 01 : OUTPUT//GPBCON GPB9 [19:18] = 01 : OUTPUT//GPBCON GPB10 [21:20] = 01 : OUTPUTrGPBCON=rGPBCON|0x154000;rGPBCON=rGPBCON&0x157fff;Uart_Printf("\n\nPRESS ANY KEY OF PC TO STOP.\n");while(!Uart_GetKey()){//GPBDA T [10: 7] = 0000rGPBDAT=rGPBDA T&0x7f;if(~(rGPFDA T|0xffffff71)){switch(~(rGPFDA T|0xffffff71)){case 0x2 :{i=1;break;}case 0x4 :{i=2;break;}case 0x8 :{i=3;break;}case 0x80:{i=4;break;}}//GPBDA T [10,9,8,7] = 0001rGPBDAT=rGPBDA T|0x80;rGPBDAT=rGPBDA T&0x6ff;rGPBDAT=rGPBDA T&0x5ff;rGPBDAT=rGPBDA T&0x3ff;if(!(~(rGPFDA T|0xffffff71))){j=1;}else{//GPBDA T [10,9,8,7] = 0010rGPBDAT=rGPBDA T&0x77f;rGPBDAT=rGPBDA T|0x100;rGPBDAT=rGPBDA T&0x5ff;rGPBDAT=rGPBDA T&0x3ff;if(!(~(rGPFDA T|0xffffff71))){j=2;}else{//GPBDA T [10,9,8,7] = 0100rGPBDAT=rGPBDA T&0x77f;rGPBDAT=rGPBDA T&0x6ff;rGPBDAT=rGPBDA T|0x200;rGPBDAT=rGPBDA T&0x3ff;if(!(~(rGPFDA T|0xffffff71))){j=3;}else{j=4;//GPBDA T [10,9,8,7] = 1000rGPBDAT=rGPBDA T&0x77f;rGPBDAT=rGPBDA T&0x6ff;rGPBDAT=rGPBDA T&0x5ff;rGPBDAT=rGPBDA T|0x400;}}}Delay(1);if(i == 4 ){if(j == 1)//a~ikey = 41;else if(j == 2)//j~rkey = 42;else if(j == 3)//s~zkey = 43;elsekey = 0;}else if(j == 4){if(i == 1)//A~Ikey = 14;else if(i == 2)//J~Rkey = 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);//aelse if(key == 42) Led_8_Display(106);//jelse if(key == 43) Led_8_Display(115);//selse 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);//belse if(key == 42) Led_8_Display(107);//kelse if(key == 43) Led_8_Display(116);//telse if(key == 14) Led_8_Display(66);else if(key == 24) Led_8_Display(75);else if(key == 34) Led_8_Display(84);break;case 13:if(key == 0) Led_8_Display(3);else if(key == 41) Led_8_Display(99);//celse if(key == 42) Led_8_Display(108);//lelse if(key == 43) Led_8_Display(117);//uelse if(key == 14) Led_8_Display(67);else if(key == 24) Led_8_Display(76);else if(key == 34) Led_8_Display(85);break;case 21:if(key == 0) Led_8_Display(4);else if(key == 41) Led_8_Display(100);//delse if(key == 42) Led_8_Display(109);//melse if(key == 43) Led_8_Display(118);//velse if(key == 14) Led_8_Display(68);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);//eelse if(key == 42) Led_8_Display(110);//nelse if(key == 43) Led_8_Display(119);//welse 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);//felse if(key == 42) Led_8_Display(111);//oelse if(key == 43) Led_8_Display(120);//xelse 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);//gelse if(key == 42) Led_8_Display(112);//pelse if(key == 43) Led_8_Display(121);//yelse 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);//helse if(key == 42) Led_8_Display(113);//qelse if(key == 43) Led_8_Display(122);//zelse 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:else if(key == 41) Led_8_Display(105);//ielse if(key == 42) Led_8_Display(114);//relse if(key == 43) Led_8_Display(0);else if(key == 14) Led_8_Display(73);else if(key == 24) Led_8_Display(82);break;}Delay(1);}}Uart_Printf("\n\nTEST FINISHED!!");}//=================================//名称:Led_8_Display//功能:将8位数据诸位送出//参数: void//返回值: void//=================================void Led_Test(void){//GPGCON GPG5 [11:10] = 01 : Output : RCK//GPGCON GPG6 [13:12] = 01 : Output : DATA OUT//GPGCON GPG7 [15:14] = 01 : Output : CLKrGPGCON=rGPGCON&0xfffd5fff;rGPGCON=rGPGCON|0x15000;rGPGDA T=rGPGDA T&0xfeff;}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(DA T[num]);}//RCKrGPGDA T=rGPGDA T|0x100;Delay(1);rGPGDA T=rGPGDA T&0xfeff;Delay(1);}//==================================//名称:Led_Output//功能:将每位数的8位段数据送出//参数: void//返回值: void//==================================void Led_Output(U8 data){int i,j;j=data;for (i=7;i>=0;i--)//共8段{if (j%2)rGPGDA T=rGPGDA T|0x40;elserGPGDA T=rGPGDA T&0xffbf;j=j/2;rGPGDA T=rGPGDA T|0x80;Delay(1);rGPGDA T=rGPGDA T&0xff7f;}}看门狗实验代码:#define UP_KEY 0x41#define DOWN_KEY 0x42#define ESC_KEY 0x1bvoid WDTimer_reset (void){int i = 35;int k = 0;int i = 7;int isWdtInt = 0;Uart_Printf("\n[ WatchDog Timer Request Test ]\n");rWTCON = ((PCLK/1000000-1)*5<<8) | (3<<3) | (1);Uart_Printf("\nI will restart after %d sec!!!\n", i);rWTCNT = 8448*i;rWTDA T = 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){rWTCNT = 8448*i;isWdtInt = 0;}else if(k == DOWN_KEY && ++i <= 7){rWTCNT = 8448*i;isWdtInt = 0;}Uart_Printf("%d ", isWdtInt++);rGPBDA T = rGPBDA T & 0x7f;Delay(500);rGPBDA T = rGPBDA T | 0x80;rGPBDA T = rGPBDA T | 0x100;Delay(500);}rWTCNT = 8448*7;isWdtInt = 0;}}结论数码管可以显示0-9,a-z,A-Z的ASCII码值。
一、实验目的1. 掌握矩阵式键盘的工作原理及电路设计方法。
2. 熟悉单片机与矩阵键盘的接口连接及编程技巧。
3. 提高动手实践能力,培养创新意识。
二、实验设备1. 单片机实验平台2. 矩阵键盘模块3. 数字多用表4. 编译器(如Keil51)5. 连接线三、实验原理矩阵键盘是一种常用的键盘设计方式,通过行列交叉点连接按键,从而实现多个按键共用较少的I/O端口。
矩阵键盘通常采用逐行扫描的方式检测按键状态,当检测到按键按下时,根据行列线的电平状态确定按键位置。
四、实验内容1. 矩阵键盘电路设计2. 矩阵键盘编程3. 矩阵键盘测试与调试五、实验步骤1. 电路设计(1)根据矩阵键盘的规格,确定行线和列线的数量。
(2)将行线和列线分别连接到单片机的I/O端口。
(3)在行线上串联电阻,防止按键抖动。
(4)连接电源和地线。
2. 编程(1)初始化单片机的I/O端口,将行线设置为输出,列线设置为输入。
(2)编写逐行扫描程序,逐行拉低行线,读取列线状态。
(3)根据行列线状态判断按键位置,并执行相应的操作。
3. 测试与调试(1)将编写好的程序下载到单片机中。
(2)连接矩阵键盘,观察按键是否正常工作。
(3)使用数字多用表检测行列线电平,确保电路连接正确。
(4)根据测试结果,对程序进行调试,直到矩阵键盘正常工作。
六、实验结果与分析1. 电路连接正确,按键工作正常。
2. 逐行扫描程序能够正确检测按键位置。
3. 按键操作能够触发相应的程序功能。
七、实验总结1. 通过本次实训,掌握了矩阵式键盘的工作原理及电路设计方法。
2. 熟悉了单片机与矩阵键盘的接口连接及编程技巧。
3. 提高了动手实践能力,培养了创新意识。
八、心得体会1. 在实验过程中,遇到了电路连接错误和程序调试困难等问题,通过查阅资料、请教老师和同学,最终成功解决了问题。
2. 本次实训让我深刻体会到理论知识与实际操作相结合的重要性,同时也认识到团队合作的重要性。
九、改进建议1. 在电路设计过程中,可以考虑增加去抖动电路,提高按键稳定性。
矩阵键盘实验报告佘成刚学号2010302001班级08041202时间2016.01.20一、实验目的1.学习矩列式键盘工作原理;2.学习矩列式接口的程序设计。
二、实验设备普中HC6800ESV20开发板三、实验要求要现:用4*4矩阵键盘,用按键形式输入学号,在数码管上显示对应学号。
四、实验原理工作原理:矩阵式由行线和列线组成,按键位于行、列的交叉点上。
如图所示,一个4*4 的行、列结构可以构成一个由16 个按键的键盘。
很明显,在按键数量较多的场合,矩阵式键盘与独立式键盘相比,要节省很多的I/0 口。
(1)矩阵式键盘工作原理按键设置在行、列交节点上,行、列分别连接到按键开关的两端。
行线通过下拉电阻接到GND 上。
平时无按键动作时,行线处于低电平状态,而当有按键按下时,行线电平状态将由与此行线相连的列线电平决定。
列线电平如果为低,行线电平为高,列线电平如果为高,则行线电平则为低。
这一点是识别矩阵式键盘是否被按下的关键所在。
因此,各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。
(2)按键识别方法下面以3 号键被按下为例,来说明此键是如何被识别出来的。
前已述及,键被按下时,与此键相连的行线电平将由与此键相连的列线电平决定,而行线电平在无键按下时处于高电平状态。
如果让所有列线处于高电平那么键按下与否不会引起行线电平的状态变化,始终是高电平,所以,让所有列线处于高电平是没法识别出按键的。
现在反过来,让所有列线处于低电平,很明显,按下的键所在行电平将也被置为低电平,根据此变化,便能判定该行一定有键被按下。
但我们还不能确定是这一行的哪个键被按下。
所以,为了进一步判定到底是哪—列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线处于高电平。
当第1 列为低电平,其余各列为高电平时,因为是键3 被按下,所以第1 行仍处于高电平状态;当第2 列为低电平,其余各列为高电平时,同样我们会发现第1 行仍处于高电平状态,直到让第4 列为低电平,其余各列为高电平时,因为是3 号键被按下,所以第1 行的高电平转换到第4 列所处的低电平,据此,我们确信第1 行第4 列交叉点处的按键即3 号键被按下。
矩阵键盘设计实验报告
矩阵键盘是一种特殊的电子输入设备,其特殊性在于每个按键可以仅由几根线连接而成。
这可以将按键尺寸缩小,同时也减少了接線复杂度。
在本次实验中,我们设计了一个4*4的矩阵键盘。
矩阵键盘的外型是4 *4的按键,其中每个按键由一个PIN组成,连接起来分别连接在一个不同的ROW与COL上。
在使用矩阵键盘时,我们将其连接到一台电脑上,通过电脑程序监视每行每列的通断状态,当一行或者一列被按下,程序会自动捕捉,来表示一个字符或者code.
首先,我们先准备一台电脑,再连接矩阵键盘的各个PIN,用8个信号线将矩阵键盘连接到单片机,再用USB线将单片机连接到电脑上,使用PL 2303驱动链接矩阵键盘和电脑终端。
单片机负责捕获ROW和COL的信号,计算并识别矩阵键盘的按键,将计算出的字符发送至电脑终端,进行小程序的检测。
在电脑端,我们使用Apple系统的终端运行.bash,编写简单的shell脚本实现对矩阵键盘信号识别。
脚本将不断检测矩阵键盘信号状态,根据捕捉到的ROW和COL信号,将其映射出字符信息,在一定时间内输出至终端。
在实验的最后,我们检验了所设计的矩阵键盘是否符合预期效果。
通过代码发送进行按键操作,能检测到正确的字符,表明矩阵键盘的设计及实现满足要求。
本次实验可以作为以后矩阵键盘的参考,深入研究程序软件,提高实验效率。
华南农业大学实验报告专业班次08电信1 组别200831120102 题目实验四矩阵键盘实验姓名陈建泽日期2010.11.03一、实验目的1. 学习非编码键盘的工作原理和键盘的扫描方式。
2. 学习键盘的去抖方法和键盘应用程序的设计。
二、实验设备:STC89C52单片机实验板、串口下载线、USB连接线、电脑三、实验原理键盘是单片机应用系统接受用户命令的重要方式。
单片机应用系统一般采用非编码键盘,需要由软件根据键扫描得到的信息产生键值编码,以识别不同的键。
本板采用4*4矩阵键盘,行信号分别为P1.0-P1.3,列信号分别为P1.4-P1.7。
具体电路连接见下图矩阵键盘电路原理图对于键的识别一般采用逐行(列)扫描查询法,判断键盘有无键按下,由单片机I/O口向键盘送全扫描字,然后读入列线状态来判断。
成绩:教师:日期:四、实验步骤1. 分析实验所用到的电路原理图,根据需要连接跳线帽(由于P1.3和P1.4管脚和实时时钟芯片DS1302复用,所有在做矩阵键盘实验的时候务必拔去板上的DS1302芯片,以免产生干扰)。
2.按不同的键,用数码管的最后一位显示按键的键值。
3. 画出流程图。
4.根据流程图编写实验程序,并完成调试。
五、实验流程图矩阵键盘实验流程图六、实验程序/******************实验四 矩阵键盘实验****************/;实验名称:矩阵键盘实验;功 能:4*4矩阵键盘,按不同的键,用数码管的最后一位显示按键的键值。
1.置所有行值为低电平2.读取列的状态,给 A 开始A !=0? 延时10ms ,去抖动 置行计数器R0=00H 列列计数器R1=00H 置行输出扫描初始值为0FEH 输出行扫描字,置某一行为低 有列被按下? 行计数器增1 行扫描字左移一位 最后一行? 判断具体是哪一列按下 存列号到R1 计算键值并显示;编写人:陈建泽;编写时间:2010年11月2日/**********************程序代码************************/ORG 0000H ;上电或复位后初始化引导程序地址AJMP MAIN ;跳转到主程序ORG 0000HAJMP MAINORG 0030HMAIN: MOV P2,#0F7H ;选通数码管最后一位MOV P1,#0F0H ;令所有行为低电平MOV R7,#100 ;让P1输出稳定DJNZ R7,$MOV A,P1 ;先确定是否有键按下ANL A,#0F0HXRL A,#0F0H ;与上一句作用,判断是否有按键按下JZ MAIN ;无则重新扫描LCALL D10MS ;延时10ms,去除抖;判断是否确实有按键按下MOV A,#00HMOV R0,A ;R0做行计数器,初始值为0MOV R1,A ;R1做列计数器,初始值为0MOV R2,#0FEH ;R2低4位为行扫描子,初始值为1111 1110B SKEY0:MOV A,R2MOV P1,A ;输出行扫描字,先扫第一行MOV R7,#10 ;让P1输出稳定DJNZ R7,$MOV A,P1 ;读列值ANL A,#0F0HXRL A,#0F0H ;取列值JNZ LKEY ;A不为零,则确实有按键按下了;然后转去判断具体是哪一列INC R0 ;增1,记录准备扫描的下一行MOV A,R2RL A ;不带进位位,左移一位,准备扫描下一行MOV R2,AMOV A,R0 ;判断是否已经四行都扫描完了CJNE A,#04H,SKEY0AJMP MAIN ;都扫描完则循环开始;判断具体列值LKEY: JNB ACC.4,NEXT1 ;若ACC.4为1,则是第一列有按键按下了MOV A,#00H ;存0列号到R1MOV R1,AAJMP DKEY ;去计算键值并显示NEXT1:JNB ACC.5,NEXT2MOV A,#01H ;存1列号到R1MOV R1,AAJMP DKEYNEXT2:JNB ACC.6,NEXT3MOV A,#02H ;存2列号到R1MOV R1,AAJMP DKEYNEXT3:JNB ACC.7,MAIN ;到第四列都检测不到,则从新开始MOV A,#03H ;存3列号到R1MOV R1,AAJMP DKEY;计算键值并显示键值DKEY: MOV A,R0 ;取行号给AMOV B,#04HMUL ABADD A,R1 ;根据键值=行号*4+列号计算出具体键值AJMP SQR ;根据键值查询字型码/*********************查表子程序***************************/SQR: MOV DPTR,#TAB ;表首地址给DPTRMOVC A,@A+DPTR ;查第一个字型的字型码MOV P0,A ;送段码,数码管显示具体值AJMP MAIN ;返回开始TAB: DB 0C0H,0F9H,0A4H,0B0H,99H, 92H, 82H, 0F8H ;共阳极字型码表0——7 DB 80H, 90H, 88H, 83H, 0C6H,0A1H,86H, 8EH ;共阳极字型码表8——F/*********************10ms延时子程序**********************/D10MS:MOV R6,#10L1:MOV R5,#248DJNZ R5,$DJNZ R6,L1RETEND/*********************程序编写结束*************************/根据实验流程图,编写出一下实验程序。
一、实训背景随着电子技术的飞速发展,按键技术在电子设备中的应用越来越广泛。
矩阵按键因其结构紧凑、易于扩展等优点,被广泛应用于各类电子设备中。
为了提高学生对矩阵按键原理和应用的理解,本次实训选取了矩阵按键作为实训内容。
二、实训目的1. 理解矩阵按键的原理和结构;2. 掌握矩阵按键的驱动程序编写;3. 学会使用矩阵按键实现简单功能;4. 提高学生的动手能力和实践能力。
三、实训内容1. 矩阵按键原理与结构矩阵按键是一种利用行列交叉原理来检测按键状态的按键电路。
它由若干行和列组成,通过行列交叉的交叉点连接按键。
当按键被按下时,相应的行和列被连接,从而实现按键的识别。
2. 矩阵按键驱动程序编写以51单片机为例,介绍矩阵按键驱动程序的编写方法。
(1)初始化矩阵按键:设置行线为输出,列线为输入,并对行线进行上拉。
(2)扫描按键:从第一行开始,依次将行线置低电平,其他行线置高电平,然后读取列线的状态。
如果列线为低电平,则表示该行对应的按键被按下。
(3)消抖处理:为了避免按键抖动引起的误判,需要对按键状态进行消抖处理。
3. 使用矩阵按键实现简单功能以一个简单的计算器为例,介绍使用矩阵按键实现计算器功能的方法。
(1)设计计算器界面:根据计算器的功能需求,设计按键布局。
(2)编写按键扫描程序:根据按键布局,编写按键扫描程序,实现按键的识别。
(3)编写功能实现程序:根据计算器的功能需求,编写功能实现程序,如加、减、乘、除等。
四、实训过程1. 实训准备:准备51单片机开发板、矩阵按键模块、电源等实验器材。
2. 矩阵按键原理与结构学习:通过查阅资料,了解矩阵按键的原理和结构。
3. 矩阵按键驱动程序编写:根据实训要求,编写矩阵按键驱动程序。
4. 矩阵按键功能实现:使用矩阵按键实现计算器功能,包括按键扫描、消抖处理、功能实现等。
5. 实验调试:对实验程序进行调试,确保程序正常运行。
五、实训总结通过本次实训,我掌握了矩阵按键的原理和结构,学会了矩阵按键驱动程序的编写,以及使用矩阵按键实现简单功能的方法。
矩阵键盘实验报告矩阵键盘实验报告引言:矩阵键盘是一种常见的输入设备,广泛应用于电子产品中。
本实验旨在通过对矩阵键盘的研究和实验,深入了解其原理和工作机制,并探索其在实际应用中的潜力。
本文将从实验目的、实验步骤、实验结果和讨论四个方面进行论述。
实验目的:1. 理解矩阵键盘的工作原理;2. 掌握矩阵键盘的接线方法;3. 通过实验验证矩阵键盘的可靠性和稳定性。
实验步骤:1. 准备实验材料:矩阵键盘、电路板、导线等;2. 连接电路:将矩阵键盘与电路板通过导线连接;3. 编写程序:使用C语言编写程序,实现对矩阵键盘的扫描和按键检测;4. 烧录程序:将编写好的程序烧录到单片机中;5. 运行实验:按下矩阵键盘上的按键,观察电路板上的指示灯是否亮起。
实验结果:经过实验,我们成功地完成了矩阵键盘的接线和程序烧录,并进行了按键测试。
在按下不同的按键时,电路板上相应的指示灯亮起,证明了矩阵键盘的正常工作。
讨论:1. 矩阵键盘的工作原理:矩阵键盘是由行线和列线组成的,每个按键都与行线和列线相连。
当按下某个按键时,对应的行线和列线会短接,从而使得电流流过该按键,被检测到。
2. 矩阵键盘的接线方法:在本实验中,我们采用了常见的4行4列的接线方式,即将矩阵键盘的4个行线连接到单片机的4个输入引脚上,将4个列线连接到单片机的4个输出引脚上。
3. 矩阵键盘的可靠性和稳定性:通过实验,我们发现矩阵键盘具有较高的可靠性和稳定性。
即使在长时间使用和频繁按键的情况下,矩阵键盘仍能正常工作,并且按键的检测准确率较高。
4. 矩阵键盘的应用潜力:矩阵键盘广泛应用于各种电子产品中,如计算机、手机、电视遥控器等。
它具有结构简单、成本低廉、易于集成等优点,因此在电子产品设计中具有广阔的应用前景。
结论:通过本次实验,我们对矩阵键盘的工作原理和接线方法有了更深入的了解,并验证了其可靠性和稳定性。
矩阵键盘作为一种常见的输入设备,在电子产品设计中具有重要的地位和潜力。
矩阵式键盘实验报告矩阵键盘设计实验报告南京林业大学实验报告基于AT89C51单片机4x4矩阵键盘接口电路设计课程院系班级学号姓名指导老师机电一体化设计基础机械电子工程学院杨雨图2013年9月26日一、实验目的1、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。
2、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。
3、掌握利用Keil51软件对程序进行编译。
4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。
5、会根据实际功能,正确选择单片机功能接线,编制正确程序。
对实验结果能做出分析和解释,能写出符合规格的实验报告。
二、实验要求通过实训,学生应达到以下几方面的要求:素质要求1.以积极认真的态度对待本次实训,遵章守纪、团结协作。
2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立工作能力。
能力要求1.模拟电路的理论知识2.脉冲与数字电路的理念知识3.通过模拟、数字电路实验有一定的动手能力4.能熟练的编写8951单片机汇编程序5.能够熟练的运用仿真软件进行仿真三、实验工具1、软件:Proteus软件、keil51。
2、硬件:PC机,串口线,并口线,单片机开发板四、实验内容1、掌握并理解“矩阵键盘扫描”的原理及制作,了解各元器件的参数及格元器件的作用。
2、用keil51测试软件编写AT89C51单片机汇编程序3、用Proteus软件绘制“矩阵键盘扫描”电路原理图。
4、运用仿真软件对电路进行仿真。
五.实验基本步骤1、用Proteus绘制“矩阵键盘扫描”电路原理图。
2、编写程序使数码管显示当前闭合按键的键值。
3、利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状态和按键开关的对应关系。
4、用keil51软件编写程序,并生成HEX文件。
5、根据绘制“矩阵键盘扫描”电路原理图,搭建相关硬件电路。
6、用通用编程器或ISP下载HEX程序到MCU。
[单片机矩阵键盘实验实验报告范文]矩阵键盘实验心得实验五矩阵键盘实验一、实验内容1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。
按其它键退出。
2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。
可定义“A”键为“+”键,“B”键为“=”键。
二、实验目的学习独立式按键的查询识别方法。
2、非编码矩阵键盘的行反转法识别方法。
三、实验说明1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。
2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。
3、识别键的闭合,通常采用行扫描法和行反转法。
行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。
行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。
然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。
这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。
由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。
行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0某F0;假如此时没有人按键,从P1口读出的值应仍为0某F0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0某B0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0某BF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0某BE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
杭州电子科技大学实验报告课程名称:嵌入式系统原理课程设计姓名:应海东实验项目:矩阵键盘驱动、看门狗实验班级: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 DA T[10]={ 0xfa,0x60,0xdc,0xf4,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//-----------------------------------------------------------------// 函数定义区//-----------------------------------------------------------------/***************************************************************** * 函数名: Key_Test* 功能: 实现键盘扫描* 参数: void* 返回值: void******************************************************************/ void Key_Test(void){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 : INPUTrGPFCON=rGPFCON&0x3f03;//pf1237=input//GPBCON GPB7 [15:14] = 01 : OUTPUT//GPBCON GPB8 [17:16] = 01 : OUTPUT//GPBCON GPB9 [19:18] = 01 : OUTPUT//GPBCON GPB10 [21:20] = 01 : OUTPUTrGPBCON=rGPBCON|0x154000;rGPBCON=rGPBCON&0x157fff;Uart_Printf("\n\nPRESS ANY KEY OF PC TO STOP.\n");while(!Uart_GetKey()){//GPBDA T [10: 7] = 0000rGPBDAT=rGPBDA T&0x7f;if(~(rGPFDA T|0xffffff71)){switch(~(rGPFDA T|0xffffff71)){case 0x2 :{i=1;break;}case 0x4 :{i=2;break;}case 0x8 :{i=3;break;}case 0x80:{i=4;break;}}//GPBDA T [10,9,8,7] = 0001rGPBDAT=rGPBDA T|0x80;rGPBDAT=rGPBDA T&0x6ff;rGPBDAT=rGPBDA T&0x5ff;rGPBDAT=rGPBDA T&0x3ff;if(!(~(rGPFDA T|0xffffff71))){j=1;}else{//GPBDA T [10,9,8,7] = 0010rGPBDAT=rGPBDA T&0x77f;rGPBDAT=rGPBDA T|0x100;rGPBDAT=rGPBDA T&0x5ff;rGPBDAT=rGPBDA T&0x3ff;if(!(~(rGPFDA T|0xffffff71))){j=2;}else{//GPBDA T [10,9,8,7] = 0100rGPBDAT=rGPBDA T&0x77f;rGPBDAT=rGPBDA T&0x6ff;rGPBDAT=rGPBDA T|0x200;rGPBDAT=rGPBDA T&0x3ff;if(!(~(rGPFDA T|0xffffff71))){j=3;}else{j=4;//GPBDA T [10,9,8,7] = 1000rGPBDAT=rGPBDA T&0x77f;rGPBDAT=rGPBDA T&0x6ff;rGPBDAT=rGPBDA T&0x5ff;rGPBDAT=rGPBDA T|0x400;}}}Delay(1);if(i == 4 ){if(j == 1)//a~ikey = 41;else if(j == 2)//j~rkey = 42;else if(j == 3)//s~zkey = 43;elsekey = 0;}else if(j == 4){if(i == 1)//A~Ikey = 14;else if(i == 2)//J~Rkey = 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);//aelse if(key == 42) Led_8_Display(106);//jelse if(key == 43) Led_8_Display(115);//selse 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);//belse if(key == 42) Led_8_Display(107);//kelse if(key == 43) Led_8_Display(116);//telse if(key == 14) Led_8_Display(66);else if(key == 24) Led_8_Display(75);else if(key == 34) Led_8_Display(84);break;case 13:if(key == 0) Led_8_Display(3);else if(key == 41) Led_8_Display(99);//celse if(key == 42) Led_8_Display(108);//lelse if(key == 43) Led_8_Display(117);//uelse if(key == 14) Led_8_Display(67);else if(key == 24) Led_8_Display(76);else if(key == 34) Led_8_Display(85);break;case 21:if(key == 0) Led_8_Display(4);else if(key == 41) Led_8_Display(100);//delse if(key == 42) Led_8_Display(109);//melse if(key == 43) Led_8_Display(118);//velse if(key == 14) Led_8_Display(68);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);//eelse if(key == 42) Led_8_Display(110);//nelse if(key == 43) Led_8_Display(119);//welse 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);//felse if(key == 42) Led_8_Display(111);//oelse if(key == 43) Led_8_Display(120);//xelse 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);//gelse if(key == 42) Led_8_Display(112);//pelse if(key == 43) Led_8_Display(121);//yelse 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);//helse if(key == 42) Led_8_Display(113);//qelse if(key == 43) Led_8_Display(122);//zelse 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:else if(key == 41) Led_8_Display(105);//ielse if(key == 42) Led_8_Display(114);//relse if(key == 43) Led_8_Display(0);else if(key == 14) Led_8_Display(73);else if(key == 24) Led_8_Display(82);break;}Delay(1);}}Uart_Printf("\n\nTEST FINISHED!!");}//=================================//名称:Led_8_Display//功能:将8位数据诸位送出//参数: void//返回值: void//=================================void Led_Test(void){//GPGCON GPG5 [11:10] = 01 : Output : RCK//GPGCON GPG6 [13:12] = 01 : Output : DATA OUT//GPGCON GPG7 [15:14] = 01 : Output : CLKrGPGCON=rGPGCON&0xfffd5fff;rGPGCON=rGPGCON|0x15000;rGPGDA T=rGPGDA T&0xfeff;}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(DA T[num]);}//RCKrGPGDA T=rGPGDA T|0x100;Delay(1);rGPGDA T=rGPGDA T&0xfeff;Delay(1);}//==================================//名称:Led_Output//功能:将每位数的8位段数据送出//参数: void//返回值: void//==================================void Led_Output(U8 data){int i,j;j=data;for (i=7;i>=0;i--)//共8段{if (j%2)rGPGDA T=rGPGDA T|0x40;elserGPGDA T=rGPGDA T&0xffbf;j=j/2;rGPGDA T=rGPGDA T|0x80;Delay(1);rGPGDA T=rGPGDA T&0xff7f;}}看门狗实验代码:#define UP_KEY 0x41#define DOWN_KEY 0x42#define ESC_KEY 0x1bvoid WDTimer_reset (void){int i = 35;int k = 0;int i = 7;int isWdtInt = 0;Uart_Printf("\n[ WatchDog Timer Request Test ]\n");rWTCON = ((PCLK/1000000-1)*5<<8) | (3<<3) | (1);Uart_Printf("\nI will restart after %d sec!!!\n", i);rWTCNT = 8448*i;rWTDA T = 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){rWTCNT = 8448*i;isWdtInt = 0;}else if(k == DOWN_KEY && ++i <= 7){rWTCNT = 8448*i;isWdtInt = 0;}Uart_Printf("%d ", isWdtInt++);rGPBDA T = rGPBDA T & 0x7f;Delay(500);rGPBDA T = rGPBDA T | 0x80;rGPBDA T = rGPBDA T | 0x100;Delay(500);}rWTCNT = 8448*7;isWdtInt = 0;}}结论数码管可以显示0-9,a-z,A-Z的ASCII码值。