STM32 学习笔记 一.矩阵键盘

刚刚接触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("1\r\n");
	 else if(t==12)
		 printf("2\r\n");
	 else if(t==21)
		 printf("3\r\n");
	 else if(t==22)
		 printf("4\r\n");
  }
} 

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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值