历史上的今天
返回首页

历史上的今天

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

正在发生

2019年04月08日 | STM32F407实现矩阵键盘程序

2019-04-08 来源:eefocus

由于最近在做一个有关按键的项目,有用到矩阵键盘,因为网上有关矩阵键盘的程序很少,所以我就自己写一个发上去供大家参考,该程序所用到的GPIO口是PD0--PD7,至于矩阵键盘的原理就不一一描述了,直接上程序,具体程序如下:


//GPIO初始化函数

void GPIO_Configuration(void)

{

 GPIO_InitTypeDef GPIO_InitStructuress;

 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOA, ENABLE);           //打开时钟               

 GPIO_InitStructuress.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;  //初始化PD0-PD3

 GPIO_InitStructuress.GPIO_Mode = GPIO_Mode_OUT ;      

 GPIO_InitStructuress.GPIO_OType = GPIO_OType_PP;                                             //设置为推挽输出

 GPIO_InitStructuress.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_InitStructuress.GPIO_PuPd =GPIO_PuPd_UP;                                                   //上拉

 GPIO_Init(GPIOD, &GPIO_InitStructuress); 

 GPIO_InitStructuress.GPIO_Pin =GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;    //初始化PD4-PD7

 GPIO_InitStructuress.GPIO_Mode =GPIO_Mode_OUT ;

 GPIO_InitStructuress.GPIO_Speed = GPIO_Speed_50MHz;

 GPIO_InitStructuress.GPIO_PuPd = GPIO_PuPd_DOWN ;//Ï下拉

 GPIO_Init(GPIOD, &GPIO_InitStructuress); 

 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);

}

//按键函数

extern void Keyspress()

{

int KeyValue;

int y=0;

int f=5;

while(f)

{

   if((GPIO_ReadInputData(GPIOD)&0xff)!=0x0f) 

   Delay10ms(20);

 if((GPIO_ReadInputData(GPIOD)&0xff)!=0x0f) 

   GPIO_SetBits(GPIOD,GPIO_Pin_0); 

 

   GPIO_ResetBits(GPIOD,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

 

   switch(GPIO_ReadInputData(GPIOD)&0xff)

              { 

                case 0x11:KeyValue=12;break; 

 

                case 0x21:KeyValue=13;break; 

 

                case 0x41:KeyValue=14;break; 

 

                case 0x81:KeyValue=15;break;

               } 

                GPIO_SetBits(GPIOD,GPIO_Pin_1);

 

                GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);

 

                 switch(GPIO_ReadInputData(GPIOD)&0xff)

               { 

                 case 0x12:KeyValue=8;break;

 

                 case 0x22:KeyValue=9;break; 

 

 

                 case 0x42:KeyValue=10;break;

 

                 case 0x82:KeyValue=11;break; 

 

                } 

                 GPIO_SetBits(GPIOD,GPIO_Pin_2); 

 

 

                 GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3);

 

 

                  switch(GPIO_ReadInputData(GPIOD)&0xff)

                   { 

                    case 0x14:KeyValue=4;break;

 

                    case 0x24:KeyValue=5;break;

 

                    case 0x44:KeyValue=6;break;

 

                    case 0x84:KeyValue=7;break;

                   } 

                    GPIO_SetBits(GPIOD,GPIO_Pin_3); 

 

                    GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2);

                                              

                   switch(GPIO_ReadInputData(GPIOD)&0xff)

                    {

                     case 0x18:KeyValue=0;break;

 

                     case 0x28:KeyValue=1;break; 

 

                     case 0x48:KeyValue=2;break;

 

                     case 0x88:KeyValue=3;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((GPIO_ReadInputData(GPIOD)&0xff)!=0x0f);

                   switch(KeyValue) 

                     { 

                        case 0:f=3;break;

                        case 1:f=3;break;

                        case 2:f=3;break;

                        case 4: f=3;break;

                        case 5: f=3;break;

                        case 6: f=3;break;

                        case 8:f=3;break;

                        case 9: f=3;break;

                        case 10: f=3; break;

                        case 12:  f=3;break;

                        case 13:  f=3;break;//由于项目只用到12个按键,所以有4个按键的扫描程序是没有的

 

                    }

 

            }  

      }

  } 

}

//主函数:

int main

{

    GPIO_Configuration();

 

    Keyspress();

}


推荐阅读

史海拾趣

C&K Components公司的发展小趣事

1957年,Charles A. Coolidge, Jr.和Marshall Kincaid共同创立了C&K Components公司,起初主要专注于磁芯记忆单元的制造。那个时代的电子行业刚刚起步,市场竞争激烈,技术更新换代迅速。C&K在初创时期就面临了诸多挑战,但两位创始人凭借对技术的热爱和对市场的敏锐洞察,坚持探索新的技术方向,为公司的发展奠定了坚实的基础。

Everspin公司的发展小趣事

Everspin与众多知名企业和机构建立了合作伙伴关系,如戴尔电脑、Koyo Electronics Industries等。这些合作伙伴的认可和支持不仅为Everspin带来了更多的商业机会,也进一步提升了其在行业中的影响力。同时,Everspin还积极与客户沟通合作,根据客户需求提供定制化的解决方案,赢得了客户的广泛赞誉。

DUCATI公司的发展小趣事

随着技术的不断进步,Everspin不断推出新的MRAM产品,并逐渐将市场扩展到工业自动化、游戏、能源管理、通讯、运输和航空电子等多个领域。特别是其MRAM和STT-MRAM产品在数据中心、云存储、能源、工业、汽车和运输市场中的广泛应用,为全球MRAM用户奠定了最强大、增长最快的基础。

ABL Heatsink公司的发展小趣事

早期,ABL Heatsink公司主要生产通用型散热器,但随着市场竞争的加剧,公司意识到必须调整市场定位。于是,公司开始专注于研发针对特定电子设备的高性能散热器。通过深入了解客户需求,ABL Heatsink成功开发出一系列定制化产品,赢得了市场的青睐。

Auctor Corp公司的发展小趣事

Auctor Corp公司的创始人,一群富有远见和冒险精神的工程师,怀揣着对电子技术的热情和对市场的敏锐洞察,决定共同创办这家公司。在创业初期,公司面临着资金紧张、技术储备不足等多重困难。然而,团队成员们凭借着坚韧不拔的精神和对技术的执着追求,通过自主研发和不断改进,逐渐在市场上站稳了脚跟。

赛微(Cellwise)公司的发展小趣事

作为一家有着高度社会责任感的企业,赛微始终关注社会发展和环境保护。公司积极参与公益事业和慈善活动,为社会做出积极贡献。同时,公司还注重环境保护和资源节约,通过引进先进的生产设备和工艺技术,降低生产过程中的能耗和排放,实现绿色生产和可持续发展。

请注意,以上故事框架仅为概述,具体细节和数据可能需要根据实际情况进行调整和完善。

问答坊 | AI 解惑

哪些地方需要监控系统?

a.宾馆、银行、饭店、娱乐场所等服务行业   服务行业的竞争愈来愈激烈,人们对服务行业的服务质量、服务态度有了更高的要求。这使得在窗口服务行业中,管理人员对营业人员的管理日趋重要。而闭路监控系统为管理者提供了一种有效的手段。电视监控 ...…

查看全部问答>

NPN管工作时基极电压比射级高~~~

我的电路图如下,其中稳压管是Vz=30V,做实验时发现随着输入电压(集电极电压)的增加,基极电压不变,射级电压缓慢增加,Vbe逐渐减小,当Vc升到40+时,Vbe竟然变成负的(Vb约30V,Ve=30.5V),我的三极管型号是MJH11022。为啥我的管子Vbe会变成负 ...…

查看全部问答>

WinCE的设备,插入一张SD卡,然后在桌面创建一个快捷方式指向SD卡中程序,怎么运行不了呢,就是找不到程序,有知道的吗?

WinCE的设备,插入一张SD卡,然后在桌面创建一个快捷方式指向SD卡中程序,怎么运行不了呢,就是找不到程序,有知道的吗?…

查看全部问答>

交叉编译busybox-1.2.0出错,请高手帮忙

     内核是linux 2.4.18, busybox的配置信息:1.使用静态连接库 2.不用本地/usr 3.添加ext2文件系统工具:e2fsck, fsck....  4.添加交叉编译工具路径。仅此而已,错误信息如下: >  LINK busybox_unstri ...…

查看全部问答>

有没朋友用过Integrated 的D4发卡器

问题: 虽然有dll的函数说明但不知道 一些参数的格式,和如果要读写数据时,需要那些步骤. 如有做过智能卡的开发的朋友 给点资料.谢谢!…

查看全部问答>

具有_SNRBoost_技术的最低功耗_4_通道_ADC_

本帖最后由 dontium 于 2015-1-23 13:40 编辑 具有SNRBoost 技术的最低功耗 11 位 200 MSPS ADC 4 通道、双通道与缓冲单通道选项 德州仪器 (TI) ADS58C48 系列是业界最低功耗的 11 位 ADC,速率高达 200 MSPS。 ...…

查看全部问答>

开关电源运用在单片机电路上所出现的问题

                                 我在做智能车时  老听说别人因为用的开关电源把电源烧了!  现在让我们讨论一下开关电源在单 ...…

查看全部问答>

STM32F串口出现奇怪现象,是不是串口收发器BUG,望高手指点

大家好,我用的是红牛开发板,CPU型号是STM32F103ZE,在进行串口实验时,STM32会将收到的数据原封不动的发送回来。在实验中,如果发送的数据不是0x00,收发正确,即串口发送什么东西,STM32都会正确接收,并回复给串口助手,串口助手也能正确 ...…

查看全部问答>

dspMCBSP多通道缓冲串口,后接MAX3111进行串口扩展

用dsp的MCBSP串口扩展通信,使用SPI协议。知道mcbsp怎么初始化了,max3111有一个输出中断,连接到DSP,DSP要怎么样检测并使用MAX3111的输出中断?…

查看全部问答>

LM3S9B96的GPIO有多少个能做输入的啊?

图中的AIN应该表示模拟输入吧?图中的 - 号表示什么意思?9B96的GPIO一共有多少个可以用作输入呢?…

查看全部问答>