在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。本文为大家介绍stm32寄存器版矩阵键盘库函数。
stm32寄存器版矩阵键盘库函数
////////////////////.h文件
#ifndef __KEY_H
#define __KEY_H
#include “sys.h”
#define KEYa PAin(13) //PA13
#define KEYb PAin(15) //PA15
#define KEYc PAin(0) //PA0 WK_UP
#define KEY0 PAin(4) //PA4矩阵键盘的第1列
#define KEY1 PAin(5) //PA5 2
#define KEY2 PAin(6) //PA6 3
#define KEY3 PAin(7) // 4
#define KEY4 PAin(0) //第1行
#define KEY5 PAin(1) // 2
#define KEY6 PAin(2) // 3
#define KEY7 PAin(3) // 4
extern void juzhe_Init(void);//IO初始化
extern u8 KEY_Get(void); //按键扫描函数
void KEY_Init(void);//IO初始化
u8 KEY_Scan(void); //按键扫描函数
#endif
////////////////////////.c文件
#include
#include “key.h”
#include “delay.h”
//按键初始化函数
//特别注意:在该函数之后,JTAG将无法使用(SWD也无法使用)
//如果想JTAG仿真,可以屏蔽该函数。
//PA0.13.15 设置成输入
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0F0FFFFF;//PA13,15设置成输入
GPIOA->CRH|=0X80800000;
GPIOA->ODR|=1<<13; //PA13上拉,PA0默认下拉
GPIOA->ODR|=1<<15; //PA15上拉
}
//按键处理函数
//返回按键值
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2!!
u8 KEY_Scan(void)
{
static u8 key_up=1;//按键按松开标志
JTAG_Set(JTAG_SWD_DISABLE);
if(key_up&&(KEYa==0||KEYb==0||KEYc==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEYa==0)
{
JTAG_Set(SWD_ENABLE);
return 1;
}
else if(KEYb==0)
{
JTAG_Set(SWD_ENABLE);
return 2;
}
else if(KEYc==1)
{
JTAG_Set(SWD_ENABLE);
return 3;
}
}else if(KEYa==1&&KEYb==1&&KEYc==0)key_up=1;
JTAG_Set(SWD_ENABLE);
return 0;// 无按键按下
}
void juzhe_Init1(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0X00000000;//PA0-3设置成输入 PA4-7设置成推挽输出
GPIOA->CRL|=0X33338888;
GPIOA->BSRR|=1<<0; //PA0-3设置输入上拉 P¥4-7设置成推挽输出低电位
GPIOA->BSRR|=1<<1;
GPIOA->BSRR|=1<<2;
GPIOA->BSRR|=1<<3;
GPIOA->BRR|=1<<4;
GPIOA->BRR|=1<<5;
GPIOA->BRR|=1<<6;
GPIOA->BRR|=1<<7;
}
void juzhe_Init2(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0X00000000; // 与上面一个函数设置的IO口相反
GPIOA->CRL|=0X88883333;
GPIOA->BRR|=1<<0;
GPIOA->BRR|=1<<1;
GPIOA->BRR|=1<<2;
GPIOA->BRR|=1<<3;
GPIOA->BSRR|=1<<4;
GPIOA->BSRR|=1<<5;
GPIOA->BSRR|=1<<6;
GPIOA->BSRR|=1<<7;
}
u8 KEY_Get(void)
{
static u8 key_up=1; u8 m=0;
juzhe_Init1();
delay_ms(1);
if(key_up&&(KEY4==0||KEY5==0||KEY6==0||KEY7==0)) //检测哪一行有按键按下
{
delay_ms(10);
key_
up=0;
if(!KEY4) //判断在对应行下的哪一列
{
m=0;
juzhe_Init2();
delay_ms(1);
if(!KEY0) //检测哪一列有按键按下,求出对应的键,返回设定的键值
return m+1 ;
if(!KEY1)
return m+2;
if(!KEY2)
return m+3;
if(!KEY3)
return m+4;
}
if(!KEY5)
{
m=4;
juzhe_Init2();
delay_ms(1);
if(!KEY0)
return m+1 ;
if(!KEY1)
return m+2;
if(!KEY2)
return m+3;
if(!KEY3)
return m+4;
}
if(!KEY6)
{
m=8;
juzhe_Init2();
delay_ms(1);
if(!KEY0)
return m+1 ;
if(!KEY1)
return m+2;
if(!KEY2)
return m+3;
if(!KEY3)
return m+4;
}
if(!KEY7)
{
m=12;
juzhe_Init2();
delay_ms(1);
if(!KEY0)
return m+1 ;
if(!KEY1)
return m+2;
if(!KEY2)
return m+3;
if(!KEY3)
return m+4;
}
}
else if(KEY4==1&&KEY5==1&&KEY6==1&&KEY7==1) //如果没有检测到按键的话返回0
key_up=1;
return 0;
}
评论
查看更多