历史上的今天
今天是:2025年04月08日(星期二)
2019年04月08日 | 基于STM32L151//STM32F407的矩阵键盘程序(不规则接口)
2019-04-08 来源:eefocus

最近在做一个有关按键的项目,需要用到矩阵键盘,上网找了很多都是基于一些规则接口的程序,感觉无语,因为画PCB由于布线原因
不太可能矩阵键盘的几条线是连接连续的GPIO口,所以经过我自己思考,做出了自己基于STM32的不规则程序,
由于每种矩阵键盘的连接原理有时是不同,所以首先先讲明我的矩阵键盘的连接原理
4条行线初始化时全为1,列线全为0,由于我的列先有接10K的电阻,有按键按下时,被按下的列线为1,
行线一次置为1、0、0、0 ,1,0,0�,0,1,0�,0,0,1
基于STM32L151//STM32F407的矩阵键盘程序(不规则接口):
行接口:PA8,PA12,PB3,PB4
列接口:PA11,PB5,PB9
void KeyPress(void){
int KeyValues;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)
{
Delay10ms(20);
GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_12);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1)
{
KeyValues=10;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)
{
KeyValues=11;
}
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1);
/////////////////////////////////////////////
GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
GPIO_SetBits(GPIOA,GPIO_Pin_12);
GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1)
{
KeyValues=7;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)
{
KeyValues=8;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)
{
KeyValues=9;
}
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1);
//////////////////////////////////////////////
GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
GPIO_SetBits(GPIOB,GPIO_Pin_3);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_12);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1)
{
KeyValues=4;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)
{
KeyValues=5;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)
{
KeyValues=6;
}
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1);
////////////////////////////////////////////////
GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_12);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1)
{
KeyValues=1;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)
{
KeyValues=2;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)
{
KeyValues=3;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1);
GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);
GPIO_ResetBits(GPIOA,GPIO_Pin_11);
GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_12);
}
}
}
\\\\\\\\\\\\\\\\\\\
!!!!上图附有本程序的矩阵键盘原理,与普通矩阵键盘设计不太一样!!!!!!
\\\\\\\\\\\\\\\\\\\
史海拾趣
|
笔者读了本版有关PIC 8位单片机的产品性能和相应的封装引脚介绍后,认为对初学者而言还需了解各引脚符号的意义,才能进一步学习和使用它。笔者为此作相关的说明,以便和初学者共同提高。 一、关于I/O口符号 PIC单片机系列封装引脚最少的是8 ...… 查看全部问答> |
|
触摸屏技术的力量 触摸屏是一种与电脑交互的最简单,最直接的方法。虽然它才诞生于1970年,是一项由Elo TouchSystems公司首先推广到市场的新技术,但它却是人们最基本的交互方式。你可以指向你需要的任何一个地方。不论大人或小孩 ...… 查看全部问答> |
|
大家好,我就在楼主说的国产品牌嘉华里工作,正好看到楼主的文章里提到了我们,我也来谈谈我对国产PLC的看法。嘉华在国内做PLC算比较早的,95年的时候第1台PLC研制成功,96年推向市场。到现在已经形成2大系列,12点到120点的完整产品线。我们的产品 ...… 查看全部问答> |
|
电子制作DIY手册---[张歌编著][中国水利水电出版社][2004][470页] 无线电制作DIY手册.[张歌编著][中国水利水电出版社][2004][470页] 简介: 编辑、剪辑:张歌 基本信息·出版社:中国水利水电出版社 ·ISBN:750842414X ·条码:9787508424149 ·版次:1 ·装帧:平装 ------------------------------- ...… 查看全部问答> |
|
wince5 下的device.exe有时不能加载SIP输入法的奇怪问题? wince5下面的每个SLOT只有32M的虚拟内存可以使用,因此如果加载的驱动DLL 较多时,可能虚拟内存用尽。我的奇怪的问题是: 在我们的PDA上面(wince5),在没有加入CAMERA模块时,输入法是可以正常调出来的,但是自从加入了CAMERA后,我的输入法怎么 ...… 查看全部问答> |
|
程序是wince6.0 c#语言开发的 有台HP的打印我要在里面实现打印 功能如何做 目前我打印出来是几跟线, 忘大虾们提供思路及代码 。。 … 查看全部问答> |




