4X4扫描式矩阵键盘课程设计讲解.docx
- 文档编号:11884773
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:14
- 大小:146.91KB
4X4扫描式矩阵键盘课程设计讲解.docx
《4X4扫描式矩阵键盘课程设计讲解.docx》由会员分享,可在线阅读,更多相关《4X4扫描式矩阵键盘课程设计讲解.docx(14页珍藏版)》请在冰豆网上搜索。
4X4扫描式矩阵键盘课程设计讲解
4x4矩阵键盘识别设计
班级:
1221201
专业:
测控技术与仪器
姓名:
涂勇
学号:
201220120110
指导老师:
钟念兵
东华理工大学
2016年1月1日
摘要
随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,电子式设施现代化的基础,也是人类通往科技巅峰的直通路。
电子行业的发展从长远来看很重要,但最主要的还是科技问题。
矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。
是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。
矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,显示在LED数码管上。
单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。
4*4矩阵式键盘采用STM32嵌入式微处理器为核心,主要由矩阵式键盘电路、硬件电路、显示电路等组成,软件选用C语言编程。
STM32将检测到的按键信号转换成数字量,显示于LED显示器上。
该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。
第一章:
系统功能要求--------------------------------------------------------
1.14*4矩阵式键盘系统概述------------------------------------------------
1.2本设计任务和主要内容---------------------------------------------------
第二章:
系统硬件电路的设计------------------------------------------------
2.1硬件系统主要思路和电路原理图---------------------------------------
2.2硬件上键盘规划----------------------------------------------------------
第三章:
系统程序的设计------------------------------------------------------
3.1程序的编写步骤-----------------------------------------------------------
3.2编写的源程序--------------------------------------------------------------
第四章:
心得体会---------------------------------------------------------------
第一章:
系统功能要求
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.1
1.2本设计任务和主要内容
本论文主要研究STM32嵌入式控制器控制的键盘识别显示系统,分别对按键信息和显示电路以及软、硬件各个部分进行研究。
主要内容如下:
1.2.1根据矩阵式键盘的特点,进行键盘控制系统的整体研究与设计;
1.2.2熟练掌握protues软件的使用,并能够按要求对设计的电路进行仿真,实现相应的功能;
1.2.3LED实时显示按键的信息;
1.2.4采用软件编程的方法实现按键信息的提取和显示。
第二章:
系统硬件电路的设计
2.1硬件系统主要思路和电路原理图
首先,把纵向三线设置为推挽输出,然后把横向三线设置为下拉输入,然后读取横向三线的值,如果有接口的读数为1,说明有按键按下了,把该值与0x07相与后放到scana,然后左移4位放到result中,这之后把横向三线设置为推挽输出,纵向三线设置为下拉输入,然后读取纵向三线的值,把相应的键值保存到scanb中,然后通过移位使得低四位表示的是相应的按键所在横向的值,然后与result相或放到result的低四位,这样得到的result高四位就是按键所在纵向的值,低四位就是按键所在横向的值,由此就可以检测到那个按键被按下了。
效果:
按下相应的键盘,四个led灯会显示各种不同的状态,hoho,一共有9种状态。
用protrus仿真软件所画的仿真图如下:
图3.2仿真原理图
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
#include"stm32f10x.h"
/*4*4矩阵键盘*/
voidkeyboard_init(void);
voidupdate_key(void);
externunsignedcharkey[4][4];
#endif
/**************矩阵键盘.c文件*****************************/
#include"common.h"
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;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++) //i是输出口,依次置低电平
{
GPIO_ResetBits(key_output[i].GPIO_x,key_output[i].GPIO_pin);
for(j=0;j<4;j++) //j是输入口,当键按下时导通被置为低电平
{
if(GPIO_ReadInputDataBit(key_input[j].GPIO_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_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);
//keyinput
GPIO_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)
{
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);//没有闭合则建立无效标志
else
delay_nus(100);//闭合则延时
key_temp=Find_Key_PressOn(key_temp,((uint8_t)GPIOE->IDR|0x83));//找到闭合键
if(key_temp==PRESS_INVALID)
return(key_temp);//若延时前后键值不相等则返回无效标志
else
key_temp=Calc_Key_PressOn(key_temp);//有效则计算键值
while((((uint8_t)GPIOE->IDR)|0x83)!
=0xff)//等待键放。
。
。
看实际情况使用
{
delay_nus(10);
}
return(key_temp);//返回键值
}
第五章:
心得体会
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。
同时,设计让我感触很深。
使我对抽象的理论有了具体的认识。
通过本次电子线路设计,我不仅加深了对STM32嵌入式理论知识的理解,学会了学以致用的重要性;而且还学会了如何去加强锻炼创新精神,同时也提高了自身的动手能力,让我深刻的意识到理论与实际结合的重要性。
电子线路的学习对于我们专业来说非常的重要,通过本次设计也让我更加清晰了对专业的了解,理论知识再丰富,没有实际的操作经验也是不行的;本次设计也运用到了proteus仿真软件,由于之前没有学过该仿真软件,所以在操作的过程中遇到了很多困难,但庆幸的是通过不断的学习,对proteus软件也有了很大的了解,也学会了一些简单的操作,所以也让我意识到,如果你想学好,通过自己的努力就一定会学好。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- X4 扫描 矩阵 键盘 课程设计 讲解