野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22715|回复: 13

弄了好久的矩阵键盘,晒出来给大家学习学习,我已经好累了。

[复制链接]
发表于 2016-8-9 13:09:40 | 显示全部楼层 |阅读模式
借鉴水友,并仿照,写的两种,保证已经实现。第一种其实也是4*4   只是将另外一行删除了  做成了4行3列
  1. #include "KEY.h"
  2. #include        "delay.h"
  3. void KEY_Init(void)
  4. {
  5.         GPIO_InitTypeDef  GPIO_InitStructure;
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
  8.         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  9.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//áD
  10.   GPIO_Init(GPIOB,&GPIO_InitStructure);
  11.        
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;      
  13.         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
  14.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//DD

  15.   GPIO_Init(GPIOB,&GPIO_InitStructure);               
  16. }
  17. int KEY_Scan(void)
  18. {
  19.         u8 KeyVal=16;         
  20.         GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x000f));
  21.        
  22.         if((GPIOB->IDR & 0xf000)==0x0000)  
  23.                 return -1;
  24.         else
  25.         {       
  26.             delay_ms(5);   
  27.             if((GPIOB->IDR & 0xf000)==0x0000)
  28.             return -1;
  29.         }

  30.         GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0001));       

  31.                 switch(GPIOB->IDR & 0xf000)
  32.                         {
  33.                                 case 0x1000: KeyVal=15; break;
  34.                                 case 0x2000: KeyVal=11;        break;
  35.                                 case 0x4000: KeyVal=7;        break;
  36.                                 case 0x8000: KeyVal=3;        break;
  37.                         }
  38.         while((GPIOB->IDR & 0xf000)!=0x0000);                

  39.         GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0002));       
  40.                 switch(GPIOB->IDR & 0xf000)                     
  41.                 {
  42.                         case 0x1000: KeyVal=14;        break;
  43.                         case 0x2000: KeyVal=10;        break;
  44.                         case 0x4000: KeyVal=6;        break;
  45.                         case 0x8000: KeyVal=2;        break;
  46.                 }
  47.         while((GPIOB->IDR & 0xf000)!=0x0000);                

  48.         GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0004));       
  49.                 switch(GPIOB->IDR & 0xf000)                       
  50.                 {
  51.                         case 0x1000: KeyVal=13;        break;
  52.                         case 0x2000: KeyVal=9;        break;
  53.                         case 0x4000: KeyVal=5;        break;
  54.                         case 0x8000: KeyVal=1;        break;
  55.                 }
  56.         while((GPIOB->IDR & 0xf000)!=0x0000);                
  57.                
  58.         return KeyVal;               
  59. }



复制代码
第二种4*4
  1. #include "KeyScan.h"
  2. #include "rs232.h"

  3. void Delay_ms(int xms)       
  4. {
  5.   u32 i,j;
  6.         for(i=xms;i>0;i--)
  7.           for(j=72000;j>0;j--);
  8. }
  9. void Scan_GPIO_Config(void)
  10. {
  11.        
  12.         GPIO_InitTypeDef GPIO_InitStructure;
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  14.        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  18.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  19.        
  20.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  21.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  23.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  24.        
  25.         GPIO_SetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);                                                        //éèÖÃDDÎa¸ßμçƽ
  26.         GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);                                                //éèÖÃáDÎaμíμçƽ
  27. }





  28. void Read_KeyValue(void)
  29. {
  30.         u8 KeyValue=0;
  31.         if((GPIO_ReadInputData(GPIOC)&0xFF)!=0x0F)                                                                //è¡GPIOCμíáùλμçƽÖ죬ÅD¶Ï°′¼üêÇ·ñ°′ÏÂ
  32.         {
  33.                 Delay_ms(8);                                                                                                                                                                        //Ñóê±Ïû¶¶£¬¸ÃÑóê±oˉêyêÇèí¼tÑóê±£¬·Ç×¼è·Ñóê±
  34.                 if((GPIO_ReadInputData(GPIOC)&0xFF)!=0x0F)                                                //Ôù′ÎÅD¶Ï°′¼üêÇ·ñ°′ÏÂ
  35.                 {
  36.                        
  37.                         GPIO_SetBits(GPIOC, GPIO_Pin_0);                                                                                //éèÖÃμúò»DDÎa ¸ßμçƽ£¬ÆäËüDDÎaμíμçƽ£¬í¨1yé¨Ã裬¿éòÔÅD¶ÏÄÇò»áD3öÏÖ¸ßμçƽ
  38.                         GPIO_ResetBits(GPIOC, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);                                                       
  39.                         switch(GPIO_ReadInputData(GPIOC)&0xFF)                                                        //è¡GPIOCμíáùλμçƽÖ죬ÅD¶ÏÄÇò»°′¼ü°′ÏÂ
  40.                         {                       
  41.                                 case 0x11: KeyValue = 1; break;                                // 0001 1001
  42.                                 case 0x21: KeyValue = 4; break;                                // 0010 0001
  43.                                 case 0x41: KeyValue = 7; break;                                // 0100 0001
  44.                                 case 0x81: KeyValue = 10; break;                        // 1000 0001
  45.                         }
  46.        
  47.                         GPIO_SetBits(GPIOC, GPIO_Pin_1);
  48.                         GPIO_ResetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3);                       
  49.                         switch(GPIO_ReadInputData(GPIOC)&0xFF)                                                        //è¡GPIOCμíáùλμçƽÖ죬ÅD¶ÏÄÇò»°′¼ü°′ÏÂ
  50.                         {                       
  51.                                 case 0x12: KeyValue = 2; break;                                // 0001 0010
  52.                                 case 0x22: KeyValue = 5; break;                                // 0001 0010
  53.                                 case 0x42: KeyValue = 8; break;                                // 0100 0010
  54.                                 case 0x82: KeyValue = 11; break;                        // 1000 0010
  55.                         }
  56.                        
  57.                         GPIO_SetBits(GPIOC, GPIO_Pin_2);
  58.                         GPIO_ResetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);                       
  59.                         switch(GPIO_ReadInputData(GPIOC)&0xFF)                                                        //è¡GPIOCμíáùλμçƽÖ죬ÅD¶ÏÄÇò»°′¼ü°′ÏÂ
  60.                         {                       
  61.                                 case 0x14: KeyValue = 3; break;                                // 0001 0100
  62.                                 case 0x24: KeyValue = 6; break;                                // 0010 0100
  63.                                 case 0x44: KeyValue = 9; break;                                // 0100 0100
  64.                                 case 0x84: KeyValue = 12; break;                        // 1000 0100
  65.                         }
  66.                        
  67.                         GPIO_SetBits(GPIOC, GPIO_Pin_3);
  68.                         GPIO_ResetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);                       
  69.                         switch(GPIO_ReadInputData(GPIOC)&0xFF)                                                        //è¡GPIOCμíáùλμçƽÖ죬ÅD¶ÏÄÇò»°′¼ü°′ÏÂ
  70.                         {                       
  71.                                 case 0x18: KeyValue = 13; break;                                // 0001 1000
  72.                                 case 0x28: KeyValue = 14; break;                                // 0010 1000
  73.                                 case 0x48: KeyValue = 15; break;                                // 0100 1000
  74.                                 case 0x88: KeyValue = 16; break;                                // 1000 1000
  75.                         }               
  76.                        
  77.                         GPIO_SetBits(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
  78.                         GPIO_ResetBits(GPIOC, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
  79.                        
  80.                         while((GPIO_ReadInputData(GPIOC)&0xFF)!=0x0F);                                //μè′y°′¼üËé¿a
  81.                        
  82.                         printf("°′ÏÂμļüÖμ:%d\n",KeyValue);
  83.                         }
  84.         }
  85. }
复制代码




回复

使用道具 举报

发表于 2016-8-9 13:29:04 | 显示全部楼层
看看学习下。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2016-8-9 13:41:01 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2016-8-9 14:52:49 | 显示全部楼层
终于搞出来啦 ?
回复 支持 反对

使用道具 举报

发表于 2016-8-9 14:53:25 | 显示全部楼层
看你搞了这么久,cool,精华               
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-9 15:16:19 | 显示全部楼层
fire 发表于 2016-8-9 14:53
看你搞了这么久,cool,精华

是呀。不想弄了  够用就可以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-9 15:16:43 | 显示全部楼层
许亮 发表于 2016-8-9 14:52
终于搞出来啦 ?

看我笑话来啦,小伙子
回复 支持 反对

使用道具 举报

发表于 2016-8-9 19:15:01 | 显示全部楼层
怎么又乱码,你还是把工程甩上来,大家要学的,可以下载查看!!!
回复 支持 反对

使用道具 举报

发表于 2016-8-10 08:39:30 | 显示全部楼层
我只用过独立键盘5个的,使用状态机不延时,没有用过矩阵键盘,总觉得那个delayms(5),在单片机运行中,延时是个很致命的问题啊,能否如何解决掉延时?
回复 支持 反对

使用道具 举报

发表于 2017-4-30 09:41:25 | 显示全部楼层
楼主,有原理图吗?解释都是乱码,有硬件原理图吗?
回复 支持 反对

使用道具 举报

发表于 2017-5-17 22:30:16 | 显示全部楼层
谢谢楼主,解了我的惑
回复 支持 反对

使用道具 举报

发表于 2017-8-11 00:20:52 | 显示全部楼层
能否给我个完整程序(STM32F103VE),初学,想看看,谢谢大神~
回复 支持 反对

使用道具 举报

发表于 2018-12-21 09:59:24 | 显示全部楼层
我用的楼主发的第一种扫描方法,得按下一会儿(大概2秒)才起作用,反应特别慢,正在研究中。。。
回复 支持 反对

使用道具 举报

发表于 2018-12-24 10:15:45 | 显示全部楼层
尝试看看,怎么样的呢!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 17:21 , Processed in 0.479358 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表