电子与信息与工程学院课程设计-1-4x4矩阵键盘识别设计班级:1221201专业:测控技术与仪器姓名:涂勇学号:201220120110指导老师:钟念兵东华理工大学2016年1月1日电子与信息与工程学院课程设计-2-摘要随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,电子式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,显示在LED数码管上。单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。4*4矩阵式键盘采用STM32嵌入式微处理器为核心,主要由矩阵式键盘电路、硬件电路、显示电路等组成,软件选用C语言编程。STM32将检测到的按键信号转换成数字量,显示于LED显示器上。该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。电子与信息与工程学院课程设计-3-目录第一章:系统功能要求--------------------------------------------------------1.14*4矩阵式键盘系统概述------------------------------------------------1.2本设计任务和主要内容---------------------------------------------------第二章:系统硬件电路的设计------------------------------------------------2.1硬件系统主要思路和电路原理图---------------------------------------2.2硬件上键盘规划----------------------------------------------------------第三章:系统程序的设计------------------------------------------------------3.1程序的编写步骤-----------------------------------------------------------3.2编写的源程序--------------------------------------------------------------第四章:心得体会---------------------------------------------------------------电子与信息与工程学院课程设计-4-第一章:系统功能要求1.14*4矩阵式键盘系统概述利用STM32对4*4矩阵键盘进行动态扫描,当有按键盘的键时,可将相应按键值(0~F)实时显示在数码管上。由p1.0—p1.3(列)和p1.4—p1.7(行)组成4*4矩阵键盘,p0口接LED静态显示电路。由于p0口内部无上拉电阻,因此必须外部接上上拉电阻,其值的选择可以根据LED数码管发光电流及其亮度来决定。通过编写4*4键盘的驱动程序,当有键盘按下时,能够在led数码管与按键的键值对应的数字。最常见键盘布局如下图1.1所示。一般由16个按键组成,在单片机中正好可以用一个p口实现16个按键功能,这也是单片机系统中最常见的形式,本设计就采用这个键盘模式。图1.11.2本设计任务和主要内容本论文主要研究STM32嵌入式控制器控制的键盘识别显示系统,分别对按键信息和显示电路以及软、硬件各个部分进行研究。主要内容如下:1.2.1根据矩阵式键盘的特点,进行键盘控制系统的整体研究与设计;1.2.2熟练掌握protues软件的使用,并能够按要求对设计的电路进行仿真,实现相应的功能;1.2.3LED实时显示按键的信息;1.2.4采用软件编程的方法实现按键信息的提取和显示。01673245BD9EAF8C电子与信息与工程学院课程设计-5-第二章:系统硬件电路的设计2.1硬件系统主要思路和电路原理图首先,把纵向三线设置为推挽输出,然后把横向三线设置为下拉输入,然后读取横向三线的值,如果有接口的读数为1,说明有按键按下了,把该值与0x07相与后放到scana,然后左移4位放到result中,这之后把横向三线设置为推挽输出,纵向三线设置为下拉输入,然后读取纵向三线的值,把相应的键值保存到scanb中,然后通过移位使得低四位表示的是相应的按键所在横向的值,然后与result相或放到result的低四位,这样得到的result高四位就是按键所在纵向的值,低四位就是按键所在横向的值,由此就可以检测到那个按键被按下了。效果:按下相应的键盘,四个led灯会显示各种不同的状态,hoho,一共有9种状态。用protrus仿真软件所画的仿真图如下:图3.2仿真原理图电子与信息与工程学院课程设计-6-2.2硬件上的键盘规划stm32矩阵键盘这是硬件上的键盘规划//|1|2|3|4|---line1PE6////---------------------------////|5|6|7|8|---line2PE5////---------------------------////|9|10|11|12|---line3PE4////---------------------------////|13|14|15|16|---line4PE3////---------------------------////|17|18|19|20|---line5PE2////---------------------------////||||////col1col2col3col4////PE0PB5PB8PB9//第四章:系统程序的设计4.1程序的编写步骤4.1.1判断是否有键按下;4.1.2识别被按下的键;STM32用矩阵键盘,不带外部中断,可以多个按键同时按下4.2编写的源程序#ifndef__COMMON_H#define__COMMON_H#includestm32f10x.h/*4*4矩阵键盘*/voidkeyboard_init(void);voidupdate_key(void);externunsignedcharkey[4][4];#endif/**************矩阵键盘.c文件*****************************/#includecommon.h电子与信息与工程学院课程设计-7-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_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);/*键盘列扫描输入线键被按时输入高电平放开输入低电平*//*PA4PA5PA6PA7输入*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOD,&GPIO_InitStructure);for(i=0;i4;i++){GPIO_SetBits(key_output[i].GPIO_x,key_output[i].GPIO_pin);}}voidupdate_key(void){unsignedchari,j;for(i=0;i4;i++)//i是输出口,依次置低电平{GPIO_ResetBits(key_output[i].GPIO_x,key_output[i].GPIO_pin);for(j=0;j4;j++)//j是输入口,当键按下时导通被置为低电平{if(GPIO_ReadInputDataBit(key_input[j].GPIO_x,key_input[j].GPIO_pin)==0){电子与信息与工程学院课程设计-8-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;//keyoutputGPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_Init(GPIOE,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;GPIO_Init(GPIOB,&GPIO_InitStructure);//keyinputGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入GPIO_InitStructure.GPIO_Pin=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)电子与信息与工程学院课程设计-9-{volatileuint8_ti,ScanCode;for(i=0;i4;i++){switch(i)//扫描信号产生{case0:GPIOE-BSRR=0x00010000;//PE0=0;GPIOB-BSRR=0x00000320;//PB5=