历史上的今天
返回首页

历史上的今天

今天是:2025年08月16日(星期六)

正在发生

2019年08月16日 | 基于stm32f103的矩阵键盘

2019-08-16 来源:eefocus

我现在的任务是做一个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板回来再测量。

推荐阅读

史海拾趣

广东爱晟电子(exsense)公司的发展小趣事

2020年新冠疫情期间,爱晟电子积极响应政府号召,全力支持抗疫工作。公司不仅向抗疫一线捐赠了防疫物资,还组织员工参与志愿服务。同时,公司还利用自身的技术优势,研发出适用于医疗设备的NTC热敏电阻,为抗击疫情提供了有力支持。这些行动彰显了爱晟电子的社会责任感和担当精神。

Anaren公司的发展小趣事

广东爱晟电子自成立以来,一直致力于NTC热敏电阻技术的研发和创新。在2010年代初,公司面临技术瓶颈,市场竞争激烈。然而,爱晟电子团队不畏艰难,通过深入研究,成功研发出具有更高精度和稳定性的NTC热敏电阻。这一技术突破迅速获得了市场的认可,公司销售额逐年攀升,奠定了在电子行业的领先地位。

Daewoo公司的发展小趣事

除了汽车产业外,Daewoo公司在家电领域也取得了不俗的成绩。随着消费者对家电品质要求的不断提高,Daewoo公司不断推出高品质、高性能的家电产品,赢得了消费者的信赖和好评。同时,公司还积极拓展国际市场,将产品出口到世界各地,进一步提升了品牌知名度和影响力。

这些故事共同展现了Daewoo公司在电子行业中的发展历程和取得的成就。虽然公司经历了许多挑战和困难,但凭借其坚定的信念和不懈的努力,最终实现了多元化发展,成为了韩国乃至全球电子行业的佼佼者。

Antenova公司的发展小趣事

随着业务的快速发展,Antenova公司积极拓展全球市场。公司在全球范围内设立了多个研发中心和销售网络,以便更好地服务客户并拓展市场份额。通过与全球知名企业的合作,Antenova的产品得到了广泛应用,进一步提升了公司的品牌影响力和市场竞争力。

Directed Energy Inc公司的发展小趣事

在电子行业中,创新是企业持续发展的关键。Directed Energy Inc始终将创新作为企业的核心竞争力之一,不断投入研发资源,推动技术创新和产品升级。公司拥有一支高素质的研发团队,他们紧跟行业发展趋势,不断探索新的技术和应用,为公司的发展注入了源源不断的动力。这种持续的创新精神使得Directed Energy Inc在电子行业中始终保持领先地位。

Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

在半导体行业,产品质量是企业生存和发展的关键。Excelics Semiconductor始终将品质管理放在首位,建立了严格的质量控制体系。他们通过引进先进的生产设备和技术,确保每一片芯片都符合高标准的质量要求。这种对品质的执着追求赢得了客户的信任和市场的认可。

问答坊 | AI 解惑

[下载]美国MSP430电子书(英文)

希望大家喜欢哈! 这本书的作者是个公共遥测工程师 大学用51,工作了用PIC,之后一个项目要求低功耗,所以又用了430。 …

查看全部问答>

在台式数字电子秤的课程设计中 可以用哪些类型的信号放大器?

对于数字电子秤的设计可以用哪些类型的放大器  哪一种的放大器效果更好??请高人指点!  …

查看全部问答>

关于BIB文件中RAMIMAGE类型的问题

MSDN中在关于BIB文件的MEMORY Section部分中提到RAMIMAGE类型时说: Specifies that the region should be treated like RAM. The memory addresses in this entry can physically correspond to RAM or to linear flash memory. 原文见: http ...…

查看全部问答>

Ubuntu下的一些小问题

1. 帮忙说明下linux(ubuntu)中,configure的参数问题,--prefix=/路径 和--exec-prefix=/路径,还有with-xxx-prefix=/路径 又什么区别吗 2. 说能解释下\"sed\",\"set\",\"eval\",\"tee\" and \"getopt\" in shell,推好能推荐个教程,找了半天没什 ...…

查看全部问答>

[DIY]再造二十四小时的感动【古典版II】 自制QS18-12辉光电子钟 附百图

        前几天刚刚完成QS30-1管的辉光钟,有不少朋友在向我讨教如何制作。说实话,就个人而言,我更喜欢QS18-12辉光管。         QS30-1的辉光管制作贴在这里:https://bb ...…

查看全部问答>

【光耦技术资料汇总】

声明:展现在你眼前的所有文档都非本人的智慧所编写,而只是转发,但所有文档也都非具有相同层次的专业人士所作,你需要的是学习与思考,融合与创新。你的灵感,将来自於你的头脑,你的知识,确来自于其他人的智慧。包容糟粕,取其精华,你必能智於 ...…

查看全部问答>

电池供电单片机如何提高程序的可靠运行?

系统是一个手持设备,用电池供电,电量低时,通过外部充电器充电。 平时不使用时,进入休眠状态,通过按键(有三个不同功能的按键)唤醒(IO口电平变化中断)结束休眠。 如何才能保证系统能可靠的运行? 就是每次在休眠中,按键按下都能够唤醒, ...…

查看全部问答>

编写字符设备驱动框架的步骤(简要)

        作者:武汉华嵌嵌入式培训  长沙中心        讲师: 周龙         Step 1:  申请设备号(主要是申请主设备号)         ...…

查看全部问答>

TIVA C Launchpad 是否可以外接其他电源?

具体就是想问一下 : 当我用PC下载完程序后, 要让TIVA C Launchpad  单独运行,没法再提供USB接口; TIVA C Launchpad有没有简单的供电方法。…

查看全部问答>