基于STM32控制的矩阵键盘的仿真设计.docx

上传人:b****5 文档编号:8346843 上传时间:2023-01-30 格式:DOCX 页数:14 大小:155.77KB
下载 相关 举报
基于STM32控制的矩阵键盘的仿真设计.docx_第1页
第1页 / 共14页
基于STM32控制的矩阵键盘的仿真设计.docx_第2页
第2页 / 共14页
基于STM32控制的矩阵键盘的仿真设计.docx_第3页
第3页 / 共14页
基于STM32控制的矩阵键盘的仿真设计.docx_第4页
第4页 / 共14页
基于STM32控制的矩阵键盘的仿真设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于STM32控制的矩阵键盘的仿真设计.docx

《基于STM32控制的矩阵键盘的仿真设计.docx》由会员分享,可在线阅读,更多相关《基于STM32控制的矩阵键盘的仿真设计.docx(14页珍藏版)》请在冰豆网上搜索。

基于STM32控制的矩阵键盘的仿真设计.docx

基于STM32控制的矩阵键盘的仿真设计

 

课程论文

 

题目:

基于STM32控制的矩阵键盘的仿真设计

课程名称:

ARM嵌入式系统

学生姓名:

张宇

学生学号:

1314030140

系别:

电子工程学院

专业:

通信工程

年级:

2013级

指导教师:

权循忠

电子工程学院制

2015年10月

1摘要1

2关键字1

3引言1

4STM32控制的矩阵键盘系统方案计制定1

4.1系统总体设计方案1

4.2总体设计框图1

4.3矩阵键盘简介2

5矩阵键盘设计原理分析2

5.1STM32复位和时钟电路设计2

5.2矩阵键盘电路的设计2

5.3按键去抖动3

5.4按键显示电路3

6程序流程图4

7总体电路图5

8软件仿真5

9总结6

10参考文献:

6

11附录7

基于STM32控制的矩阵键盘的仿真设计

学生:

张宇

指导老师:

权循忠

电子工程学院通信工程

1摘要

矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。

在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4*4个。

这种行列式键盘结构能有效地提高ARM嵌入式系统中I/O口的利用率。

2关键字

矩阵键盘行列键盘ARM嵌入式系统

3引言

随着人们生活水平的不断提升,ARM嵌入式无疑是人们追求的目标之一,它给人带来的方便也是不可否认的,要为现代人工作、科研、生活、提供更好更方便的设备就需要从ARM嵌入式技术入手,一切向若数字化控制,智能化控制方向发展。

用ARM嵌入式来控制的数码管显示按键也在广泛应用,其控制系统具有极大意义。

展望未来,急速的响应速度将成为个性的ARM嵌入式发展的趋势,越来越多的ARM嵌入式正如雨后春笋般涌现。

4STM32控制的矩阵键盘系统方案计制定

4.1系统总体设计方案

该智能键盘电路由ARM最小系统,矩阵键盘电路和显示电路组成,在常规的4*4矩阵键盘的基础上,通过改进实现了用4个IO口完成4*4矩阵键盘。

4.2总体设计框图

本电路主要由3大部分电路组成:

矩阵键盘电路、ARM最小系统电路、按键显示电路。

其中ATM最小系统主要由复位电路和时钟电路组成。

电路复位后数码管显示字符“—”表示没有按键,显示电路由STM32的PD0—PD7来控制数码管显示是哪个按键按下。

总体设计方框图,如图1所示。

图1总体设计方框图

4.3矩阵键盘简介

矩阵键盘又称行列键盘,它是用四条I/O线作为行线,四条I/O线作为列线组成的键盘。

在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4*4个。

这种行列式键盘结构能有效地提高ARM嵌入式系统中I/O口的利用率。

5矩阵键盘设计原理分析

5.1STM32复位和时钟电路设计

此电路主要是复位电路和时钟电路两部分,其中复位电路采用按键手动复位和上电自动复位组合,电路如图2(右)所示:

其中14脚为STM32的复位端。

时钟电路如图2(左)所示:

晶振采用的是8MHz和32.786KHz,8MKz分别接STM32的12脚和13脚,32.786KHz分别接STM32的8脚和9脚。

图2STM复位和时钟电路设计

5.2矩阵键盘电路的设计

该电路的四个端子分别接STM32的PB12—PB15,电路如图3所示。

图3矩阵键盘电路

该矩阵键盘电路扫描方法如下:

(1)PB15,PB14,PB13,PB12设置为输入并内部上拉。

程序读取这四个IO口引脚电平,如果某个IO为低电平,则该列中相应IO口对应行处的按键按下。

(2)PB15输出低电平,PB14,PB13,PB12设置为输入并内部上拉。

程序读取PB14,PB13,PB12这三个IO口的引脚电平。

如果某个IO为低电平,则是第一列中相应IO口对应行处的按键按下。

(3)PB14输出低电平,PB15,PB13,PB12设置为输入并内部上拉。

程序读取PB15,PB13,PB12这三个IO口的引脚电平。

如果某个IO为低电平,则是第二列中相应IO口对应行处的按键按下。

(4)PB13输出低电平,PB15,PB14,PB12设置为输入并内部上拉。

程序读取PB15,PB14,PB12这三个IO口的引脚电平。

如果某个IO为低电平,则是第三列中相应IO口对应行处的按键按下。

(5)PB12输出低电平,PB15,PB14,PB13设置为输入并内部上拉。

程序读取PB15,PB14,PB13这三个IO口的引脚电平。

如果某个IO为低电平,则是第四列中相应IO口对应行处的按键按下。

5.3按键去抖动

每隔10ms扫描键盘一次,当扫描某个按键按下时,则开始计数,当连续4次扫描(也就是40ms)都是这个按键按下时,说明按键有效。

如果不到四次计数,就采集不到该按键按下,则说明该按键无效。

5.4按键显示电路

本设计采用STM32的IO口PD0—PD7来控制数码管来实时显示按键状态。

当按键有按下时,数码管将显示对应的按键编号“0—F”,对应表示的按键是

“SW1—SW16”。

按键显示电路,如图4。

图4按键显示电路

6程序流程图

先对键盘初始化,看读列线是否有键按键,再延时消抖,再看读列是否有键按下,最后根据当前状态识别按键,显示键值。

程序流程图,如图5所示。

图5程序流程图

流程图描述:

先对键盘值进行初始化,判断列线是否有按键按下,若无直接返回结果,若有则进行延时消抖,然后继续判断列线是否有按键按下,若无直接返回结果,若有根据当前状态识别按键,显示按键值,返回结果。

7总体电路图

把矩阵键盘电路、ARM最小系统电路、按键显示电路连接在一起。

其中ATM最小系统主要由复位电路和时钟电路组成。

总体电路图,如图6所示。

图6总体电路图

8软件仿真

首先,我们进行软件仿真,点击按钮Debug,然后再点击波形图按钮,出现逻辑分析窗口,点击Setup,新建6个信号PORTB.2、PORTB.8、PORTB.9、PORTB.10、PORTB.13、和PORTB.14。

DisplayType全部选择Bit,然后选择各个颜色。

然后再点击PeripheralsGeneralPurposeI/OGPIOB。

然后设置各个引脚电平,然后在x=KEY_Scan()处设置一个断点,点击Run按钮,会出现以下波形即实验成功。

图7软件仿真

9总结

一学期的ARM课程即将结束,从一开始对ARM的完全陌生到现在的慢慢入门,其中体会到了很多ARM的妙处和实用意义。

通过这次矩阵键盘的设计,使我对ARM有了更深的理解。

在做课程论文时增强了对论文格式的修改,熟悉和掌握了ARM工程项目的建立与生成,在遇到程序出现错误时及时的翻书查看或者上网查找,并且在后期的ARM实训课中自己尝试在ARM开发板上进行调试,让我深刻领悟到理论和实践相结合的重要意义。

只有把理论运用到实践中才能很好掌握理论和技术。

所以以后不管在学什么知识都要重视理论与实践相结合。

这样就好觉得其实学知识也不是那么难,更重要的是体现的学习的实际用处。

10参考文献:

[1]彭刚、秦志强等.基于ARMCortex-M3的STM32系列嵌入式微控制器应用实践[M].北京:

电子工业出版社

[2]李宁.基于MDK的STM32处理器开发应用[M].北京航空航天大学出版社,2008.

[3]潘松、黄继业等.EDA技术实用教程(第一版)[M].科学出版社2002年10月

[4]陆坤、奚大顺、李之权等.电子设计技术[M].四川:

电子科技大学出版社.1997年.682-688,838-941

[5]赵俊超.集成电路设计VHDL教程(第一版)[M].北京:

北京希望电子出版社.2002年

[6]杨邦文.新型实用电路制作200例[M].北京:

人民邮电出版社.1998年.175-288

[7]许海燕、付炎著.嵌入式系统技术与应用.机械工业出版社.2002年

[8]周主力主编.ARM嵌入式系统基础教程.北京航空航天大学出版社.2005年

[9]田泽主编.嵌入式系统开发与应用教程.北京航空航天大学出版社

11附录

主程序

#include"led.h"

#include"delay.h"

#include"sys.h"

#include"key.h"

#include"usart.h"

#include"stdio.h"

intmain(void)

{

intx;

SystemInit();

delay_init(72);//延时初始化

NVIC_Configuration();

uart_init(9600);

LED_Init();

KEY_Init();//初始化与按键连接的硬件接口

while

(1)

{

x=KEY_Scan();//得到键值

switch(x)

{

case0:

//LED=0;

printf("D\n");

break;

case1:

LED=1;

printf("C\n");

break;

case2:

LED=2;

printf("B\n");

break;

case3:

LED=3;

printf("A\n");

break;

case4:

LED=4;

printf("#\n");

break;

case5:

LED=5;

printf("9\n");

break;

case6:

LED=6;

printf("6\n");

break;

case7:

LED=7;

printf("3\n");

break;

case8:

LED=8;

printf("0\n");

break;

case9:

LED=9;

printf("8\n");

break;

case10:

LED=10;

printf("5\n");

break;

case11:

LED=11;

printf("2\n");

break;

case12:

LED=12;

printf("*\n");

break;

case13:

LED=13;

printf("7\n");

break;

case14:

LED=14;

printf("4\n");

break;

case15:

LED=15;

printf("1\n");

break;

}

}

}

///////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////

key.c//按键扫描

#include"stm32f10x.h"

#include"delay.h"

#include"key.h"

/*本文件的函数,主要实现矩阵键盘的功能。

矩阵键盘使用PB8到PB15引脚,其中,PB8到PB11固定为

推挽输出,PB12到PB15固定为下拉输入。

即,无键按下时,对应PB12到PB15为0,有键按下时,PB12到PB15中,

对应的引脚为高。

*/

voidKEY_Init(void)//初始化矩阵键盘要使用的GPIO口。

{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//定义PB8到PB11为上拉输入、、。

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;

GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//定义PB12到PB15为下拉输入。

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;

//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,

//所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

intKEY_Scan(void)//实现矩阵键盘。

返回值为,各按键的键值,此键值由用户自己定义。

{

u8KeyVal;//keyVal为最后返回的键值。

GPIO_Write(GPIOB,(GPIOB->ODR&0xf0ff|0x0f00));//先让PB8到PB11全部输出高。

if((GPIOB->IDR&0xf000)==0x0000)//如果PB12到PB15全为0,则没有键按下。

此时,返回值为-1.

return-1;

else

{

delay_ms(5);//延时5ms去抖动。

if((GPIOB->IDR&0xf000)==0x0000)//如果延时5ms后,PB12到PB15又全为0,则,刚才引脚的电位变化是抖动产生的.

return-1;

}

GPIO_Write(GPIOB,(GPIOB->ODR&0xf0ff|0x0100));//让PB11到PB8输出二进制的0001.

switch(GPIOB->IDR&0xf000)//对PB12到PB15的值进行判断,以输出不同的键值。

{

case0x1000:

KeyVal=15;break;

case0x2000:

KeyVal=11;break;

case0x4000:

KeyVal=7;break;

case0x8000:

KeyVal=3;break;

}

GPIO_Write(GPIOB,(GPIOB->ODR&0xf0ff|0x0200));//让PB11到PB8输出二进制的0.

switch(GPIOB->IDR&0xf000)//对PB12到PB15的值进行判断,以输出不同的键值。

{

case0x1000:

KeyVal=14;break;

case0x2000:

KeyVal=10;break;

case0x4000:

KeyVal=6;break;

case0x8000:

KeyVal=2;break;

}

GPIO_Write(GPIOB,(GPIOB->ODR&0xf0ff|0x0400));//让PB11到PB8输出二进制的1011.

switch(GPIOB->IDR&0xf000)//对PB12到PB15的值进行判断,以输出不同的键值。

{

case0x1000:

KeyVal=13;break;

case0x2000:

KeyVal=9;break;

case0x4000:

KeyVal=5;break;

case0x8000:

KeyVal=1;break;

}

GPIO_Write(GPIOB,(GPIOB->ODR&0xf0ff|0x0800));//让PB11到PB8输出二进制的0111.

switch(GPIOB->IDR&0xf000)//对PB12到PB15的值进行判断,以输出不同的键值。

{

case0x1000:

KeyVal=12;break;

case0x2000:

KeyVal=8;break;

case0x4000:

KeyVal=4;break;

case0x8000:

KeyVal=0;break;

}

returnKeyVal;

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

key.h文件

#ifndef__KEY_H

#define__KEY_H

#include"sys.h"

#defineKEY0PBin(8)//PB8

#defineKEY1PBin(9)//PB9

#defineKEY2PBin(10)//PA10

#defineKEY3PBin(11)//PA11

#defineKEY4PBin(12)//PA12

#defineKEY5PBin(13)//PA13

#defineKEY6PBin(14)//PA14

#defineKEY7PBin(15)//PA15

voidKEY_Init(void);//IO初始化

intKEY_Scan(void);

#endif

键码表为:

{123A}

{456B}

{789C}

{*0#D}这个可以根据自己来定义。

(注:

文档可能无法思考全面,请浏览后下载,供参考。

可复制、编制,期待你的好评与关注!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1