首页 4X4扫描式矩阵键盘课程设计讲解

4X4扫描式矩阵键盘课程设计讲解

举报
开通vip

4X4扫描式矩阵键盘课程设计讲解4X4扫描式矩阵键盘课程设计讲解4X4扫描式矩阵键盘课程设计讲解PAGEPAGEPAGE-13-4X4扫描式矩阵键盘课程设计讲解4x4矩阵键盘识别设计班级:1221201专业:测控技术与仪器姓名:涂勇学号:201220120110指导老师:钟念兵东华理工大学2016年1月1日摘要随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,电子式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。矩阵式键盘提高效率进行按键操作管理有效方法,它可以...

4X4扫描式矩阵键盘课程设计讲解
4X4扫描式矩阵键盘课程设计讲解4X4扫描式矩阵键盘课程设计讲解PAGEPAGEPAGE-13-4X4扫描式矩阵键盘课程设计讲解4x4矩阵键盘识别设计班级:1221201专业:测控技术与仪器姓名:涂勇学号:201220120110指导老师:钟念兵东华理工大学2016年1月1日摘要随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,电子式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,显示在LED数码管上。单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。4*4矩阵式键盘采用STM32嵌入式微处理器为核心,主要由矩阵式键盘电路、硬件电路、显示电路等组成,软件选用C语言编程。STM32将检测到的按键信号转换成数字量,显示于LED显示器上。该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。目录第一章:系统功能要求--------------------------------------------------------4*4矩阵式键盘系统概述------------------------------------------------本设计任务和主要内容---------------------------------------------------第二章:系统硬件电路的设计------------------------------------------------硬件系统主要思路和电路原理图---------------------------------------硬件上键盘规划----------------------------------------------------------第三章:系统程序的设计------------------------------------------------------程序的编写步骤-----------------------------------------------------------编写的源程序--------------------------------------------------------------第四章: 心得体会 决胜全面小康心得体会学党史心得下载党史学习心得下载军训心得免费下载党史学习心得下载 ---------------------------------------------------------------第一章:系统功能要求4*4矩阵式键盘系统概述利用STM32对4*4矩阵键盘进行动态扫描,当有按键盘的键时,可将相应按键值(0~F)实时显示在数码管上。由—(列)和—(行)组成4*4矩阵键盘,p0口接LED静态显示电路。由于p0口内部无上拉电阻,因此必须外部接上上拉电阻,其值的选择可以根据LED数码管发光电流及其亮度来决定。通过编写4*4键盘的驱动程序,当有键盘按下时,能够在led数码管与按键的键值对应的数字。0321最常见键盘布局如下图所示。一般由16个按键组成,在单片机中正好可以用一个p口实现16个按键功能,这也是单片机系统中最常见的形式,本设计就采用这个键盘模式。45678B9AFCDE图本设计任务和主要内容本论文主要研究STM32嵌入式控制器控制的键盘识别显示系统,分别对按键信息和显示电路以及软、硬件各个部分进行研究。主要内容如下:根据矩阵式键盘的特点,进行键盘控制系统的整体研究与设计;熟练掌握protues软件的使用,并能够按要求对设计的电路进行仿真,实现相应的功能;LED实时显示按键的信息;采用软件编程的方法实现按键信息的提取和显示。第二章:系统硬件电路的设计硬件系统主要思路和电路原理图首先,把纵向三线设置为推挽输出,然后把横向三线设置为下拉输入,然后读取横向三线的值,如果有接口的读数为1,说明有按键按下了,把该值与0x07相与后放到scana,然后左移4位放到result中,这之后把横向三线设置为推挽输出,纵向三线设置为下拉输入,然后读取纵向三线的值,把相应的键值保存到scanb中,然后通过移位使得低四位表示的是相应的按键所在横向的值,然后与result相或放到result的低四位,这样得到的result高四位就是按键所在纵向的值,低四位就是按键所在横向的值,由此就可以检测到那个按键被按下了。   效果:按下相应的键盘,四个led灯会显示各种不同的状态,hoho,一共有9种状态。用protrus仿真软件所画的仿真图如下:图仿真原理图硬件上的键盘规划stm32矩阵键盘这是硬件上的键盘规划文件*****************************/#include""structio_port{                                           GPIO_TypeDef*GPIO_x;                unsignedshortGPIO_pin;};        staticstructio_portkey_output[4]={{GPIOD,GPIO_Pin_0},{GPIOD,GPIO_Pin_1},{GPIOD,GPIO_Pin_2},{GPIOD,GPIO_Pin_3}};staticstructio_portkey_input[4]={{GPIOD,GPIO_Pin_4},{GPIOD,GPIO_Pin_5},{GPIOD,GPIO_Pin_6},{GPIOD,GPIO_Pin_7}};unsignedcharkey[4][4];voidkeyboard_init(void){   GPIO_InitTypeDefGPIO_InitStructure;unsignedchari;/*键盘行扫描输出线输出高电平*//*PA0PA1PA2PA3输出*/   =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;   =GPIO_Mode_Out_PP;   =GPIO_Speed_50MHz;   GPIO_Init(GPIOD,&GPIO_InitStructure);/*键盘列扫描输入线键被按时输入高电平放开输入低电平*//*PA4PA5PA6PA7输入*/   =GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;   = GPIO_Mode_IPU;   GPIO_Init(GPIOD,&GPIO_InitStructure);for(i=0;i<4;i++){ GPIO_SetBits(key_output[i].GPIO_x,key_output[i].GPIO_pin);}}voidupdate_key(void){unsignedchari,j;for(i=0;i<4;i++)            PIO_x,key_output[i].GPIO_pin);   for(j=0;j<4;j++)           PIO_x,key_input[j].GPIO_pin)==0)  {   key[i][j]=1;  }else{   key[i][j]=0;  } } GPIO_SetBits(key_output[i].GPIO_x,key_output[i].GPIO_pin);}}//_________________________________________________//参考了下基于avr的矩阵键盘程序,耐着性子移植到符合上面硬件规划的stm32板子上。volatileuint8_tkey_flag=0;voidkey_init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDefGPIO_InitStructure;//keyoutput=GPIO_Mode_Out_PP;=GPIO_Speed_50MHz;=GPIO_Pin_0;GPIO_Init(GPIOE,&GPIO_InitStructure);=GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;GPIO_Init(GPIOB,&GPIO_InitStructure);//keyinput=GPIO_Mode_IPU;//上拉输入=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;GPIO_Init(GPIOE,&GPIO_InitStructure);}//判断是否有键按下函数,对键盘进行一次扫描//返回键盘接口状态,有键按下时返回键值;没有键按下返回无效标志位uint8_tIs_Key_PressOn(void){volatileuint8_ti,ScanCode;for(i=0;i<4;i++){switch(i)//扫描信号产生{case0:GPIOE->BSRR=0x00010000;//PE0=0;GPIOB->BSRR=0x00000320;//PB5=1;PB8=1;PB9=1;key_flag=1;break;case1:GPIOE->BSRR=0x00000001;//PE0=1;GPIOB->BSRR=0x00200300;//PB5=0;PB8=1;PB9=1;key_flag=2;break;case2:GPIOE->BSRR=0x00000001;//PE0=1;GPIOB->BSRR=0x01000220;//PB5=1;PB8=0;PB9=1;key_flag=3;break;case3:GPIOE->BSRR=0x00000001;//PE0=1;GPIOB->BSRR=0x02000120;//PB5=1;PB8=1;PB9=0;key_flag=4;break;default:key_flag=0;break;}if((((uint8_t)GPIOE->IDR)|0x83)!=0xff)return((uint8_t)GPIOE->IDR|0x83);}return(PRESS_INVALID);}//找到闭合键,判断延时前后两次键值是否相同,如果相同则返回键值uint8_tFind_Key_PressOn(uint8_tKeyCode_before,uint8_tKeyCode_after){if(KeyCode_before==KeyCode_after)return(KeyCode_after);elsereturn(PRESS_INVALID);}//计算键值,根据返回的键值计算相应的返回值uint8_tCalc_Key_PressOn(uint8_tKeyCode){uint8_tTempNum;switch(KeyCode){case0xBF:if(1==key_flag){TempNum=1;break;}elseif(2==key_flag){TempNum=2;break;}elseif(3==key_flag){TempNum=3;break;}elseif(4==key_flag){TempNum=4;break;}elsebreak;case0xDF:if(1==key_flag){TempNum=5;break;}elseif(2==key_flag){TempNum=6;break;}elseif(3==key_flag){TempNum=7;break;}elseif(4==key_flag){TempNum=8;break;}elsebreak;case0xEF:if(1==key_flag){TempNum=9;break;}elseif(2==key_flag){TempNum=10;break;}elseif(3==key_flag){TempNum=11;break;}elseif(4==key_flag){TempNum=12;break;}elsebreak;case0xF7:if(1==key_flag){TempNum=13;break;}elseif(2==key_flag){TempNum=14;break;}elseif(3==key_flag){TempNum=15;break;}elseif(4==key_flag){TempNum=16;break;}elsebreak;case0xFB:if(1==key_flag){TempNum=17;break;}elseif(2==key_flag){TempNum=18;break;}elseif(3==key_flag){TempNum=19;break;}elseif(4==key_flag){TempNum=20;break;}elsebreak;default:TempNum=0;break;//发生错误时返回,无效标志}return(TempNum);//正常返回值为1~16}//键盘扫描主程序uint8_tKeyboard(void){uint8_tkey_temp;//暂存键值的变量key_temp=Is_Key_PressOn();//判断是否有键闭合//PORTC=key_temp;调试过程中使用,正常运行时没用可以删除if(key_temp==PRESS_INVALID)//判断该次扫描中是否有键按下return(PRESS_INVALID);//没有闭合则建立无效标志elsedelay_nus(100);//闭合则延时key_temp=Find_Key_PressOn(key_temp,((uint8_t)GPIOE->IDR|0x83));//找到闭合键if(key_temp==PRESS_INVALID)return(key_temp);//若延时前后键值不相等则返回无效标志elsekey_temp=Calc_Key_PressOn(key_temp);//有效则计算键值while((((uint8_t)GPIOE->IDR)|0x83)!=0xff)//等待键放。。。看实际情况使用{delay_nus(10);}return(key_temp);//返回键值}:心得体会课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过本次电子线路设计,我不仅加深了对STM32嵌入式理论知识的理解,学会了学以致用的重要性;而且还学会了如何去加强锻炼创新精神,同时也提高了自身的动手能力,让我深刻的意识到理论与实际结合的重要性。电子线路的学习对于我们专业来说非常的重要,通过本次设计也让我更加清晰了对专业的了解,理论知识再丰富,没有实际的操作经验也是不行的;本次设计也运用到了proteus仿真软件,由于之前没有学过该仿真软件,所以在操作的过程中遇到了很多困难,但庆幸的是通过不断的学习,对proteus软件也有了很大的了解,也学会了一些简单的操作,所以也让我意识到,如果你想学好,通过自己的努力就一定会学好。回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。
本文档为【4X4扫描式矩阵键盘课程设计讲解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥10.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
艾在维成
本人爱岗敬业,工作认真,善于沟通,性格开朗,教学过硬,被学校评为学习标杆。
格式:doc
大小:173KB
软件:Word
页数:12
分类:企业经营
上传时间:2021-11-18
浏览量:16