0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

stm32矩阵键盘原理图及程序介绍

jf_f8pIz0xS 来源:电子发烧友整理 2018-02-09 11:30 次阅读

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

stm32矩阵键盘原理图

stm32矩阵键盘原理图及程序介绍

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;

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354689
  • 矩阵键盘
    +关注

    关注

    7

    文章

    206

    浏览量

    31431
收藏 人收藏

    评论

    相关推荐

    求助:4*4矩阵键盘原理图

    各位大侠,小弟初学,求一个4*4矩阵键盘原理图,不胜感激小弟邮箱:619018859@qq.com
    发表于 07-30 14:45

    什么是矩阵键盘

    矩形键盘介绍什么是矩阵键盘矩阵键盘的原理驱动电路
    发表于 01-07 07:43

    矩阵键盘和独立键盘的原理介绍

    学到矩阵键盘这一块对网上别人写的C代码有些疑问,希望有能看到的大牛帮助解答。矩阵键盘和独立键盘原理图
    发表于 01-13 08:10

    矩阵键盘扫描程序

    矩阵键盘扫描程序 按键扫描(线反转)//-------------------------------- ------------------------------------------------------------
    发表于 01-11 19:11 7751次阅读

    4x4矩阵键盘程序原理图PCB

    4x4矩阵键盘程序原理图PCB,供大家下载。
    发表于 12-21 18:25 0次下载

    矩阵键盘(电子+程序

    这是基于AT89C芯片的矩阵键盘,是一个计较简单使用的小程序,请大家指教
    发表于 06-03 15:31 30次下载

    4X4矩阵键盘原理图

    键盘矩阵原理图
    发表于 02-28 22:35 0次下载

    两个4×4键盘矩阵控制条形LED显示的电路原理图免费下载

    本文档的主要内容详细介绍的是两个4×4键盘矩阵控制条形LED显示的电路原理图免费下载。
    发表于 12-25 16:52 30次下载
    两个4×4<b class='flag-5'>键盘</b><b class='flag-5'>矩阵</b>控制条形LED显示的电路<b class='flag-5'>原理图</b>免费下载

    数码管显示4X4键盘矩阵按键的仿真原理图免费下载

    本文档的主要内容详细介绍的是数码管显示4X4键盘矩阵按键的仿真原理图免费下载。
    发表于 12-31 10:04 48次下载
    数码管显示4X4<b class='flag-5'>键盘</b><b class='flag-5'>矩阵</b>按键的仿真<b class='flag-5'>原理图</b>免费下载

    基于1602加矩阵键盘的简易计算机原理图及源码

    基于1602加矩阵键盘的简易计算机原理图及源码
    发表于 04-29 09:57 4次下载
    基于1602加<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>的简易计算机<b class='flag-5'>原理图</b>及源码

    STM32操作矩阵键盘的两种方法——扫描和中断

    目录STM32操作矩阵键盘的两种方法——扫描和中断一、矩阵键盘的结构和原理二、扫描式矩阵
    发表于 11-26 13:36 36次下载
    <b class='flag-5'>STM32</b>操作<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>的两种方法——扫描和中断

    STM32f103c8t6矩阵键盘程序(串口通信)资料汇总

    STM32f103c8t6矩阵键盘程序(串口通信)资料汇总
    发表于 12-08 17:44 89次下载

    STM32矩阵键盘扫描及处理

    STM32矩阵键盘扫描及处理前言由于最近帮做一个毕业设计需要用到直接输入目标值去控制输出,所以才写这么一个按键处理的程序。对于一个才接触单片机没多久的大学生菜鸟来说,实现毕设里的每一
    发表于 12-27 18:26 39次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>扫描及处理

    51单片机矩阵键盘原理图

    51单片机矩阵键盘原理图
    发表于 12-30 11:32 66次下载

    stm32矩阵键盘程序

    电子发烧友网站提供《stm32矩阵键盘程序.zip》资料免费下载
    发表于 10-07 15:07 15次下载
    <b class='flag-5'>stm32</b><b class='flag-5'>矩阵</b><b class='flag-5'>键盘</b>的<b class='flag-5'>程序</b>