刚刚接触STM32,感觉和arduino完全是两个难度,如果说arduino是乐高积木,那我感觉STM32就跟盖楼一样,哈哈,是真的难,真的极具挑战性,可能是我刚开始学觉得难,到后面熟练了应该会好一些,言归正传,就讲一讲我们学长给我们下的任务矩阵键盘。
学长学姐们做的是九键的矩阵键盘,我们做的是四键的,难度其实相差不大,换汤不换药的类型,原理就是一二号线通高电平,三四号线低电平,然后交换,让一二号低电平,三四号高电平这样就可以确定是哪个按键被按下。
OK上代码
key.c函数
#include "key.h"
#include "delay.h"
#include "usart.h"
void KEY_Init1(void)
{
RCC->APB2ENR|=1<<3;
JTAG_Set(SWD_ENABLE);
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00800000;
// GPIOB->ODR|=1<<5;
GPIOB->CRL&=0XF0FFFFFF;
GPIOB->CRL|=0X08000000;
//GPIOB->ODR|=1<<6;
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=0X80000000;
//GPIOB->ODR|=1<<7;
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X00000003;
GPIOB->ODR|=1<<8;
GPIOB->CRH&=0XFFFFFF0F;
GPIOB->CRH|=0X00000030;
GPIOB->ODR|=1<<9;
GPIOB->CRH&=0XFFFFF0FF;
GPIOB->CRH|=0X00000300;
GPIOB->ODR|=1<<10;
key9_Out=1;key8_Out=1;
}
void KEY_Init2(void)
{
//RCC->APB2ENR|=1<<3;
//JTAG_Set(SWD_ENABLE);
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;
GPIOB->ODR|=1<<5;
GPIOB->CRL&=0XF0FFFFFF;
GPIOB->CRL|=0X03000000;
GPIOB->ODR|=1<<6;
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=0X30000000;
GPIOB->ODR|=1<<7;
GPIOB->CRH&=0XFFFFFFF0;
GPIOB->CRH|=0X00000008;
//GPIOB->ODR|=1<<8;
GPIOB->CRH&=0XFFFFFF0F;
GPIOB->CRH|=0X00000080;
//GPIOB->ODR|=1<<9;
GPIOB->CRH&=0XFFFFF0FF;
GPIOB->CRH|=0X00000800;
//GPIOB->ODR|=1<<10;
key6_Out=1;key5_Out=1;
}
u8 KEY_Scan1()
{
u8 H=0;
GPIOB->ODR&=~(1<<5);
GPIOB->ODR&=~(1<<6);
GPIOB->ODR&=~(1<<7);
KEY_Init1();
if(key5_In==1||key6_In==1)
{
delay_ms(50);
if(key5_In==1)
H=1;
if(key6_In==1)
H=2;
return H*10;
}
else
return 0;
}
u8 KEY_Scan2()
{
u8 L=0;
GPIOB->ODR&=~(1<<8);
GPIOB->ODR&=~(1<<9);
GPIOB->ODR&=~(1<<10);
KEY_Init2();
if(key8_In==1||key9_In==1)
{
delay_ms(50);
if(key8_In==1)
L=1;
else if(key9_In==1)
L=2;
return L;
}
else return 0;
}
void KEY_Print(void)
{
int t=0;
t= KEY_Scan1()+KEY_Scan2();
if(t!=0)
{
if(t==11)
printf("1rn");
else if(t==12)
printf("2rn");
else if(t==21)
printf("3rn");
else if(t==22)
printf("4rn");
}
}
key.h函数
{
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY1H_PRES 1
#define KEY2H_PRES 2
#define KEY1L_PRES 1
#define KEY2L_PRES 2
#define key5_In PBin(5) //PB5
#define key6_In PBin(6) //PB6
//PB7
#define key5_Out PBout(5)
#define key6_Out PBout(6)
#define key8_In PBin(8)
#define key9_In PBin(9)
#define key8_Out PBout(8) //PB8
#define key9_Out PBout(9) //PB9
void KEY_Init1(void);
void KEY_Init2(void);
u8 KEY_Scan1();
u8 KEY_Scan2();
void KEY_Print(void);
#endif
}
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
while(1)
{
KEY_Print();
}
}
当按到键盘不同的按键时,会在串口调试器上反馈不同的结果(1-4)
上一篇:STM32 矩阵键盘通过串口输出
下一篇:STM32笔记(二)(寄存器)——矩阵键盘
推荐阅读最新更新时间:2024-11-12 14:22