STM32 学习笔记 一.矩阵键盘

2019-08-16来源: eefocus关键字: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("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  矩阵键盘  按键

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471346.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 矩阵键盘通过串口输出
下一篇:STM32笔记(二)(寄存器)——矩阵键盘

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32CAN波特率计算小程序(QT源码)

软件:Qt Creator开发环境:Window7用qt做得一个计算波特率的小程序,在实际的应用中我们设置波特率的时候是通过以下参数来定的:CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;CAN_InitStructure.CAN_Prescaler=5;波特率计算小程序的截图:   根据所需的的采样点、波特率以及错误率得到以上外设初始化所需的参数。据网上资料,采样点的设置有以下规律:75%   
发表于 2019-08-20
stm32CAN波特率计算小程序(QT源码)

stm32之ADC应用实例(单通道、多通道、基于DMA)

硬件:STM32F103VCT6开发工具:Keil uVision4下载调试工具:ARM仿真器网上资料很多,这里做一个详细的整合。(也不是很详细,但很通俗)。所用的芯片内嵌3个12位的模拟/数字转换器(ADC),每个ADC共用多达16个外部通道,2个内部通道。3个:代表ADC1、ADC2、ADC3(下图是芯片固件库的截图)12位:也叫ADC分辨率、采样精度。先来看看二进制的12位可表示0-4095个数,也就是说转换器通过采集转换所得到的最大值是4095,如:“111111111111”=4095,那么我们怎么通过转换器转换出来的值得到实际的电压值呢?如果我们要转换的电压范围是0v-3.3v的话,转换器就会把0v-3.3v平均
发表于 2019-08-20
stm32之ADC应用实例(单通道、多通道、基于DMA)

stm32之TIM-基本定时器应用实例(详细)

开发环境:Window 7开发工具:Keil uVision4硬件:STM32F103VCT6定时器最基本的功能就是定时处理事情。比如定时发送USART数据、定时采集AD数据、定时检测IO口电位、还可以通过IO口输出波形等。可以实现非常丰富的功能。STM32系列的定时器分为基本定时器、通用定时器、高级控制定时器。后者包括前者的全部功能。所以先掌握基本定时器可以更好理解后面功能繁多的定时器。通常地,STM32高级定时器TIM1、TIM8,通用定时器TIM2、TIM3、TIM4、TIM5,基本定时器TIM6、TIM7。有用过STM32的话都知道,STM32所有的外设初始化都是使用标准库里的初始化结构体和初始化函数,下面先说一下
发表于 2019-08-20
stm32之TIM-基本定时器应用实例(详细)

stm32之TIM-高级定时器应用实例一(详细)

硬件:stm32f103c8t6开发工具:Keil uVision4下载调试工具:ARM仿真器        如果第一次接触定时器,可以先看基本定时器。本篇内容较多,如果想直接动手操作,可以跳到后面的实验代码。        stm32标准库对定时器外设建立了4个初始化结构体,定时器分为基本定时器、通用定时器、高级定时器,针对不用的定时器要使用不同初始化结构体。下面是4个初始化结构体的适用分类:TIM_TimeBaseInitTypeDef  (基本定时器、通用定时器、高级定时器)TIM_OCInitTypeDef   
发表于 2019-08-20
stm32之TIM-高级定时器应用实例一(详细)

stm32之iap实现应用(基于串口,上位机,详细源码)

除了用烧录器读写外,还可以在芯片运行时,对自身的内部flash进行读写。如果flash储存了程序后还有剩余的空间,那么可以把它用来保存程序运行时产生需要掉电保存的数据;也可以在芯片运行时将另一个编译后的二进制程序文件写到剩余的flash,然后进行跳转到新的程序上面运行。这也是iap的实现原理。1.先介绍怎么利用stm库对flash进行操作所有flash操作相关的函数接口在stm32f10x_flash.h里面。读flash里面的数据直接根据地址读出来就行了。往写flash里面写数据,需要解锁,擦除,写入数据,上锁;擦除后存储单元都变成1,因为储存单元不能由0变1,所以在写入之前一定要先擦除,不然会写入失败。操作代码如下:#define
发表于 2019-08-20
stm32之iap实现应用(基于串口,上位机,详细源码)

stm32之USB应用实例(官方例程资料下载使用)

开发环境:Window 7开发工具:Keil uVision5硬件:stc32f103c8t6stm32系列芯片很多都拥有一个USB2.0全速的通讯接口,下面介绍怎么使用st官方的usb应用例程。首先从官网下载源码:https://my.st.com/content/my_st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.html需要登录才能下载,如果没有账号,注册一个也很快的。下载解压,打开
发表于 2019-08-20
stm32之USB应用实例(官方例程资料下载使用)

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved