STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管

这篇具有很好参考价值的文章主要介绍了STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

本篇介绍的是基于STM32——寄存器版本的矩阵键盘控制5161as数码管显示数字的实例。我们赋予每一个按键从1到9的数字,当我们按下对应的数字按键时,程序会检测出被按下的是哪一个按键并在5261as数码管上显示相应的数字。

2、矩阵键盘

(1)原理

为了读取每一个按键的状态,最简单粗暴的方法就是给每一个按键都接一个引脚来读取按键状态。但对于一个3*3的键盘来说,就要占用9个I/O口。所以我们选择矩阵键盘。其本质就是用6条I/O线来进行9个按键的控制。用3条I/O线作为行线,三条I/O线作为列线,将按键放在行列线的交叉点上。当按下按键后对应的行列导通,通过扫描每行每列的方法来确定按键位置。其电路如图所示:
STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管

(2)实现方法

按键位置的读取有两种:逐行/逐列扫描行列扫描
本章使用的是逐行/逐列扫描的方法:先将每一列引脚设置为推免输出1(高电平),每一行引脚设置为0(输入下拉),当有按键被按下后行列导通,对应的行读入的引脚状态就会变为1(高电平),这样就确定了按键所在的行。再将行设置为推免输出,列设置为输入下拉用同样的方法读出按键所在的列。这样就确定了按键的具体位置。

3、5161as数码管

(1)原理

5261as数码管分为共阴极和共阳极,本章使用的是共阴极数码管,其原理如图所示:
STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管
5261as数码管由8个二极管组成一个数字8和一个小数点,这些二极管共用一个阴极。对应的10个引脚,除过两边中间的引脚是共阴极外,其他8个引脚分别控制八个不同位置的二极管,控制关系如图(a)所示。

(2)实现方法

对于共阴极数码管来说,将8个控制二极管的引脚分别接到不同的I/O端口上,两个共阴极的引脚接地。只要设置对应的I/O端口输出高电平,其他为低电平就能显示对应数字。比如要显示数字1,就可以将控制二极管e,f的引脚设置为推免输出高电平,其他为推免输出低电平,就可以只点亮e,f二极管。

4、硬件连接

我选择的键盘I/O接口是PB8-PB13,数码管I/O接口是PA0-PA7。实物连接如图所示:
STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管

5、程序设计

1、key.c中主要实现的是矩阵键盘逐行/逐列扫描。具体代码如下:

#include "key.h"
#include "delay.h"
#include "stm32f10x.h"



u8 KEY_Scan(void)
{
    u8 i=0,j=0;//用来记录按键所在的行和列
    RCC->APB2ENR |=1<<3;//使能时钟
    
    GPIOB->CRH&=0XFF000000;
	GPIOB->CRH|=0X00333888;//引脚PB8-PB10输入,PB11-PB13推免输出 
	GPIOB->ODR&=0X00000000;//将PB8-PB10设置为输入下拉
    PBout(11)=1;//PB11-PB13推免输出高电平
    PBout(12)=1;
    PBout(13)=1;
    PBin(8)=0;//初始化PBin的值
    PBin(9)=0;
    PBin(10)=0;
	if(PBin(8)==1||PBin(9)==1||PBin(10)==1)//第一次判断
	{
		delay_ms(10);//去抖动 
		if(PBin(8)==1)//再次判断
        {
            i=1;
        }else if(PBin(9)==1)
        {
            i=2;
        }else if(PBin(10)==1)
        {
            i=3;
        }else{
            return 0;
        }
    }
    
    //同上改变行列引脚状态
    GPIOB->CRH&=0XFF000000;	 
	GPIOB->CRH|=0X00888333; 			 
	GPIOB->ODR&=0X00000000;
    PBout(8)=1;
    PBout(9)=1;
    PBout(10)=1;
    PBin(11)=0;
    PBin(12)=0;
    PBin(13)=0;
	if(PBin(11)==1||PBin(12)==1||PBin(13)==1)
	{
		delay_ms(10);//去抖动 
		if(PBin(11)==1)//行
        {
            j=1;
        }else if(PBin(12)==1)
        {
            j=2;
        }else if(PBin(13)==1)
        {
            j=3;
        }else{
            return 0;
        }
    }
    
    //根据行列判断按键位置
    if(j==1&&i==1)
        return 1;
    else if(j==1&&i==2)
        return 2;
    else if(j==1&&i==3)
        return 3;
    else if(j==2&&i==1)
        return 4;
    else if(j==2&&i==2)
        return 5;
    else if(j==2&&i==3)
        return 6;
    else if(j==3&&i==1)
        return 7;
    else if(j==3&&i==2)
        return 8;
    else if(j==3&&i==3)
        return 9;
    else
        return 0;

}

2、led.c中主要控制5161as数码管各个引脚状态。具体代码如下:

#include "sys.h"   
#include "led.h"

//初始化PA8和PD2为输出口.并使能这两个口的时钟		    
//LED IO初始化

void LED_Init(void)
{
	RCC->APB2ENR|=1<<2;    //使能PORTA时钟	   	  
	GPIOA->CRL&=0X00000000; 
	GPIOA->CRL|=0X33333033;//PA0-7 推挽输出 
    JTAG_Set(SWD_ENABLE);	//关闭JTAG,开启SWD
    GPIOA->ODR&=0X00000000;//全部输出低电平
}

//设置每位数字输出的二极管状态
void LED_1(void)
{
    PAout(1)=0;
    PAout(0)=0;
    PAout(5)=0;
    PAout(6)=0;
    PAout(7)=1;
    PAout(3)=1;
    PAout(4)=0;
}
void LED_2(void)
{
    PAout(1)=1;
    PAout(0)=1;
    PAout(5)=0;
    PAout(6)=1;
    PAout(7)=1;
    PAout(3)=0;
    PAout(4)=1;
}
void LED_3(void)
{
    PAout(1)=1;
    PAout(0)=1;
    PAout(5)=1;
    PAout(6)=1;
    PAout(7)=0;
    PAout(3)=0;
    PAout(4)=1;
}
void LED_4(void)
{
    PAout(1)=0;
    PAout(0)=1;
    PAout(5)=1;
    PAout(6)=0;
    PAout(7)=0;
    PAout(3)=1;
    PAout(4)=1;
}
void LED_5(void)
{
    PAout(1)=1;
    PAout(0)=0;
    PAout(5)=1;
    PAout(6)=1;
    PAout(7)=0;
    PAout(3)=1;
    PAout(4)=1;
}
void LED_6(void)
{
    PAout(1)=1;
    PAout(0)=0;
    PAout(5)=1;
    PAout(6)=1;
    PAout(7)=1;
    PAout(3)=1;
    PAout(4)=1;
}
void LED_7(void)
{
    PAout(1)=1;
    PAout(0)=1;
    PAout(5)=1;
    PAout(6)=0;
    PAout(7)=0;
    PAout(3)=0;
    PAout(4)=0;
}
void LED_8(void)
{
    PAout(1)=1;
    PAout(0)=1;
    PAout(5)=1;
    PAout(6)=1;
    PAout(7)=1;
    PAout(3)=1;
    PAout(4)=1;
}
void LED_9(void)
{
    PAout(1)=1;
    PAout(0)=1;
    PAout(5)=1;
    PAout(6)=1;
    PAout(7)=0;
    PAout(3)=1;
    PAout(4)=1;
}

3、text.c中主要进行按键的判断然后调用led.c中显示数字的代码,并打印在串口中,具体代码如下:

#include "sys.h"
#include "usart.h"		
#include "delay.h"	
#include "key.h" 
#include "led.h" 

int main(void)
{		 
	vu8 t;
	Stm32_Clock_Init(9); 	//系统时钟设置
	delay_init(72);	     	//延时初始化 
    uart_init(72,9600);     //初始化串口通信
    LED_Init();             //初始化端口
    printf("正常进入");
	while(1)
	{
		t=KEY_Scan();		//得到键值
        printf("t的值为:%d\n",t);
		switch(t)
		{				 
			case 1:
                printf("你按下了:1\r\n");//按键数值打印在串口
                LED_1();//显示对应数字
				break;
			case 2:
				printf("你按下了:2\r\n");
                LED_2();
				break;
            case 3:
				printf("你按下了:3\r\n");
                LED_3();
				break;
            case 4:
				printf("你按下了:4\r\n");
                LED_4();
				break;
            case 5:
				printf("你按下了:5\r\n");
                LED_5();
				break;
            case 6:
				printf("你按下了:6\r\n");
                LED_6();
				break;
            case 7:
				printf("你按下了:7\r\n");
                LED_7();
				break;
            case 8:
				printf("你按下了:8\r\n");
                LED_8();
				break;
            case 9:
				printf("你按下了:9\r\n");
                LED_9();
				break;
			default:
                printf("无按键按下\r\n");
				delay_ms(1000);	
                break;
		}
          
	}		 
}

4、对应的头文件中为各个函数的定义,具体代码如下:
key.h:

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"

u8 KEY_Scan(void);		//按键扫描函数

#endif

led.h:

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"
  
//LED端口定义
//#define LED_a PAout(1)
//#define LED_b PAout(0)
//#define LED_c PAout(5)
//#define LED_d PAout(6)
//#define LED_e PAout(7)
//#define LED_f PAout(3)
//#define LED_g PAout(4)

void LED_Init(void);	//初始化		 
void LED_1(void);
void LED_2(void);
void LED_3(void);
void LED_4(void);
void LED_5(void);
void LED_6(void);
void LED_7(void);
void LED_8(void);
void LED_9(void);				    
#endif

6、运行结果

1、串口运行结果
STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管
2、5161as数码管运行结果
STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管文章来源地址https://www.toymoban.com/news/detail-511134.html

到了这里,关于STM32F103基础(寄存器)——(1)3*3矩阵键盘控制5161as数码管的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 明解STM32—GPIO理论基础知识篇之寄存器原理​

    一、前言         在之前的STM32的GPIO理论基础知识中,分别对基本结构和工作模式进行了详细的介绍。GPIO基本结构中主要对GPIO内部的各个功能电路逐一的进行的分析;GPIO工作模式中主要介绍GPIO应用在不同的使用场景下,GPIO端口的静态特征配置和动态的工作模式,同时对

    2024年02月16日
    浏览(50)
  • 【明解STM32】中断系统理论基础知识篇之中断寄存器功能原理

    目录 一、前言 二、寄存器概述 三、NVIC寄存器组 四、SCB寄存器组 五、中断屏蔽寄存器组 六、总结         在之前的STM32的中断系统理论基础知识之基本原理及NVIC中,分别中断的基本原理,中断的管理机制和中断的处理流程进行了较为详细的论述,读者通过全篇的阅读了

    2024年02月16日
    浏览(48)
  • stm32的BRR寄存器和BSRR寄存器

    1、BRR---   bit   RESET(置0)  register   //高16位无,低16位置1为0,不能写1 2 、BSRR---   bit   SET(设置1或0)       register   //低16位设置1为0 BSRR:用于低16位的作用是让指定的IO口置1;而高16位的作用是让指定的IO口置0。  

    2024年02月11日
    浏览(48)
  • 矩阵键盘之门锁小项目(stm32f103zet6)

    今天,给大家分享的是自己弄着玩的一个矩阵键盘控制控制舵机模拟一个智能门锁的功能。 用到的硬件: 开发板我用的是原子哥的精英板(杀鸡用宰牛刀了)。 矩阵键盘(宝上十几块买的): 外加一个舵机和一个0.96的oled显示屏。 矩阵键盘: 有VCC,GND,SCL,SDO四条线,这个矩阵键

    2024年02月10日
    浏览(50)
  • STM32之寄存器

    在学习STM32之前有必要了解一下ARM架构,以下相关ARM架构的知识来自百度百科​:​ ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的

    2024年02月22日
    浏览(50)
  • 正点原子STM32F103精英版+HAL库实现4×4矩阵按键检测

    首先声明,本人小白一枚,所做的工作都是借鉴网上的大佬+自己摸索,但是都是亲测实际有效的。 因为所需要的功能开发板自带按键不够用,所以购买了4×4矩阵按键,当时购买的时候以为一个按键对应一个IO口,后来发现不是这样的,会浪费太多的IO口,4×4矩阵键盘用8个

    2024年02月06日
    浏览(59)
  • STM32F103系列 Proteus仿真 4*4矩阵键盘 串口+LCD1602显示

            最近一直在肝STM32系列芯片,这里我想要检验一下自己的初步学习成果,简单的运用一下IO口的配置,代码使用正点的库函数模板写的,仿真软件是Proteus 8.13,代码编写编译软件是Keil MDK5,仿真芯片是STM32F103R6小容量芯片。 目录 一、硬件设计  二、软件设计 1、L

    2024年02月03日
    浏览(46)
  • STM32寄存器点亮LED灯

     这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮 那么我们得让 打开控制GPIOB5的时钟 让GPIOB5 输出模式 让GPIOB5低电平 时钟就相当于一个阀门开关,或者理解成水龙头,你打开了 才有水出来,也就是你打开才能工作。 看中文参考手册 系统架构 找到你的GPIO

    2024年02月07日
    浏览(54)
  • STM32 入门 —— 寄存器与 GPIO

    STM32 总线构图: 什么是寄存器 根据百度百科介绍,寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。简单来说,寄存器就是存放东西的东西,存放的东西是指令、数据或地址 存放数据的寄存器最容易理解,不同

    2024年02月04日
    浏览(51)
  • 【正点原子STM32】STM32基础知识(F1F4F7H7 STM32系统框架、寻址范围、存储器映射的存储器功能划分、寄存器映射)

    一、STM32系统框架 1.1、Cortex M内核 芯片 1.2、F1系统架构 1.3、F4系统架构 1.4、F7系统架构 1.5、H7系统架构 二、STM32的寻址范围? 三、存储器映射 存储器功能划分(F1为例) STM32F1存储器映射图 四、寄存器映射 寄存器基础知识 STM32寄存器分类 寄存器映射(F1为例) 寄存器描述解

    2024年02月21日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包