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

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;

如何解决导热油管腐蚀渗漏问题
运营商争抢5G先机 成本瓶颈待破
国家提供战略支持,集成电路国有化有望提升
全球5G频谱研究及启示
一名29岁的.NET老程序员的自白
stm32矩阵键盘原理图及程序介绍
受疫情影响,苹果汽车有可能推迟到2025年生产
盛扬半导体公司简介
灵感来自蚂蚁,瑞士研究团队研制出小型机器人
关于粉尘传感器的相关问题解答
分压器怎么认识
今天思特威推出超星光级大靶面8MP图像传感器SC880SL
整合高性能仪器和FPGA 实现最佳WLAN测量[图]
家电产品中最常用的六款传感器
粉末冶金工艺优缺点分析
维信诺获得荣耀颁发“精诚协作奖”
敲重点!!!雷达+蓝牙一体化模组 即插即用零代码 涂鸦平台 智能照明解决方案
交流伺服电机的构造与工作原理
Moto 360暴力拆解:秒杀Apple Watch?
三大标准鉴别真AI相机,别让花式宣传冲昏头 真AI相机效果对比一目了然