历史上的今天
今天是:2025年04月08日(星期二)
2019年04月08日 | 关于STM32F103型号的矩阵按键的程序书写
2019-04-08 来源:eefocus
最近参加电子大赛要写一个矩阵按键,刚开始写了好长时间换了好几个矩阵按键都不好使,但是 我感觉我的程序和原理都没有错,调试了好久也没有发现问题在哪?我按照我自己的思路把程序重写了一遍bug消失了,程序很好的运行。程序贴出来,纪念一下。
#include "keypad.h"
#include "stm32f10x.h"
#include "delay.h"
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/*本文件是矩阵按键功能文件,使用方法是:直接调KEYPAD_Scan函数得到一个返回值*/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
//函数名:KEYPad_Init1
//参数:无
//功能:行检测初始化
//返回值;无
void KEYPad_Init1(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//开启时钟,使能GPIOB时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 B0-B3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入 B4-B7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
//函数名:KEYPad_Init2
//参数:无
//功能:列检测初始化
//返回值:无
void KEYPad_Init2(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//开启时钟,使能GPIOB时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入 B0-B3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 B4-B7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
}
//函数名:扫描函数
//入口参数:无
//返回值:键值
//功能:矩阵按键扫描,返回一个键值
u16 KEYPAD_Scan()
{
static u16 keyvalue = 0;
u32 readvalue = 0;
KEYPad_Init1();
readvalue = GPIO_ReadInputData(GPIOF);
readvalue &= 0x00ff;
//return readvalue;
if(readvalue != 0x000f)
{
delay_ms(8);//消抖10ms
if(readvalue != 0x000f)
{
readvalue = GPIO_ReadInputData(GPIOF);//再次读取状态
readvalue &= 0x00ff;
//return readvalue;
switch(readvalue)
{
case (0x001f):keyvalue = 0;break;
case (0x002f):keyvalue = 1;break;
case (0x004f):keyvalue = 2;break;
case (0x008f):keyvalue = 3;break;
}
//return readvalue;
KEYPad_Init2();
delay_ms(5);
readvalue = GPIO_ReadInputData(GPIOF);//再次读取状态
readvalue |= 0x00f0;
readvalue &= 0x00ff;
//return readvalue;
switch(readvalue)
{
case (0x00f1):keyvalue += 0;break;
case (0x00f2):keyvalue += 4;break;
case (0x00f4):keyvalue += 8;break;
case (0x00f8):keyvalue += 12;break;
}
while(readvalue != 0x00f0)//检测按键松开
{
readvalue = GPIO_ReadInputData(GPIOF);//再次读取状态
readvalue |= 0x00f0;
readvalue &= 0x00ff;
}
//return readvalue;
}
}
return keyvalue;
}
史海拾趣
|
提出的选择原则是将电机特性与负载特性分离开 ,并用图解的形式表示 ,这种表示方法使得驱动 装置的可行性检查和不同系统间的比较更方便 ,另外 ,还提供了传动比的一个可能范围.… 查看全部问答> |
|
快速获得芯币的另一种方法,就是与博客紧密结合。规则如下,请大家详细阅读啊! 1、注册博客 + 20 芯币 2、在论坛签名中注明自己博客地址 +5 芯币 3、博客个人信息注册完全,其中上传电子相片 +5芯币 4、 ...… 查看全部问答> |
|
最近刚刚从图书馆借到一本新书《dsp控制技术实践》。中国电力出版社出版,2009.5出版的。专门讨论dsp2812的片子的使用,比ti的中文手册薄多了,看起来挺舒服的。推荐给大家。… 查看全部问答> |
|
GBLS MainEntry MainEntry SETS \"Main\" IMPORT $MainEntry MainEntry不是已经在第一行就已经定 ...… 查看全部问答> |
|
这是朋友的一个毕业设计题目。别的部分没什么特别。但是,这个课题使用了MC2822/MC3363这一对摩托罗拉的音频收发芯片来实现无线收发。我的毕业设计用的是nRF24L01,所以我很习惯性用这个去套它的思路。可是我在网上查了查,似乎没有找到关于它的编程 ...… 查看全部问答> |
|
最新版本号: 1.0.1.111031 更新日期: 2011.10.26 下载地址1 http://stu.cidp.edu.cn/SmartDebug.rar 下载地址1 下载地址2 http://www.vdisk.cn/down/index/8990713A3710 下 ...… 查看全部问答> |




