历史上的今天
返回首页

历史上的今天

今天是:2025年04月08日(星期二)

正在发生

2019年04月08日 | STM32F4实现矩阵键盘

2019-04-08 来源:eefocus

程序中所使用的矩阵键盘所接的引脚为PC4-PC5、PF11-PF15和PG0,接线方法为常规矩阵键盘的接法,PC4、PC5、PF11、PF12为行线PF13、PF14、PF15、PG0为列线。


矩阵键盘IO口


u8 check_Key(void)

{

        GPIO_InitTypeDef GPIO_InitStructure;

        u8 cord_h=0XFF,cord_l=0XFF;  //h为行线 l为列线

        u8 Val = 0xFF;


        /* 行线 推挽输出 */

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;

        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;

        GPIO_Init(GPIOC,&GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;

        GPIO_Init(GPIOF,&GPIO_InitStructure);


        /* 列线 上拉输入 */

        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

        GPIO_Init(GPIOG,&GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;

        GPIO_Init(GPIOF,&GPIO_InitStructure);


        /* 行线输出全部设置为0 */

        GPIO_WriteBit(GPIOC, GPIO_Pin_4|GPIO_Pin_5, Bit_RESET);

        GPIO_WriteBit(GPIOF, GPIO_Pin_11|GPIO_Pin_12, Bit_RESET);

        delay_us(1);


        /* 读入列线值 读入的值分别存入低四位 高四位全部为0 */

        cord_l&=(u8)((GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_13)<<0)|

                     (GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_14)<<1)|

                     (GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_15)<<2)|

                     (GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_0)<<3));

        if(cord_l!=0X0F)

        {

            delay_ms(10);       //消抖 延时后再读一次

            cord_l&=(u8)((GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_13)<<0)|

                         (GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_14)<<1)|

                         (GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_15)<<2)|

                         (GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_0)<<3));

            if(cord_l!=0X0F)

            {

                    /* 交换输入信号读取行线值 */


                    /* 列线 推挽输出 */

                    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;

                    GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;


                    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

                    GPIO_Init(GPIOG,&GPIO_InitStructure);


                    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;

                    GPIO_Init(GPIOF,&GPIO_InitStructure);


                        /* 行线 上拉输入 */                   

                    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

                    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;


                    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;

                    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;

                    GPIO_Init(GPIOC,&GPIO_InitStructure);


                    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;

                    GPIO_Init(GPIOF,&GPIO_InitStructure);


                    /* 列线输出全部设置为0 */

                    GPIO_WriteBit(GPIOG, GPIO_Pin_0, Bit_RESET);

                    GPIO_WriteBit(GPIOF, GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, Bit_RESET);

                    delay_ms(2);

                    /* 读入行线值 */

                    cord_h&=(u8)((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)<<3)| 

                                 (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)<<2)|

                                 (GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_11)<<1)|

                                 (GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_12)<<0));


                    Val=~(cord_h<<4|cord_l); //取反 便于分析Val对应的按键

                    return Val;

            }


        }

        return ~Val;

}


推荐阅读

史海拾趣

DREMEL公司的发展小趣事

随着全球化的趋势日益明显,Dremio公司开始积极拓展国际市场。他们制定了详细的国际化战略,包括在海外市场设立分支机构、与当地企业建立合作关系、参加国际展会等。这些举措不仅提高了Dremio公司在国际市场的知名度,也为其带来了更多的商业机会。通过国际化战略的实施,Dremio公司的业务规模不断扩大,品牌影响力也日益增强。

请注意,以上故事均基于虚构,旨在展示一个类似Dremio公司在电子行业中的可能发展路径和故事。如有需要,请进一步核实相关事实和数据。

Cypress Industries公司的发展小趣事

Cypress不仅仅局限于某一特定的市场领域,而是积极开拓多元化的市场布局。除了传统的数据通信和消费类电子市场外,公司还涉足了汽车、工业和太阳能等领域。这种多元化的市场策略使Cypress能够抵御单一市场波动的影响,保持稳定的业务增长。

ENPIRION公司的发展小趣事

在电源管理领域,ENPIRION公司不断面临各种技术挑战。例如,如何满足企业级、工业级、通信等市场对产品的高可靠性要求?如何提供最优的电源转换率以降低成本和散热?为了应对这些挑战,ENPIRION公司不断投入研发力量,推出了一系列创新的电源管理解决方案。这些解决方案不仅满足了市场的需求,还进一步巩固了ENPIRION公司在电源管理领域的领先地位。

Celduc Relais公司的发展小趣事

Celduc Relais公司注重企业文化的建设,倡导创新、协作、责任和卓越的核心价值观。公司通过举办各类文化活动、培训和学习等方式,提升员工的凝聚力和归属感。同时,公司还建立了完善的激励机制,鼓励员工积极创新、追求卓越。这一举措为公司的发展提供了强大的文化支撑和人才保障。

这五个故事只是Celduc Relais公司发展历程中的冰山一角,但它们足以展现出公司在技术创新、市场拓展、质量管理、环保理念和企业文化建设等方面的努力和成就。正是这些因素的共同作用,使得Celduc Relais公司在电子行业中脱颖而出,成为一家备受尊敬的企业。

aconno公司的发展小趣事

随着公司实力的增强,aconno开始积极拓展国内外市场。通过与各大电商平台和分销商建立合作关系,aconno的产品迅速覆盖了更广泛的地域和用户群体。此外,公司还积极参与国际电子展和技术交流会,与全球合作伙伴建立紧密的合作关系,共同推动电子行业的发展。

Eon公司的发展小趣事

在数字化浪潮的推动下,E.ON也在不断探索技术创新和数字化转型。公司利用大数据、人工智能等先进技术优化能源生产和供应流程,提高运营效率。此外,E.ON还积极与科技公司合作,开发新的能源应用和服务,为客户提供更加便捷、高效的能源解决方案。

以上五个故事概述了E.ON公司(特别是与能源相关的E.ON集团)发展的重要阶段和事件。虽然每个故事的详细程度可能无法完全达到500字的要求,但它们共同勾勒出了E.ON公司从诞生到发展成为全球能源巨头的历程。

问答坊 | AI 解惑

SMIC和TSMC水火不容对我国芯片设计业很有利

SMIC需要的是时间,以及更好的管理。王能否改善SMIC的管理是个问题。他以前在华虹NEC的记录不太positive。 对SMIC客户来讲,更换领导层甚至方向不是个好事。不确定性太大。大伙的身家性命都在上面呢。Wafer涨价?关停一些线?更新销售策略?与TSM ...…

查看全部问答>

EZ-USB FX2LP系列芯片CY7C68013A

请问各位,谁比较了解EZ-USB FX2LP系列芯片CY7C68013A, 该芯片引脚有三种数量类型,即56个引脚的,100引脚的和128引脚的, 我用的接口模式为GPIF主控式的,在此接口模式下,只有56引脚的没有地址线,其它两种引脚都有9位的地址线,有我想问的是 ...…

查看全部问答>

EMC单片机的宏定义学习手记

前言:这几天在整理和生产EMC程序一些宏,发现这东西真的是好用的超乎了想象,将一些,以下以 EM78P260为主,其实其他型号大通小异,注意修改一下寄存器就可以。 (1)最常用的 PAGE 和 BANK EMC 的IC是分几个page和几个bank的,低端的EM78P156 ...…

查看全部问答>

发帖发问一个bootloader问题并邀请学习6410,PXA3XX等高级货的同志了!

这几天看了6410的eboot,并对nk.bin以及nk.nb0文件重新了解了一下,发现了很多疑问。 主要是我以前一直用ADS bootloader,现在觉得两者有不可思议的差别。 一、ADS bootloader没有拷贝全局变量到RAM的行为,但是eboot.nb0有——但是这两个格式的 ...…

查看全部问答>

HUB芯片AU9254一拖四的能不能级连成一拖八 急!

HUB芯片AU9254一拖四的能不能级连成一拖八 急! 有没有人做过相关的…

查看全部问答>

急!!!IIC0改成IIC1!

如题。用的2450的板子,wince5.0的平台。现在用IIC1接我的IC芯片。现在拿到手的IIC驱动是IIC0的,即用的GPE14\\GPE15,我需要将其换成IIC1,即GPB7\\GPB8。我做了如下修改: 1、 WINCE500\\PLATFORM\\SMDK2450\\Src\\Drivers\\IIC\\i2c.c中 //#de ...…

查看全部问答>

触摸屏问题

请问在wince 6.0下有没有针对touch panel电源管理的API函数给应用程序调用?比如TouchPanelEnable类似的函数。 在Touch panel驱动中有DdsiTouchPanelEnable和DdsiTouchPanelDisable的函数可以直接控制驱动硬件,我尝试在应用程序端使用它们但是不 ...…

查看全部问答>

cramfs根文件系统启动问题

我用的优龙YL2410开发板,最近想自己制作一个cramfs跟文件系统,参考网上比较著名的一个文档《Linux系统移植》的根文件系统制作部分自己制作了一个cramfs的文件系统my_rootfs.cramfs,其中busybox使用的是1.1.3。把my_rootfs.cramfs烧写到板子后发 ...…

查看全部问答>

课程设计

基于单片机的太阳能热水器智能控制系统设计 Proteus仿真图出来就行了!!程序这些也要解释,望详细点点!!谢谢了大神…

查看全部问答>

4×4按键和数码管

小弟刚学单片机,想做一个8位数码管用4×4按键控制,要用到增加、减少、左移、右移,论坛有这类文章,请各位大虾推荐一下,万分感谢!!! 比如,按设置键,第一位闪烁,按增减键,该位增加,按减少键,该位减少;在设置第1位的基础上,按左移,数 ...…

查看全部问答>