在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;
}
評論
查看更多