描述

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

stm32矩阵键盘原理图

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;

打开APP精彩内容

点击阅读全文

LINUX矩阵键盘简单介绍,stm32矩阵键盘原理图及程序介绍相关推荐

  1. stm32实现心电监测-原理图单片机程序C#上位机程序

    十年前接触生物电子让我对电子产生浓厚的兴趣,让我感到电子科技的博大精深无所不能.最近用stm32和C#实现心电监测,分享给大家一起探讨,我也把这些技术资料整理下. 原理图 心电前端采集电路采用仪表放大 ...

  2. STM32 矩阵键盘通过串口输出

    STM32F103C8T6 4*4矩阵键盘 通过串口输出,可以用来写密码锁 程序的思路如下: 1.首先需要配置的是矩阵键盘:配置两个函数:  KEY44_Init(矩阵键盘初始化)和key44_Sca ...

  3. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了. 在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简 ...

  4. 【Proteus仿真】Arduino UNO +74C922键盘解码驱动4X4矩阵键盘

    [Proteus仿真]Arduino UNO +74C922键盘解码驱动4X4矩阵键盘 Proteus仿真 本例因为使用了74C922解码芯片,使得程序代码非常简单,在按下不同按键时,数码管将显示对应 ...

  5. 学习笔记之51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘)

    这篇博文主要记录51单片机键盘篇(非编码键盘与编码键盘.非编码键盘的扫描方式.独立键盘.矩阵键盘.键盘消抖等)包含原理图.代码等 (一)基础补充 1.键盘的任务 2.键盘的识别 3.如何消除按键的抖动 ...

  6. mac linux 蓝牙键盘,还在纠结Mac版键盘?试试KeyRemap4MacBook吧!

    本帖最后由 亦草亦木 于 2013-2-18 02:03 编辑 有时候能在外设区看到坛子里的朋友发帖求适合Mac的键盘,其实键盘这个东西Mac上和PC上真的没有太大的区别,只不过是键盘映射不同,还有就 ...

  7. linux 软键盘输入密码,Linux_Linux系统中使用屏幕键盘的方法,屏幕键盘可以作为实体键盘输 - phpStudy...

    Linux系统中使用屏幕键盘的方法 屏幕键盘可以作为实体键盘输入的替代方案.在某些时候,屏幕键盘显得非常需要. 比如, 你的键盘刚好坏了:你的机器太多,没有足够的键盘:你的机器没有多余的接口来连接键盘 ...

  8. 新版TCGA表达矩阵提取简单版

    很多人因为网络原因不能使用TCGAbiolinks这个神包下载TCGA的RNA-seq数据,只能通过浏览器访问GDC TCGA的官网进行下载,而下载后得到的是一个个文件夹,对于如何整理成一个表达矩阵也 ...

  9. python实现简单的求矩阵的逆

    简单记录一下,后续改进 python代码 #模26运算下,求矩阵的逆. #使用伴随矩阵求逆矩阵法. #整个精度保持在整数位(方便求模运算).import numpy as np #扩展欧几里得算法求最 ...

最新文章

  1. python与c语言数据交互,python与c语言交互应用实例
  2. linux 下mysql的管理,Linux下 MySQL安装和基本管理
  3. Go 语言编程 — Cobra 指令行工具
  4. android表视图,android – 列表视图与表格布局
  5. spring6:bean的生命始末方法
  6. 201.09.22 除虫药水(线性dp)
  7. 【嵌入式】Libmodbus源码分析(三)-modbus相关函数分析
  8. 【CTR模型】TensorFlow2.0 的 xDeepFM 实现与实战(附代码+数据)
  9. 公共子串 字符串哈希
  10. 画出微型计算机结构图,中级工792、画出计算机环形网络模式图.doc
  11. java基础第五篇封装与面向对象
  12. linux扩展磁盘空间命令_在Linux上监视磁盘空间– SQL Server DBA的有用命令
  13. Sql Server之旅——第二站 理解万恶的表扫描
  14. CentOS - thin web server for Ruby(centos下安装thin,运行rails)
  15. zookeeper leader选举过程
  16. Linux下数学(科学)软件简介(一)
  17. 解决python的OverflowError: int too large to convert to float
  18. Spring Cloud Eureka Server 源码解析(七)处理客户端增量下载请求、读写锁问题
  19. 计算机打印东西怎么横向打印机,打印机横向打印怎么设置,打印机不能横向打印...
  20. JavaIO操作——字节输出流【OutputStream】

热门文章

  1. win10录屏工具_win10录屏软件选哪款?没用过别后悔
  2. 另辟蹊径:从其他角度去解决数据库问题
  3. 静默错误:Oracle 数据库是如何应对和处理的 ?
  4. 详解CNN实现中文文本分类过程
  5. 六问六答理解ForkJoin原理
  6. 保障实时音视频服务体验,华为云原生媒体网络有7大秘籍
  7. 软件开发丨关于软件重构的灵魂四问
  8. Reactive(1) 从响应式编程到好莱坞
  9. 关于Python中的错误与异常,你是否了解的够仔细?
  10. 基于React-Native0.55.4的语音识别项目全栈方案