STM32 学习笔记 一.矩阵键盘

发布者:会弹琴的鲸鱼3312最新更新时间: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  矩阵键盘  按键 引用地址:STM32 学习笔记 一.矩阵键盘

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

推荐阅读最新更新时间:2024-11-12 14:22

带有LED警示灯的骑行夜服设计
近年来,夜间骑车或跑步遭遇不幸的事件时有发生,这往往是因为在转弯或者高速行驶的过程中,汽车司机受限夜间视场,来不及避让而造成的。传统的夜行服大多采用被动方式,即由反光材料制作而成,在暗光条件下工作的人员广泛使用,由于利用的是反光原理,只有在灯光照射下才能进行反光,而且不同灯光照射产生的反光效果不同,因此大大限制了夜光服的使用场合和使用人群。有些主动发光的LED灯,发光面很小,强度较弱,无法起到好的警示作用。 本文设计了一套带有LED警示功能的骑行夜服,能够在夜晚自主发光,该夜行服可为需要在夜间出行的骑行者或跑步者起到好的保护作用。 1、系统方案总体设计 系统总体框图如图1所示,以STM32单片机为主控制核心,包括LED
[电源管理]
STM32 通用输入输出端口GPIO BRR、BSRR、ODR寄存器详解
详细页面:http://alanzjl.sinaapp.com/2015/02/gpio_brr_bsrr_odr/ BRR、BSRR、ODR都是用来控制16位针脚的。 其中,BRR和ODR高16位都不可用(Reserved),使用低16位控制针脚,而BSRR高16位和低16位皆可用,都用来控制16位针脚。 BRR与BSRR使用方法 BRR和BSRR的最显著用处就是可以只改变某一个或某几个针脚的值而不改变其他。 1.BRR:如果程序对其某针脚赋值0,则该针脚维持原值不变,比如BRR的位0本来为1,则GPIOx- BRR=0x0语句之后该位值还为1。若对其赋值1,则该位值变为0(即复位值),比如BRR的位0本来为1,则GPI
[单片机]
<font color='red'>STM32</font> 通用输入输出端口GPIO BRR、BSRR、ODR寄存器详解
STM32 时钟RCC相关配置参考stm32f10x_rcc.h
1. 时钟使能配置: RCC_LSEConfig()、RCC_HSEConfig()、 RCC_HSICmd()、RCC_LSICmd()、RCC_PLLCmd()...... 2. 时钟源相关配置: RCC_PLLConfig()、RCC_SYSCLKConfig()、 RCC_RTCCLKConf()..... 3. 分频系数选择配置: RCC_HCLKConfig()、RCC_PCLK1Config()、RCC_PCLK2Config()...... 4. 外设时钟使能: RCC_APB1PeriphClockCmd(); // APB1线上外设时钟使能 RCC_APB2PeriphC
[单片机]
<font color='red'>STM32</font> 时钟RCC相关配置参考stm32f10x_rcc.h
单片机中最简单实用的按键程序
我想了很久才写成的这个按键程序;先讲讲我的思路, 我的思路很简单就是一般的按键不是需要去抖动延时,我想单片机够慢的了,用什么方法不要去延时,所以我就想到在定时中断中插入按键扫描程序,如果连续两个中断程序中都有按键,就可以认为有按键。 但是我下面的这个程序中有个缺陷,那就是没有加入去抖动的方法,为了缩短短程序的总长度,我就是没有写,这个我用在一个平时的一个小的测试部件控制程序中,去抖动没什么实际的意义,就没有写! uchar key = 0; uchar key0 = 0; uchar key1 = 0; uchar key2 = 0; uchar key3 = 0; uchar key4 = 0; //以上为全局变量 vo
[单片机]
stm32——端口重映射
我们先来看什么是复用功能? 我们在《stm32f103rc_datasheet.pdf》中可以看到对I/O口的功能描述表格 比如:PC10 I/O口,UART4_TX与SDIO_D2功能都是PC10 I/O口的复用功能。也就是说,PC10 I/O口不仅仅只能进行由内核控制的输入/输出功能,还可以进行由片上外设控制的UART4_TX与SDIO_D2功能。注意:UART4_TX与SDIO_D2功能是来自不同模块的功能。 当我们使用复用功能UART4_TX时,那么PC10 I/O口就由UART外设模块控制,此时PC10 I/O口输入/输出的数据就都来自于UART外设模块了,而不是来自于内核或者其他外设模块。 注意:
[单片机]
<font color='red'>stm32</font>——端口重映射
STM32 BOOT模式配置以及作用
一、三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。 Main Flash memory 是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。 System memory 从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一
[单片机]
<font color='red'>STM32</font> BOOT模式配置以及作用
基于stm32的自定义HID设备开发与上位机通讯实现
1.HID通信的实现 2.使用USB外设 3.使用HID设备 4.配置时钟 5.USB中断放低点 6.生成代码,替换配置描述符 /* USB HID device Configuration Descriptor */ __ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc __ALIGN_END = { 0x09, /* bLength: Configuration Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_HID_CO
[单片机]
基于<font color='red'>stm32</font>的自定义HID设备开发与上位机通讯实现
STM32时钟要先倍频N倍再分频的原因是什么?
有些朋友不理解为什么STM32时钟要先倍频N倍,再分频?你会担心这个值太大吗? 1写在前面 STM32时钟的功能,可以说是越来越强大了。 从各个系列的时钟树可以看得出来,最早F1系列的时钟功能相对比较简单,到这后面H7、G0的时钟越来越丰富。 今天讲述一下其中的PLL环节。 2关于PLL 什么是PLL? PLL:Phase Locked Loop锁相环。 PLL用于振荡器中的反馈技术,通常需要外部的输入信号与内部的振荡信号同步。 一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,由相应的器件VCO,实现转成高频,但并不稳定,故利用锁相环路就可以实现稳定且高频的时钟信号。 每一块STM32处理器至少都有一个PLL,
[单片机]
<font color='red'>STM32</font>时钟要先倍频N倍再分频的原因是什么?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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