我现在的任务是做一个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板回来再测量。
上一篇:基于 STM32F407 使用 4*4 矩阵键盘
下一篇:ARM开发(10)基于STM32的通用定时器中断控制蜂鸣器响
推荐阅读最新更新时间:2024-11-06 20:30
设计资源 培训 开发板 精华推荐
- simplefoc-dlxy
- NCP5007 紧凑型背光 LED 升压驱动器的典型应用
- 用于电池充电指示器的 NCP301LSN34T1 3.4V 电压检测器的典型应用
- PM8908 单片降压转换器的典型存储器终端应用
- LT1372CS8 5V 至 12V 升压转换器的典型应用
- STEVAL-ISA110V1,基于 VIPER26LN 的演示板,12 V/12 W 宽范围非隔离反激式
- LTC3425,具有有源钳位的锂离子/3.3V 至 5V 升压应用
- 用于 MCU 系统负载感应的 NCP301LSN45T1 4.5V 电压检测器的典型应用
- pcb测试
- MPC86XADS、MPC8xx 参考板,基于 MPC862DT MPU PowerQUICC MPC8xx 处理器
- ADI & WT ·世健 MCU 痛点问题探索季 ——第一站:征集 | 使用 MCU ,哪些问题最令你头大?
- 阅读罗彻斯特电子停产半导体器件解决方案,答题赢取京东卡啦!
- 看是德科技智慧汽车精彩专题参与问卷调查有好礼!
- 快乐分享,月月有奖第26期如期而至~~
- 有奖直播 | ST25 NFC新产品及应用方案介绍 报名中
- 下载有礼|终于找到秘籍,示波器探头的选择和使用就靠它了!
- 有奖直播|Keysight World 2020【电信基础设施、云与人工智能分论坛】
- 预约有礼:以光代电,硅光芯片了解一下~ 走进工程师网络学堂直播,赢好礼
- 【泰有聊】第三期:参与泰克揭秘探头行动,瓜分2019元新年红包
- 开发板芯币竞拍,每日一款!今日竞拍开发板:大黄蜂开发板