当前位置:文档之家› 4X4扫描式矩阵键盘课程设计讲解

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

4x4矩阵键盘识别设计班级:1221201专业:测控技术与仪器姓名:涂勇学号:2012 2012 0110指导老师:钟念兵东华理工大学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数码管与按键的键值对应的数字。

最常见键盘布局如下图所示。

一般由16个按键组成,在单片机中正好可以用一个p口实现16模式。

图本设计任务和主要内容本论文主要研究STM32嵌入式控制器控制的键盘识别显示系统,分别对按键信息和显示电路以及软、硬件各个部分进行研究。

主要内容如下:根据矩阵式键盘的特点,进行键盘控制系统的整体研究与设计;熟练掌握protues软件的使用,并能够按要求对设计的电路进行仿真,实现相应的功能;LED实时显示按键的信息;采用软件编程的方法实现按键信息的提取和显示。

第二章:系统硬件电路的设计硬件系统主要思路和电路原理图首先,把纵向三线设置为推挽输出,然后把横向三线设置为下拉输入,然后读取横向三线的值,如果有接口的读数为1,说明有按键按下了,把该值与0x07相与后放到scana,然后左移4位放到result中,这之后把横向三线设置为推挽输出,纵向三线设置为下拉输入,然后读取纵向三线的值,把相应的键值保存到scanb中,然后通过移位使得低四位表示的是相应的按键所在横向的值,然后与result相或放到result的低四位,这样得到的result高四位就是按键所在纵向的值,低四位就是按键所在横向的值,由此就可以检测到那个按键被按下了。

效果:按下相应的键盘,四个led灯会显示各种不同的状态,hoho,一共有9种状态。

用protrus仿真软件所画的仿真图如下:图仿真原理图硬件上的键盘规划stm32 矩阵键盘这是硬件上的键盘规划文件*****************************/#include ""struct io_port {GPIO_TypeDef *GPIO_x;unsigned short GPIO_pin;};static struct io_port key_output[4] = {{GPIOD, GPIO_Pin_0}, {GPIOD, GPIO_Pin_1},{GPIOD, GPIO_Pin_2}, {GPIOD, GPIO_Pin_3}};static struct io_port key_input[4] = {{GPIOD, GPIO_Pin_4}, {GPIOD, GPIO_Pin_5},{GPIOD, GPIO_Pin_6}, {GPIOD, GPIO_Pin_7}};unsigned char key[4][4];void keyboard_init(void){GPIO_InitTypeDef GPIO_InitStructure;unsigned char i;/* 键盘行扫描输出线输出高电平*//* PA0 PA1 PA2 PA3 输出*/= GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;= GPIO_Mode_Out_PP;= GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);/* 键盘列扫描输入线键被按时输入高电平放开输入低电平*/ /* PA4 PA5 PA6 PA7 输入*/= 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);}}void update_key(void){unsigned char i, 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板子上。

volatile uint8_t key_flag = 0;void key_init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;//key output= 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);//key input= GPIO_Mode_IPU;//上拉输入= GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;GPIO_Init(GPIOE,&GPIO_InitStructure);}//判断是否有键按下函数,对键盘进行一次扫描//返回键盘接口状态,有键按下时返回键值;没有键按下返回无效标志位uint8_t Is_Key_PressOn(void){volatile uint8_t i,ScanCode;for(i=0;i<4;i++){switch(i) //扫描信号产生{case 0:GPIOE->BSRR = 0x00010000;//PE0 = 0;GPIOB->BSRR = 0x00000320;//PB5 = 1; PB8 = 1; PB9 = 1;key_flag = 1;break;case 1:GPIOE->BSRR = 0x00000001;//PE0 = 1;GPIOB->BSRR = 0x00200300;//PB5 = 0; PB8 = 1; PB9 = 1;key_flag = 2;break;case 2:GPIOE->BSRR = 0x00000001;//PE0 = 1;GPIOB->BSRR = 0x01000220;//PB5 = 1; PB8 = 0; PB9 = 1;key_flag = 3;break;case 3: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_t Find_Key_PressOn(uint8_t KeyCode_before,uint8_t KeyCode_after) {if(KeyCode_before==KeyCode_after) return(KeyCode_after); else return(PRESS_INVALID);}//计算键值,根据返回的键值计算相应的返回值uint8_t Calc_Key_PressOn(uint8_t KeyCode){uint8_t TempNum;switch(KeyCode){case 0xBF:if(1==key_flag){TempNum = 1;break;}else if(2==key_flag){TempNum = 2;break;}else if(3==key_flag){TempNum = 3;break;}else if(4==key_flag){TempNum = 4;break;}else break;if(1==key_flag){TempNum = 5;break; }else if(2==key_flag) {TempNum = 6;break; }else if(3==key_flag) {TempNum = 7;break; }else if(4==key_flag) {TempNum = 8;break; }else break;case 0xEF:if(1==key_flag){TempNum = 9;break; }else if(2==key_flag) {TempNum = 10;break; }else if(3==key_flag)}else if(4==key_flag) {TempNum = 12;break; }else break;case 0xF7:if(1==key_flag){TempNum = 13;break; }else if(2==key_flag) {TempNum = 14;break; }else if(3==key_flag) {TempNum = 15;break; }else if(4==key_flag) {TempNum = 16;break; }else break;case 0xFB:if(1==key_flag)}else if(2==key_flag){TempNum = 18;break;}else if(3==key_flag){TempNum = 19;break;}else if(4==key_flag){TempNum = 20;break;}else break;default : TempNum=0;break; //发生错误时返回,无效标志}return(TempNum); //正常返回值为1~16}//键盘扫描主程序uint8_t Keyboard(void){uint8_t key_temp; //暂存键值的变量key_temp=Is_Key_PressOn(); //判断是否有键闭合// PORTC=key_temp; 调试过程中使用,正常运行时没用可以删除if (key_temp==PRESS_INVALID) //判断该次扫描中是否有键按下return(PRESS_INVALID); //没有闭合则建立无效标志delay_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)//等待键放。

相关主题