基于STM32L151//STM32F407的矩阵键盘程序(不规则接口)

发布者:红尘清梦最新更新时间:2019-04-08 来源: eefocus关键字:STM32L151  STM32F407  矩阵键盘程序  不规则接口 手机看文章 扫描二维码
随时随地手机看文章


最近在做一个有关按键的项目,需要用到矩阵键盘,上网找了很多都是基于一些规则接口的程序,感觉无语,因为画PCB由于布线原因


不太可能矩阵键盘的几条线是连接连续的GPIO口,所以经过我自己思考,做出了自己基于STM32的不规则程序,


由于每种矩阵键盘的连接原理有时是不同,所以首先先讲明我的矩阵键盘的连接原理


4条行线初始化时全为1,列线全为0,由于我的列先有接10K的电阻,有按键按下时,被按下的列线为1,

行线一次置为1、0、0、0,1,0,0�,0,1,0�,0,0,1

基于STM32L151//STM32F407的矩阵键盘程序(不规则接口):


行接口:PA8,PA12,PB3,PB4

列接口:PA11,PB5,PB9


void KeyPress(void){

          int KeyValues;

 

 while(1)

 {

  if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)

  {

   Delay10ms(20);

   GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);

   GPIO_ResetBits(GPIOA,GPIO_Pin_11);

     GPIO_SetBits(GPIOA,GPIO_Pin_8);

   GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4);

   GPIO_ResetBits(GPIOA,GPIO_Pin_12);

   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1)

   {

      KeyValues=10;

   }

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)

   {

      KeyValues=11; 

   }

while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1);

   /////////////////////////////////////////////

   GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);

   GPIO_ResetBits(GPIOA,GPIO_Pin_11);

     GPIO_SetBits(GPIOA,GPIO_Pin_12);

   GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4);

   GPIO_ResetBits(GPIOA,GPIO_Pin_8);

   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1)

   {

      KeyValues=7; 

   }

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)

   {

      KeyValues=8; 

   }

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)

   {

      KeyValues=9; 

   }

 while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1);

   //////////////////////////////////////////////

   GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);

   GPIO_ResetBits(GPIOA,GPIO_Pin_11);

     GPIO_SetBits(GPIOB,GPIO_Pin_3);

   GPIO_ResetBits(GPIOB,GPIO_Pin_4);

    GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_12);

   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1)

   {

      KeyValues=4;

   }

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)

   {

      KeyValues=5; 

   }

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)

   {

      KeyValues=6; 

   }

 while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1);

   ////////////////////////////////////////////////

   GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);

   GPIO_ResetBits(GPIOA,GPIO_Pin_11);

     GPIO_ResetBits(GPIOB,GPIO_Pin_3);

   GPIO_SetBits(GPIOB,GPIO_Pin_4);

     GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_12);

   

   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==1)

   {

      KeyValues=1; 

   }

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)

   {

      KeyValues=2;

   }

   if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)

   {

      KeyValues=3;

 while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)||GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1);

   

     

     

   GPIO_ResetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_9);

   GPIO_ResetBits(GPIOA,GPIO_Pin_11);

     GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4);

    GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_12);

   }

  }

}

\\\\\\\\\\\\\\\\\\\

!!!!上图附有本程序的矩阵键盘原理,与普通矩阵键盘设计不太一样!!!!!!

\\\\\\\\\\\\\\\\\\\


关键字:STM32L151  STM32F407  矩阵键盘程序  不规则接口 引用地址:基于STM32L151//STM32F407的矩阵键盘程序(不规则接口)

上一篇:STM32F407实现矩阵键盘程序
下一篇:关于STM32F103型号的矩阵按键的程序书写

推荐阅读最新更新时间:2024-03-16 16:26

stm32f407】CAN总线
一.CAN简介 CAN是ControllerArea Network的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986年德国电气商博世公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,现在在欧洲已是汽车网络的标准协议。 现在,CAN的高性能和可靠性已被认同,并被广泛地应用于工业
[单片机]
【<font color='red'>stm32f407</font>】CAN总线
STM32F407--芯片解读
注:博主使用的是STM32F4探索者 一、参考资料 1、STM32F4数据手册:STM32F407ZGT6.pdf 2、STM32F4中文手册:STM32F4xx中文参考手册.pdf 3、开发板原理图:Explorer STM32F4_Vxx_SCH.pdf 二、芯片内部资源 1、芯片实物图片 2、芯片对应的参数表 3、内核 (1)32位 高性能ARM Cortex-M4处理器 (2)时钟: 高达168MHz,实际还可以超频一点点 (3)支持FPU(浮点运算)和DSP指令 4、IO口 (1)STM32F407ZGT6:144引脚 114个IO口 (2)大部分IO口都耐
[单片机]
STM32F407--芯片解读
矩阵键盘的51程序
// P1口扩展4*4矩阵键盘,P1.7-P1.4作为行线,P1.3-P1.0作为列线。 // 数码管显示按键值,P0提供段码,P2.7-2.5通过74ls138,作为位码,片选数码管。 #include reg52.h void leddisplay(); // 数码管显示 unsigned char keyscan(); //键盘扫描 unsigned char keyin(); //按键值读取 void delayms(unsigned int k); unsigned char data ledxs ={16,16,16,16,16,16,0,0}; // 数码管显示缓冲区 unsigned char code
[单片机]
STM32F407.FLASH 读写经验
现象: 如下代码: //从指定地址开始写入指定长度的数据 //该函数对OTP区域也有效!可以用来写OTP区! //OTP区域地址范围:0X1FFF7800~0X1FFF7A0F //WriteAddr:起始地址(此地址必须为4的倍数!!) //pBuffer:数据指针 //NumToWrite:字(32位)数(就是要写入的32位数据的个数.) void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite) { u8 status=0; u32 addrx=0; u32 endaddr=0; if(WriteAddr
[单片机]
STM32F407.FLASH 读写经验
stm32l151 ADC通过DMA通道定时采样电池电量
  最近在使用stm32l151开发一个项目,我的项目需求是ADC采集电池电量,通过DMA通道传送出来。然而我并不是得到了电池电量数据后就立马连续输出,而是通过tim4定时器每1s访问一次采样得到的电池数据,并显示出来。本来网上关于stm32通过adc通道采集电池电量的代码很多,但要找到和我的需求一样的,还真没有。于是在借鉴其他人代码的基础上,根据我的特殊需求,写了一份这样功能的代码。   因为我的需求涉及到了tim4定时器,adc和dma,所以在最终配置的时候也分为几个部分:   1.首先是定时器tim4。    a)初始化 void vTim4_Init(void) { TIM_TimeBaseInitTypeDef
[单片机]
4x4矩阵键盘 扫描程序
一:不排除第四位异常处理 uchar JuzhenkeyScan() { // P3=0xfe; // temp=P3; // while(temp!=0xfe) // { // temp=P3; // switch(temp) // { // case 0xee:num=10; // break; // case 0xde:num=3; // break; // case 0xbe:num=2; // break; // case 0x7e:num=1; // break; // } // delayms(10); // } P3=0xfd;//
[单片机]
Stm32f407 key外部中断
硬件平台: stm32f407ve 软件平台: win10 (OS Name: Microsoft Windows 10 Enterprise OS Version: 10.0.18363 N/A Build 18363) Keil5 5.26.2 HAL库版本: 2.14.0(目前下载的最新的) 中断这个部分需要参考中文手册和权威指南。 这里我还是提一下NVIC这个东西,全称是Nested vectored interrupt controller,即嵌套向量中断控制器。这个器件是用来管理stm32所有中断的(在现实
[单片机]
<font color='red'>Stm32f407</font> key外部中断
STM32F407玩控制—模式设别法PID参数自动整定
模式设别法PID参数自动整定,是指在闭环系统阶跃响应下(也可以是扰动响应下),设别出衰减比和振荡周期,这是主要两个量,另外也需要判断欠阻尼和发散振荡的情况,然后据此调整PID参数,理想目标是以4比1幅值衰减,这些量的辨识应该说并不难,但由于干扰的存在,问题就变得很复杂,识别有关状态后,就进行PID值得修改,这里修改就存在一个过犹不及的尴尬,pid参数调整幅度小了,就要增加次数,调整幅度过猛了,又要反过来再调,对这个系统是合适的调整,对另外一个未必是合适的调整,也不存在折中的办法,我们做的模式设别法PID参数自动整定效果如图1-图6所示,图1中系统响应曲线是振荡的,调整PID参数后,系统不再振荡,但调整过程时间太长,再一次调整PID
[单片机]
用<font color='red'>STM32F407</font>玩控制—模式设别法PID参数自动整定
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved