基于stm32f103的矩阵键盘

发布者:BlissfulCharm最新更新时间:2019-08-16 来源: eefocus关键字:stm32f103  矩阵键盘  下拉输入 手机看文章 扫描二维码
随时随地手机看文章

我现在的任务是做一个8*8的矩阵键盘,制PCB版之前,我用电路板搭了一个3*3的矩阵键盘来模拟一下,设置PA0、PA1、PA2为PP输出,设置P3、P4、P5下拉输入。大多数的芯片内部上拉或下拉电阻都是弱上拉或弱下拉,stm32f103的内部也一样,内部上拉或下拉的电阻阻值约为40K,这样可以方便外部调整,但是,在作为一些通讯引脚时,可能会出现上电时数据不稳定的问题,如I2C通讯,解决的办法是在外部在加上一个较强的上拉或下拉即可。具体程序如下:



#include

#include "usart.h"



void KeyBoard_Init(void)//按键初始化

{

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;

GPIO_Init(GPIOA,&GPIO_InitStruct);

GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);

GPIO_ResetBits(GPIOA,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

}

void Delay(u32 nCount)//延时函数

{

for(; nCount != 0; nCount--);

}



u8 KeyDown(void)

{

if((GPIO_ReadInputData(GPIOA)&0xff)!=0x07)//判断是否有键按下

return 1;//keydown

}

else return 0; 

}



u8 Read_KeyValue(void)   

{

unsigned int  KeyValue=0;


GPIO_SetBits(GPIOA,GPIO_Pin_0);

GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);//此时PA0读取的数据是0x01

switch(GPIO_ReadInputData(GPIOA)&0xff)

{

case 0x11:KeyValue='A';break;//此时PA口去的数据是0x11,其余读数与此原理相同

case 0x21:KeyValue='B';break;

case 0x41:KeyValue='C';break;

default: break;

}

GPIO_SetBits(GPIOA,GPIO_Pin_1);

GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2);

switch(GPIO_ReadInputData(GPIOA)&0xff)

{

case 0x12:KeyValue='D';break;

case 0x22:KeyValue='E';break;

case 0x42:KeyValue='F';break;

default: break;

}

GPIO_SetBits(GPIOA,GPIO_Pin_2);

GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);

switch(GPIO_ReadInputData(GPIOA)&0xff)

{

case 0x14:KeyValue='G';break;

case 0x24:KeyValue='H';break;

case 0x44:KeyValue='I';break;

default: break;

}

GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);

GPIO_ResetBits(GPIOA,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

while((GPIO_ReadInputData(GPIOA)&0xff)!=0x07);

printf("%c",KeyValue);

return KeyValue;

}




int ScanKeyBoard(void)

{

if(KeyDown()

{

Delay(0xffff);//软件去抖。按键抖动时间一般为5-10ms,延时以20ms为宜


if(KeyDown())

{


return Read_KeyValue();//按键扫描

}

else 

{

printf("nothing");


}

return 0;

}



int main(void)

{

u32 i=100;

SystemInit();

usart_Configuration(); 

KeyBoard_Init();

Delay(i);

  while(1)

{

ScanKeyBoard();

    Delay(500);

}

}


用串口观察实验结果还可以,但个别时候会同时打印出按键字母和“nothing”,我感觉可能是焊接的问题,元器件接触不良很有可能造成这种结果,具体等PCB板回来再测量。

关键字:stm32f103  矩阵键盘  下拉输入 引用地址:基于stm32f103的矩阵键盘

上一篇:基于 STM32F407 使用 4*4 矩阵键盘
下一篇:ARM开发(10)基于STM32的通用定时器中断控制蜂鸣器响

推荐阅读最新更新时间:2024-11-06 20:30

基于stm32f103zet6的DS1302学习
由于硬件出了问题,也就是外部低速晶振没用,震不起来,然后查看了网上的帖子,STM32的RTC果然口碑不怎么样,所以果断换DS1302,在移植的过程中还算顺利,记录下来吧,也算对自己的总结吧! 1、所谓的DS1302 这里面也指明了简单的SPI协议 然后就直接上代码了,注释很详细的!基本实现单行注释 1、主函数main #include stm32f10x.h #include SysTick.h #include Delay.h #include Usart.h #include stdio.h #include DS1302.h /*******由于没有做外设测试的程序是:按键P
[单片机]
基于<font color='red'>stm32f103</font>zet6的DS1302学习
STM32F103控制舵机
//TIM4 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM4_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器3时钟 RCC_APB2PeriphClockCmd(RCC_APB
[单片机]
基于STM32F103ZET6的UART通讯实现
一、什么是IAP,为什么要IAP IAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给用户一个代码文件即可。 而IAP却能很好的解决掉这个难题,一片STM32芯片的Code(代码)区内一般只有一个用户程序。而IAP方案则是将代码区划分为两部分,两部分区
[单片机]
基于<font color='red'>STM32F103</font>ZET6的UART通讯实现
单片机矩阵键盘的使用之读取键盘
矩阵键盘的使用在单品机的学习当中十分广泛,可是对于许多新手,包括本人有时也是搞不明白,昨天晚上和今天早上的思考和同行们的讨论,终于有了点头绪,所以想记录下读取键盘的思路。 下面就以按下S16键来讲解其思路: 首先: P3的高位P3.4~P3.7输出为0,低位P3.0~P3.3输出为1;即P3=0x0F,当按下S16键后(有消抖动过程),P3.3的值为0,则P3的值更新为0x07; 其次: P3的高位P3.4~P3.7输出为1,低位P3.0~P3.3输出为0;即P3=0xF0,当按下S16键后(有消抖动过程),P3.4的值为0,则P3的值更新为0xE0; 最后将两个值相加得P3=0xE7; 在keyscan()函数(假设我们的
[单片机]
51单片机STC89C52 矩阵键盘数码管显示
WELA BIT P2.7 DULA BIT P2.6 DIOLA BIT P2.5 FM BIT P2.3 ORG 0000H SETB DIOLA MOV SP,#0E0H LOOP0: LCALL key_Scan JZ LOOP0 LCALL DELAY20MS LCALL key_Scan JZ LOOP0 MOV P1,A LCALL Smg HERE0: LCALL key_Scan ;等待按键释放 JZ LOOP0 LCALL DELAY20MS SJMP HERE0 key_Scan: SETB RS1 MOV P3,#0FH ORL P3,#0FH MOV
[单片机]
STM32F103学习笔记(一):简单的按键程序
通过几个按键,来控制LED灯的开关状态。没有涉及到中断,只是简单的按键程序 程序包括key.c,key.h;led.c,led.h;以及main函数 一、LED程序 led.h #ifndef __LED__H #define __LED__H #include stm32f10x.h #include sys.h #define LED1 PBout(8)// PB8 #define LED2 PBout(9)// PB9 void LED_Init(void); #endif led.c #include stm32f10x.h #include led.h void LED_Init
[单片机]
STM32F103之DMA实验,内存通过DMA向串口1发送数据
#include dma.h ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// DMA_InitTypeDef DMA_InitStructure; u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度 //DMA1的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从存储器- 外设模式
[单片机]
STM32F103C8T6 IAP程序
项目需要加入IAP功能,STM32F103与Nordic 51822一样也是 Cortex M的核心,只不过一个M0一个M3而已。所以我想其升级原理也大致是将Flash划分成不同的空间,一部分用来存放BootLoader,以实现升级,一部分用来存放用户应用程序。 百度了STM32 IAP,跳出来一大堆文章和代码,多数写得比较混乱,能把原理描述清楚,写得比较有条理只有战舰的文章了。连接: http://www.openedv.com/posts/list/11494.htm 看完之后,原理大概都明白了。 只不过战舰的例程是 STM32F407的,而且其Bootloader部分程序比较大,需要删除很多代码,改起来比较耗
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved