精华内容
下载资源
问答
  • stm32矩阵键盘
    2022-06-24 16:22:45

    本次博客主要讲解基于STM32矩阵键盘的实现原理

    矩阵键盘是通过对应的行列引脚状态来实现的,可以类似成数学上的直角坐标系,通过X,Y轴确定一个点,而我们的矩阵键盘则是通过行列不同的引脚状态来实现判断哪一个引脚被按下。以下是我们矩阵键盘的原理图。

    由原理图可知,我们只需要在初始化时赋予行列引脚不同的引脚状态,在按键按下时,对应的行列引脚状态会变为相同状态,此时,我们便可以确定是哪一个引脚被按下。要注意的是,使用按键进行操作时,一定要对按键进行消抖处理,防止单片机进行误判。

    实验效果如图所示:

     

    系统部分代码

    int main()
    {
        LED_GPIO_Config();
        USART_Mode_Config();
        KEY_GPIO_Config();
        while(1)
        {
            i=Key_Scan_Mode();
            if(i==88)
            {
                printf("您未按下按键:\r\n");
            }
            else
            {
                printf("您按下的按键键值为:%d\r\n",i);
                
            }
            delay(400);
        }
    }
     

     

    更多相关内容
  • 简单的基于stm32的4*4矩阵键盘设计。
  • stm32f103开发板。 消抖。 col列,Pin配置为PP推挽输出模式; row行,Pin配置为Input模式,启用内部上拉电阻
  • STM32 矩阵键盘 程序 可以实现任意不连续引脚配置的完美设置 并且显示 显示采用JLX12864G-086-PC 引脚任意配置 完美显示
  • STM32矩阵键盘代码

    2016-12-16 08:43:17
    该程序是STM32F103系列的矩阵键盘代码,本人使用过
  • STM32矩阵键盘测试代码以及完整工程 使用的是正点原子的精英版测试的,可通过串口发送所按下的按键的键值 工程完整,注释清楚,可以直接使用 方便移植 此次的实验GPIO口链接图: C4------------>PC0 C3-...
  • stm32矩阵键盘按键扫描程序亲测可用,PA0~PA7为矩阵键盘接口,PA9PA10为串口
  • stm32矩阵键盘

    2013-08-29 17:35:09
    stm32矩阵键盘,扫描模式,自己写的,很简洁
  • 使用中断方式i实现在STM32F103上的矩阵键盘。修改端口所有的需要修改的地方已用宏定义列出。方便修改
  • STM32矩阵键盘,动态数码管显示,支持连按
  • stm 32f103zet6的矩阵键盘源带吗
  • STM32矩阵键盘实现

    2015-06-25 00:23:07
    基于STM32矩阵键盘实现,可用于开发板外置键盘的使用
  • STM32矩阵键盘设值

    2015-08-08 17:05:35
    按键设值程序。按下15键进入设定,14键确定并退出。 10键为小数点。
  • 矩阵键盘 stm32 可以使用 4*4矩阵键盘驱动
  • stm32f103系列单片机的矩阵键盘控制程序
  • stm32f10x mdk 利用定时器方式采用反转扫描法的4*4矩阵键盘程序
  • STM32F103矩阵键盘实验,按下那个键,串口输入显示,双去抖
  • 基于STM32的_矩阵键盘_驱动(中断方式)
  • STM32矩阵键盘的实现

    2018-06-24 11:04:45
    STM32中断的方式实现矩阵按键。使用外部中断5_9,外部中断接口接PC8~PC5。
  • 因为最近开发一个项目需要用到3*4的矩阵键盘,所以我就写了一下相关的矩阵键盘的内容,分享出来供大家参考。 特别感谢:Yeah__binbin 我所用到的矩阵键盘是3*4的矩阵键盘实物图如下 其中是4行3列,示意图如下 ...

    因为最近开发一个项目需要用到3*4的矩阵键盘,所以我就写了一下相关的矩阵键盘的内容,分享出来供大家参考。

    特别感谢:Yeah__binbin

    我所用到的矩阵键盘是3*4的矩阵键盘实物图如下

    其中是4行3列,示意图如下

    采用循环扫描的方式主要是应用while循环来进行,优点是可以进行快速反应,缺点是占用较多的机时,CPU卡在这个循环里出不来。

    具体的思想就是通过变换GPIO的引脚电平来读取具体是哪个按键被按下。

    首先是将行中连接的引脚设置为上拉输入模式,将列中引脚设置为推挽输出模式,并将列的引脚都定义为低电平。

    如果有按键按下,行输入就会得到低电平信号,就可以确定是哪一行的按键被按下。当测出哪一行的按键被按下后,再反过来,将行的引脚都设置为推挽输出模式,定义为高电平;将列的引脚都设置为下拉输入模式。

    这样再通过列的扫描,如果列得到高电平,就可以确定是哪一列的按键被按下。通过两次循环扫描可以定位到具体是哪个按键按下,返回键值后就可以进行后续操作。

    效果图

    按下#号键

    按下7

    按下8

    代码的大致思想如下

    源码连接:stm32矩阵键盘(扫描)-嵌入式文档类资源-CSDN下载stm32矩阵键盘,用循环扫描的方式来进行识别键值,并在oled屏幕上显示,下载资源中有连接图和视频更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/nbbskk/85379893 

     

     

     

     

     

    展开全文
  • 基于STM32的4*4矩阵键盘驱动程序,环境keil5
  • stm32矩阵键盘原理图及程序介绍

    千次阅读 2021-05-24 04:27:02
    STM32F0 系列产品基于超低功耗的 ARM Cortex-M0 处理器内核,整合增强的技术和功能,瞄准超低...本文为大家介绍stm32矩阵键盘原理图及程序stm32矩阵键盘原理图stm32矩阵键盘程序介绍主要实现:扫描矩阵键盘,将检...

    STM32F0 系列产品基于超低功耗的 ARM Cortex-M0 处理器内核,整合增强的技术和功能,瞄准超低成本预算的应用。该系列微控制器缩短了采用 8 位和 16 位微控制器的设备与采用 32 位微控制器的设备之间的性能差距,能够在经济型用户终端产品上实现先进且复杂的功能。本文为大家介绍stm32矩阵键盘原理图及程序

    stm32矩阵键盘原理图

    bb34f009cad5d05c4a1ebdaf8fbd5791.png

    7cf975b999b8fbc92ac52a8e36e753cc.png

    77c2c1a14069551bfc4bb8f401a6e81c.png

    stm32矩阵键盘程序介绍

    主要实现:扫描矩阵键盘,将检测到的数据通过spi 通信发送到数码管显示。

    主要步骤:

    1:初始化时钟

    void RCC_Configuration(void)

    {

    //----------使用外部RC晶振-----------

    RCC_DeInit(); //初始化为缺省值

    RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟

    while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer

    FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state

    RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK

    RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK

    RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ

    RCC_PLLCmd(ENABLE); //Enable PLLCLK

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock

    while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source

    }

    2:配置管脚

    void GPIO_Configuration(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    SPI_InitTypeDef SPI_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//开启GPIOD外设时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//D0~D3

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//D4~D7

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    //初始化管脚电平

    GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3);

    GPIO_ResetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_SPI1, ENABLE); //开启SPI1和GPIOA外设时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//设置SPI的四个引脚模式

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //设置GPIO A1管脚 用于锁存74HC595输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI数据模式 双线双向全双工

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //SPI工作模式 主模式

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI数据大小

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //设置时钟的极性

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //设置时钟的相位

    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; //NSS脚硬件置位

    SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_64;//预分频值

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;// 数据从高位传输

    SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值

    SPI_I2S_DeInit(SPI1); //将外设SPI1寄存器重设为缺省值;

    SPI_Init(SPI1, &SPI_InitStructure);

    SPI_Cmd(SPI1, ENABLE);//使能SPI1外设

    }

    3:编写矩阵键盘扫描函数KEY.c

    u8 shu=16;

    void KeyScan(void)

    {

    u8 i;

    if((GPIO_ReadInputData(GPIOD) & 0x0f) != 0x0f )

    {

    Delay_MS(20);

    if((GPIO_ReadInputData(GPIOD) & 0x0f) != 0x0f )

    {

    GPIO_SetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6);

    GPIO_ResetBits(GPIOD, GPIO_Pin_7);

    switch(GPIO_ReadInputData(GPIOD) & 0x0f)

    {

    case 0x07: shu=0; break;

    case 0x0b: shu=1; break;

    case 0x0d: shu=2; break;

    case 0x0e: shu=3; break;

    }

    GPIO_SetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7);

    GPIO_ResetBits(GPIOD, GPIO_Pin_6);

    switch(GPIO_ReadInputData(GPIOD) & 0x0f)

    {

    case 0x07: shu=4; break;

    case 0x0b: shu=5; break;

    case 0x0d: shu=6; break;

    case 0x0e: shu=7; break;

    }

    GPIO_SetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_6| GPIO_Pin_7);

    GPIO_ResetBits(GPIOD, GPIO_Pin_5);

    switch(GPIO_ReadInputData(GPIOD) & 0x0f)

    {

    case 0x07: shu=8; break;

    case 0x0b: shu=9; break;

    case 0x0d: shu=10; break;

    case 0x0e: shu=11; break;

    }

    GPIO_SetBits(GPIOD, GPIO_Pin_7 | GPIO_Pin_5| GPIO_Pin_6);

    GPIO_ResetBits(GPIOD, GPIO_Pin_4);

    switch(GPIO_ReadInputData(GPIOD) & 0x0f)

    {

    case 0x07: shu=12; break;

    case 0x0b: shu=13; break;

    case 0x0d: shu=14; break;

    case 0x0e: shu=15; break;

    }

    GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3);

    GPIO_ResetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7);

    while((i《50)&&((GPIO_ReadInputData(GPIOD) & 0x0f) != 0x0f))

    {

    i++;

    Delay_MS(10);

    }

    }

    }

    }

    4: SPI传送数据函数

    void Display_Data(u8 data)

    {

    u8 i=data;

    PAOut(1)=0;

    SPI_I2S_SendData(SPI1,DSY_CODE[i]);

    Delay_MS(2);

    PAOut(1)=1;

    Delay_MS(1000);

    }

    5:主函数

    #include“stm32f10x_lib.h”

    #include

    #include“Exboard.h”

    u8 DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

    int main(void)

    { //u8 i;

    RCC_Configuration();

    GPIO_Configuration();

    //EXTI_Configuration();

    //NVIC_Configuration();

    while(1)

    {

    KeyScan();

    Display_Data(shu);

    }

    }

    附录:Exboard.h

    #ifndef _EXBOARD_H

    #define _EXBOARD_H

    #endif

    #include“stm32f10x_lib.h”

    #define GPIOA_IDR (GPIOA_BASE+0x08)

    #define GPIOA_ODR (GPIOA_BASE+0x0c)

    #define GPIOB_IDR (GPIOB_BASE+0x08)

    #define GPIOB_ODR (GPIOB_BASE+0x0c)

    #define GPIOC_IDR (GPIOC_BASE+0x08)

    #define GPIOC_ODR (GPIOC_BASE+0x0c)

    #define GPIOD_IDR (GPIOD_BASE+0x08)

    #define GPIOD_ODR (GPIOD_BASE+0x0c)

    #define GPIOE_IDR (GPIOE_BASE+0x08)

    #define GPIOE_ODR (GPIOE_BASE+0x0c)

    #define GPIOF_IDR (GPIOF_BASE+0x08)

    #define GPIOF_ODR (GPIOF_BASE+0x0c)

    #define GPIOG_IDR (GPIOG_BASE+0x08)

    #define GPIOG_ODR (GPIOG_BASE+0x0c)

    #define BitBang(Addr,BitNum) *((volatile unsigned long*)(((Addr&0xf0000000)+ 0x2000000)+(((Addr&0xfffff)《《5)+(BitNum《《2))))

    #define PAIn(n) BitBang(GPIOA_IDR,n)

    #define PAOut(n) BitBang(GPIOA_ODR,n)

    #define PBIn(n) BitBang(GPIOB_IDR,n)

    #define PBOut(n) BitBang(GPIOB_ODR,n)

    #define PCIn(n) BitBang(GPIOC_IDR,n)

    #define PCOut(n) BitBang(GPIOC_ODR,n)

    #define PDIn(n) BitBang(GPIOD_IDR,n)

    #define PDOut(n) BitBang(GPIOD_ODR,n)

    #define PEIn(n) BitBang(GPIOE_IDR,n)

    #define PEOut(n) BitBang(GPIOE_ODR,n)

    #define PFIn(n) BitBang(GPIOF_IDR,n)

    #define PFOut(n) BitBang(GPIOF_ODR,n)

    #define PGIn(n) BitBang(GPIOG_IDR,n)

    #define PGOut(n) BitBang(GPIOG_ODR,n)

    #define KEY1 PEIn(0)

    #define LED1 PDOut(13)

    #define KEY2 PCIn(13)

    #define LED2 PGOut(14)

    void Delay_MS(u16 dly);

    /

    void RCC_Configuration(void);

    void GPIO_Configuration(void);

    //void EXTI_Configuration(void);

    //void NVIC_Configuration(void);

    extern void KeyScan(void);

    void Display_Data(u8 data);

    extern u8 shu;

    展开全文
  • STM32矩阵键盘

    2018-04-02 23:44:48
    基于STM32的精简版矩阵键盘,通俗易懂,实用性非常好!
  • 在搞定矩阵键盘的扫描模式以后,我就开始想用中断的方式来搞定矩阵键盘,通过中断的方式来搞定矩阵键盘非常方便,也不会占用太多的机时,扫描模式的文章在我另一个博客中,可以根据个人情况来选择合适的方式。...

    在搞定矩阵键盘的扫描模式以后,我就开始想用中断的方式来搞定矩阵键盘,通过中断的方式来搞定矩阵键盘非常方便,也不会占用太多的机时,扫描模式的文章在我另一个博客中,可以根据个人情况来选择合适的方式。

    我选择的是3*4的矩阵键盘,具体的实物图如下所示

    矩阵键盘是4行3列示意图如图所示

    采用中断方式来进行检测按键具体的思想就是通过按键先来触发中断,如果中断被触发再来进行行或者列的扫描来确定是哪个具体的按键被按下,这样可以节省CPU的机时,也可以更有效率。

    我的代码就是采用这种方法。首先是将行的引脚都设置为上拉输入模式,并开启这些引脚的中断,将列的三个引脚设置为推挽输出模式,并将引脚拉低为低电平,这样如果有按键按下,就会触发四个行引脚的中断,来判断具体是哪一行被按下。

    其次,如果检测到是哪一行后,就立即进入列扫描模式,将四个行引脚设置为推挽输出模式,并将引脚拉高设置为高电平,将三个列引脚设置为下拉输入模式,这样通过列扫描就可以进行确定到哪个键盘按下。

    具体实现如下图所示

    按下按键4

    按下按键9

    具体编程思路如下

    源码在下面的连接,需要的朋友可以下载

    stm32矩阵键盘(中断)-嵌入式文档类资源-CSDN下载stm32实现矩阵键盘的识别,通过中断方式来进行识别,并在OLED显示屏上显示出来,下载资源中有程序更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/nbbskk/85379960

     

     

     

    展开全文
  • stm32矩阵键盘,用循环扫描的方式来进行识别键值,并在oled屏幕上显示,下载资源中有连接图和视频演示。
  • 一个基于stm32f103zet6的矩阵键盘程序,stm32接上矩阵键盘即可使用。
  • stm32实现矩阵键盘的识别,通过中断方式来进行识别,并在OLED显示屏上显示出来,下载资源中有程序的源码、演示视频和接线图等内容。
  • STM32 4×4 矩阵键盘 扫描方式 矩阵键盘 扫描方式 矩阵键盘 扫描方式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,209
精华内容 483
关键字:

stm32矩阵键盘