历史上的今天
今天是:2025年02月18日(星期二)
2020年02月18日 | stm32寄存器版矩阵键盘库函数(附详细注释)
2020-02-18 来源:elecfans
在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;
}
史海拾趣
|
最近在分析freescal 的I.Mx27的eboot的code,有个问题请请教大侠: 我在分析 函数 ReadKernelRegionFromNand()的时候在这句上想不通了 // Read kernel region info from parameters if(BP_ReadData(hPa ...… 查看全部问答> |
|
unsigned int result[4]; void init_ADC10() { P1SEL|=BIT0+BIT3+BIT4+BIT5; ADC10AE0|=BIT0+BIT3+BIT4+BIT5; // 使P1.0允许AD模拟输入信号 ADC10CTL0=ADC10ON+MSC+SREF_0;// ...… 查看全部问答> |
|
小弟在做modbusrtu通信,使用149单片机定时发送数据帧,但是接收到到数据帧怎么都一样呢? resvbuf[0]——resvbuf[8]接收到的是一样的16进制数据,不知道什么原因,还望高手给予指点!!!谢谢 #pragma vector = TIMERA0_VECTOR __interrupt voi ...… 查看全部问答> |
|
board_api.h中给出了通过USART0输出DEBUG信息的函数DEBUGOUT(),实质是重定向到串口的printf: board.c中给出了USART0的初始化配置,可以看出波特率设为115200 因此在串口工具中选择相同的波特率,数据位为8。使用新唐的牛桥连接LPC54102的 ...… 查看全部问答> |
|
本帖最后由 平漂流 于 2016-7-18 15:30 编辑 有关电磁场的近区场与远区场的划分,目前看到了3个版本,一个是小于一个电磁波波长λ的是近区场,大于一个波长的是远区场;一个是小于3个波长的是近区场,大于三个波长的是远区场;最后一个是如下图所 ...… 查看全部问答> |
|
STM32学习第八贴,有了位带,为啥还要有其他方式操作IO口,欢迎高手来喷,来指导 本帖最后由 long521 于 2017-7-13 10:21 编辑 最近空的时候,试着用STM32来操作一些简单的例程,发现IO的高低完全可以用位带这种方式就可以了,但是为什么还要用寄存器方式,还有库函数这种方式,库函数也很方便,只要一个函数执行一下就是高,另 ...… 查看全部问答> |




