標(biāo)題:
STM32 4X4按鍵矩陣的小程序
[打印本頁(yè)]
作者:
MrHuan991
時(shí)間:
2019-2-16 04:28
標(biāo)題:
STM32 4X4按鍵矩陣的小程序
前篇帖子寫了基本的GPIO復(fù)用技術(shù),現(xiàn)在補(bǔ)上按鍵矩陣技術(shù),由于STM32的GPIO口不像傳統(tǒng)51,準(zhǔn)雙向口,故而不能使用線反轉(zhuǎn)法,我采用了行列掃描的技術(shù),GPIO口用了A組,故而庫(kù)函數(shù)沒(méi)法直接調(diào)用賦值和讀取同時(shí)16位的函數(shù),只能調(diào)用一個(gè)個(gè)pin讀取函數(shù)和賦值函數(shù),顯得有點(diǎn)臃腫。但是STM32性能牛逼,這么多if的語(yǔ)句還跑的這么流暢,如果是C51早gg了,在STC12勉強(qiáng)可以看看。僅供參考。STM32學(xué)起來(lái)比51更費(fèi)勁,英語(yǔ)不好的話,庫(kù)函數(shù)弄死人。
此工程,主要用于編程4X4按鍵矩陣的識(shí)別和編碼的功能
單片機(jī)源程序如下:
#include <STM32F10X.H>
#include <misc.h>
#define PA0_Low GPIO_ResetBits(GPIOA,GPIO_Pin_0)
#define PA0_High GPIO_SetBits(GPIOA,GPIO_Pin_0)
#define PA1_Low GPIO_ResetBits(GPIOA,GPIO_Pin_1)
#define PA1_High GPIO_SetBits(GPIOA,GPIO_Pin_1)
#define PA2_Low GPIO_ResetBits(GPIOA,GPIO_Pin_2)
#define PA2_High GPIO_SetBits(GPIOA,GPIO_Pin_2)
#define PA3_Low GPIO_ResetBits(GPIOA,GPIO_Pin_3)
#define PA3_High GPIO_SetBits(GPIOA,GPIO_Pin_3)
#define PA4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#define PA5 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)
#define PA6 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
#define PA7 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)
#define PC15_Low GPIO_WriteBit(GPIOC,GPIO_Pin_15,Bit_RESET)
#define PC15_High GPIO_WriteBit(GPIOC,GPIO_Pin_15,Bit_SET)
void RCC_Configuration(void); //時(shí)鐘與復(fù)位寄存器
void GPIO_Configuration(void); //GPIO口初始化函數(shù)
void Delay_ms(u16 n); //ms級(jí)別延時(shí)函數(shù)
u16 Array_Key(void); //4X4按鍵矩陣檢測(cè)函數(shù)
void Led_Show(u16 keystatus); //按鍵檢測(cè)后的狀態(tài)顯示函數(shù)
u16 ledcount=0;
u16 status=0;
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
while(1)
{
Led_Show(Array_Key());
}
}
void RCC_Configuration(void)
{
SystemInit();
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_Struct; //定義一個(gè)GPIO初始化的結(jié)構(gòu)體變量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_Init(GPIOA,&GPIO_Struct);
GPIO_Struct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_Init(GPIOA,&GPIO_Struct);
GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Struct.GPIO_Pin=GPIO_Pin_15;
GPIO_Init(GPIOC,&GPIO_Struct);
PA0_High;PA1_High;PA2_High;PA3_High;
PC15_Low;
}
u16 Array_Key(void)
{
PA0_Low;PA1_High;PA2_High;PA3_High;
if(PA4 == 0)
{
Delay_ms(10);
if(PA4 == 0)
{
while(!PA4);
status = 1;
}
}
if(PA5 == 0)
{
Delay_ms(10);
if(PA5 == 0)
{
while(!PA5);
status = 2;
}
}
if(PA6 == 0)
{
Delay_ms(10);
if(PA6 == 0)
{
while(!PA6);
status = 3;
}
}
if(PA7 == 0)
{
Delay_ms(10);
if(PA7 == 0)
{
while(!PA7);
status = 4;
}
}
PA0_High;PA1_Low;PA2_High;PA3_High;
if(PA4 == 0)
{
Delay_ms(10);
if(PA4 == 0)
{
while(!PA4);
status = 5;
}
}
if(PA5 == 0)
{
Delay_ms(10);
if(PA5 == 0)
{
while(!PA5);
status = 6;
}
}
if(PA6 == 0)
{
Delay_ms(10);
if(PA6 == 0)
{
while(!PA6);
status = 7;
}
}
if(PA7 == 0)
{
Delay_ms(10);
if(PA7 == 0)
{
while(!PA7);
status = 8;
}
}
PA0_High;PA1_High;PA2_Low;PA3_High;
if(PA4 == 0)
{
Delay_ms(10);
if(PA4 == 0)
{
while(!PA4);
status = 9;
}
}
if(PA5 == 0)
{
Delay_ms(10);
if(PA5 == 0)
{
while(!PA5);
status = 10;
}
}
if(PA6 == 0)
{
Delay_ms(10);
if(PA6 == 0)
{
while(!PA6);
status = 11;
}
}
if(PA7 == 0)
{
Delay_ms(10);
if(PA7 == 0)
{
while(!PA7);
status = 12;
}
}
PA0_High;PA1_High;PA2_High;PA3_Low;
if(PA4 == 0)
{
Delay_ms(10);
if(PA4 == 0)
{
while(!PA4);
status = 13;
}
}
if(PA5 == 0)
{
Delay_ms(10);
if(PA5 == 0)
{
while(!PA5);
status = 14;
}
}
if(PA6 == 0)
{
Delay_ms(10);
if(PA6 == 0)
{
while(!PA6);
status = 15;
}
}
if(PA7 == 0)
{
Delay_ms(10);
if(PA7 == 0)
{
while(!PA7);
status = 16;
}
}
return status;
}
void Delay_ms(u16 n)
{
u16 i;
while(n--)
{
i=12000;
while(i--);
}
}
void Led_Show(u16 keystatus)
{
if(keystatus != 0)
{ledcount++;status=0;}
if(ledcount % 2 == 0)
PC15_Low;
else
PC15_High;
}
復(fù)制代碼
所有資料51hei提供下載:
Key_Array.7z
(192.09 KB, 下載次數(shù): 49)
2019-2-17 03:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1