基于STM32控制的矩阵键盘的仿真设计.docx
- 文档编号:8346843
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:14
- 大小:155.77KB
基于STM32控制的矩阵键盘的仿真设计.docx
《基于STM32控制的矩阵键盘的仿真设计.docx》由会员分享,可在线阅读,更多相关《基于STM32控制的矩阵键盘的仿真设计.docx(14页珍藏版)》请在冰豆网上搜索。
基于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}这个可以根据自己来定义。
(注:
文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注!
)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STM32 控制 矩阵 键盘 仿真 设计