stm32寄存器版矩阵键盘库函数(附详细注释)

编程实验

72人已加入

描述

在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 < P>

#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;

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分