历史上的今天
今天是:2025年08月16日(星期六)
2019年08月16日 | STM32 学习笔记 一.矩阵键盘
2019-08-16 来源:eefocus
刚刚接触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)
史海拾趣
|
具体活动链接地址如下:https://www.eeworld.com.cn/zhuanti/newevoconline/index.asp 好消息! 各位工程师: 大家好!2008年9月17日上午10点到11点30,研祥携蓝宇科技将做客电子工程世界,就嵌入式系统设 ...… 查看全部问答> |
|
中国科学家研制成功具有自主知识产权的新一代电源——镁基特种电源。这种电源不仅可替代锌锰电池、铅酸电池、镉镍电池等传统电源,还能在1500米深海、40000米高空等多种极端状态下正常工作,在工业和国防等领域有着广泛的用途。据新电源研制者、中 ...… 查看全部问答> |
|
有memory windows 在address 中输入d:0xf0,发现好像看到的是sfr,而不是高128字节的数据 (因为我已经执行了,所有数据区清零,可是在memory windows看到的依旧是FF???)… 查看全部问答> |
|
深圳市快星半导体电子有限公司是专业生产、开发为一体的企业。产品有全系列贴片(SMD)、直插(DIP),二、三极管、三端稳压管、达林顿管、场效应管、稳压电路、稳压二极管、开关晶体管、可控硅、肖特基、IC集成电路,其产品广泛用于开关电源, ...… 查看全部问答> |




