标题:
stm32的4*4矩阵键盘驱动程序
[打印本页]
作者:
51heidianzil121
时间:
2017-8-28 23:10
标题:
stm32的4*4矩阵键盘驱动程序
用于4*4矩阵键盘的驱动,可直接修改
添加很简单,直接把.c和.h加上去就可以
该驱动是针对4x4矩阵键盘的,支持连按和不连按两种模式
a=KEY_Scan(0); 调用它 0是不连按 1是连按
引脚根据需要自己自改,为了让大家尽量不改引脚我选择了不常用的8个连续引脚
矩阵键盘直接就可以插到咱们统一购买的最小系统版上
有关返回值说明:
正面朝上黑引脚为行,白引脚为列
1-9返回 1-9
A、B 、C 、D 分别返回 10 11 12 13
*为 14
#为 15
0为 16
引脚说明:
PB14
PD8 10 12 14
PG2 4 6
顺着插就可以
无按键按下返回0
0.png
(43.19 KB, 下载次数: 121)
下载附件
2017-8-29 00:10 上传
单片机源程序如下:
/************************************************************
正面朝上黑引脚为行,白引脚为列
A、B 、C 、D 分别返回 10 11 12 13
*为 14
#为 15
0为 16
无按键按下返回0
*************************************************************/
#include "key.h"
#include "delay.h"
//矩阵键盘引脚初始化
void Key_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG,ENABLE);//使能PORTB,PORTD,PORTG时钟
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试,引脚比较可能存在占用
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14; //键盘输出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_6; //键盘输出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14; //键盘输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12; //键盘输入
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
//mode:0,不支持连续按;1,支持连续按;
u8 KEY_Scan(u8 mode)
{
static u8 key0_up=1;//按键按松开标志
static u8 key1_up=1;//按键按松开标志
static u8 key2_up=1;//按键按松开标志
static u8 key3_up=1;//按键按松开标志
static u8 key4_up=1;//按键按松开标志
static u8 key5_up=1;//按键按松开标志
static u8 key6_up=1;//按键按松开标志
static u8 key7_up=1;//按键按松开标志
static u8 key8_up=1;//按键按松开标志
static u8 key9_up=1;//按键按松开标志
static u8 keyA_up=1;//按键按松开标志
static u8 keyB_up=1;//按键按松开标志
static u8 keyC_up=1;//按键按松开标志
static u8 keyD_up=1;//按键按松开标志
static u8 keyX_up=1;//按键按松开标志
static u8 keyJ_up=1;//按键按松开标志
if(mode)
{
key0_up=1;
key1_up=1;
key2_up=1;
key3_up=1;
key4_up=1;
key5_up=1;
key6_up=1;
key7_up=1;
key8_up=1;
key9_up=1;
keyA_up=1;
keyB_up=1;
keyC_up=1;
keyD_up=1;
keyX_up=1;
keyJ_up=1;
}
//第一行
Hang_00_L;//把第一行输出低电平
Hang_01_H;
Hang_02_H;
Hang_03_H;
if(key1_up&&Lie_00_V==0)
{
delayMs(jpys); //延时20秒,软件消抖
key1_up=0;
if(Lie_00_V==0) //如果第一列是低电平,说明有键被按下,如果没有直接退出if语句
{
return 1;
}
}else if(Lie_00_V==1)key1_up=1;
if(key2_up&&Lie_01_V==0)//如果第二列是低电平,
{
delayMs(jpys);//延时20秒,软件消抖
key2_up=0;
if(Lie_01_V==0)//如果第二列是低电平,说明有键被按下,如果没有直接退出if语句
{
return 2;
}
}else if(Lie_01_V==1)key2_up=1;
if(key3_up&&Lie_02_V==0)
{
delayMs(jpys);
key3_up=0;
if(Lie_02_V==0)
{
return 3;
}
}else if(Lie_02_V==1)key3_up=1;
if(keyA_up&&Lie_03_V==0)//如果第四列是低电平
{
delayMs(jpys);
keyA_up=0;
if(Lie_03_V==0)//如果第四列是低电平,说明有键被按下,如果没有直接退出if语句
{
return 10;
}
}else if(Lie_03_V==1)keyA_up=1;
//第二行
Hang_00_H;
Hang_01_L;//把第二行拉低
Hang_02_H;
Hang_03_H;
if(key4_up&&Lie_00_V==0)//如果第一列是低电平
{
delayMs(jpys);
key4_up=0;
if(Lie_00_V==0)//说明有键被按下,如果没有直接退出if语句
{
return 4;
}
}else if(Lie_00_V==1)key4_up=1;
if(key5_up&&Lie_01_V==0)
{
delayMs(jpys);
key5_up=0;
if(Lie_01_V==0)
{
return 5;
}
}else if(Lie_01_V==1)key5_up=1;
if(key6_up&&Lie_02_V==0)
{
delayMs(jpys);
key6_up=0;
if(Lie_02_V==0)
{
return 6;
}
}else if(Lie_02_V==1)key6_up=1;
if(keyB_up&&Lie_03_V==0)
{
delayMs(jpys);
keyB_up=0;
if(Lie_03_V==0)
{
return 11;
}
}else if(Lie_03_V==1)keyB_up=1;
//第三行
Hang_00_H;
Hang_01_H;
Hang_02_L;//把第三行置低
Hang_03_H;
if(key7_up&&Lie_00_V==0) //如果第一列是低电平
{
delayMs(jpys);//延时20秒
key7_up=0;
if(Lie_00_V==0)//说明有键被按下,如果没有直接退出if语句
{
return 7;
}
}else if(Lie_00_V==1)key7_up=1;
if(key8_up&&Lie_01_V==0)
{
delayMs(jpys);
key8_up=0;
if(Lie_01_V==0)
{
return 8;
}
}else if(Lie_01_V==1)key8_up=1;
if(key9_up&&Lie_02_V==0)
{
delayMs(jpys);
key9_up=0;
if(Lie_02_V==0)
{
return 9;
}
}else if(Lie_02_V==1)key9_up=1;
if(keyC_up&&Lie_03_V==0)
{
delayMs(jpys);
keyC_up=0;
if(Lie_03_V==0)
{
return 12;
}
}else if(Lie_03_V==1)keyC_up=1;
//第四行
Hang_00_H;
Hang_01_H;
Hang_02_H;
Hang_03_L;//把第四行置低
if(keyX_up&&Lie_00_V==0)//如果第一列是低电平
{
delayMs(jpys);
keyX_up=0;
if(Lie_00_V==0)//说明有键被按下,如果没有直接退出if语句
{
return 14;
}
}else if(Lie_00_V==1)keyX_up=1;
if(key0_up&&Lie_01_V==0)
{
delayMs(10);
key0_up=0;
if(Lie_01_V==0)
{
return 16;
}
}else if(Lie_01_V==1)key0_up=1;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
TopApex_4x4矩阵键盘.rar
(355.67 KB, 下载次数: 701)
2017-8-29 00:12 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
haizhixin
时间:
2018-3-29 15:47
stm32能用么
...
作者:
huangjiaqi1995
时间:
2018-4-5 09:59
为什么回复的人不多?
作者:
一波三折
时间:
2018-4-26 15:09
好吗?
作者:
fengye5340
时间:
2018-5-15 14:52
下载看看,可能会有帮助
作者:
8023love
时间:
2018-6-4 10:18
谢谢分享
作者:
麦昆
时间:
2018-6-4 17:18
厉害,这么复杂,比51麻烦多了
作者:
hanmingxiu
时间:
2018-6-7 22:42
请问用的都是什么版本的开发软件
作者:
sypsyp
时间:
2018-6-19 16:22
谢谢分享!!
作者:
tigerkiller
时间:
2018-6-27 12:00
不错不错
作者:
qq1074896286
时间:
2018-7-15 19:52
这个是STM32的代码么??
作者:
cxiu
时间:
2018-8-17 15:00
谢谢分享
作者:
kevin82626
时间:
2018-8-22 18:08
嵌套在 SWITCH内就不行了
WHILE()
{
SCANKEY();
执行键盘输入语句; //这个地方的程序可以正常实现键盘输入功能
SWITCH(SCANKEY())
{
CASE 16: 执行键盘输入语句;//这个地方的同样的语句不能正常实现键盘输入功能,值永远都是16
}
}
作者:
tjx_24
时间:
2018-9-1 21:43
谢谢,这么好的代码
作者:
tjx_24
时间:
2018-9-1 21:56
谢谢分享!
作者:
yxlei82
时间:
2018-9-3 17:52
谢谢分享!
作者:
青芒
时间:
2018-11-28 17:57
还行,有点复杂,但是功能看起来挺全
作者:
我踏浪而来
时间:
2018-11-29 16:00
下来看看
作者:
veraz97
时间:
2018-11-29 16:52
谢谢分享
作者:
1282834007
时间:
2019-3-24 00:54
怎么根本就不管用,我想知道主函数是什么
作者:
sh8hd
时间:
2019-4-12 19:16
试一下看看可以用吗
作者:
lyseg
时间:
2019-4-13 10:05
谢谢分享!
作者:
1078595847
时间:
2019-5-5 20:54
谢谢分享!
作者:
瑾年Higher
时间:
2019-5-17 17:56
感觉太复杂了
作者:
snf
时间:
2019-6-1 17:44
谢谢分享
作者:
lz10091999
时间:
2019-7-11 20:43
为什么下不了呢
作者:
mengshen01
时间:
2019-8-8 09:26
感谢分享!
作者:
ice45862
时间:
2019-8-8 16:43
谢谢分享!
作者:
Conquring
时间:
2019-8-9 00:35
您好,请问如何使用矩阵键盘输入任意值呀
作者:
899
时间:
2019-8-9 08:05
谢谢分享
作者:
111111111dewd
时间:
2019-8-9 13:07
厉害厉害
作者:
17856697336
时间:
2019-8-9 15:10
学习一下,谢谢分享
作者:
915572320
时间:
2019-8-9 21:01
谢谢学习一下,谢谢分享
作者:
915572320
时间:
2019-8-9 21:02
没积分咋办
作者:
15984935083
时间:
2019-12-18 10:29
915572320 发表于 2019-8-9 21:02
没积分咋办
感觉很好用,谢谢大佬分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1