找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6414|回复: 1
打印 上一主题 下一主题
收起左侧

4x4矩阵按键stm32程序源码

[复制链接]
跳转到指定楼层
楼主
ID:428545 发表于 2018-11-18 09:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4x4矩阵按键stm32程序源码  keil程序

单片机源程序如下:
  1. #include "key.h"

  2. /**
  3. ** PB5-PB8,列,输出。 PB10-PB14,行,输入
  4. **/
  5. void Key_Config(void)
  6. {
  7.    GPIO_InitTypeDef GPIO_InitStructure;   
  8.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  9.    
  10.          /********4行输出*********/
  11.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  12.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  13.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14.    GPIO_Init(GPIOB, &GPIO_InitStructure);
  15.          
  16.          /********4列输入*********/
  17.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  18.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;         
  19.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20.    GPIO_Init(GPIOB, &GPIO_InitStructure);       
  21. }

  22. int KeyScan(void)
  23. {
  24.    uchar KeyVal;
  25.        
  26.    GPIO_Write(GPIOB, (GPIOB->ODR & 0xf0ff | 0x0f00));         //不管其余12位0xf0ff,先让PB8到PB11全部输出高。
  27.           
  28.          if((GPIOB->IDR & 0xf000)==0x0000)                                                                    //如果PB12到PB15全为零则没有按键按下
  29.                   return -1;
  30.          else
  31.          {       
  32.             Delay_ms(5);    //延时5ms去抖动
  33.             if((GPIOB->IDR & 0xf000)==0x0000)
  34.             return -1;
  35.          }
  36.          
  37.          GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0100));        //仅将PB8置高         
  38.          switch(GPIOB->IDR & 0xf000)        //第一行,由低到高,同理,不赘述
  39.          {
  40.              case 0x1000: KeyVal=0; break;
  41.                         case 0x2000: KeyVal=1;        break;
  42.                         case 0x4000: KeyVal=2;        break;
  43.                         case 0x8000: KeyVal=3;        break;
  44.    }
  45.          while((GPIOB->IDR & 0xf000)        > 0);     //等待按键释放
  46.          
  47.          GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0200));        //仅将PB9置高
  48.                 switch(GPIOB->IDR & 0xf000)                        
  49.                 {
  50.                         case 0x1000: KeyVal=4;        break;
  51.                         case 0x2000: KeyVal=5;        break;
  52.                         case 0x4000: KeyVal=6;        break;
  53.                         case 0x8000: KeyVal=7;        break;
  54.                 }
  55.     while((GPIOB->IDR & 0xf000)        > 0);
  56.                
  57.           GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0400));        //仅将PB10置高
  58.                 switch(GPIOB->IDR & 0xf000)                        
  59.                 {
  60.                         case 0x1000: KeyVal=8;        break;
  61.                         case 0x2000: KeyVal=9;        break;
  62.                         case 0x4000: KeyVal=10;        break;
  63.                         case 0x8000: KeyVal=11;        break;
  64.                 }
  65.     while((GPIOB->IDR & 0xf000)        > 0);
  66.                
  67.           GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0800));        //仅将PB11置高
  68.                 switch(GPIOB->IDR & 0xf000)                        
  69.                 {
  70.                         case 0x1000: KeyVal=12;        break;
  71.                         case 0x2000: KeyVal=13;        break;
  72.                         case 0x4000: KeyVal=14;        break;
  73.                         case 0x8000: KeyVal=15;        break;
  74.                 }
  75.                 while((GPIOB->IDR & 0xf000)        > 0);
  76.           
  77.                 return KeyVal;
  78. }

  79. /************************************
  80. 按键表盘为:                0  1  2  3
  81.                                                         4  5  6  7
  82.                                                         8  9  10 11
  83.                                                         12 13 14 15
  84. ************************************/
  85. void GetKeyVal(void)
  86. {
  87.     int num;
  88.           num = KeyScan();
  89.           switch(num)
  90.           {
  91.         case 0: printf("0\n"); break;                                                                               
  92.                                 case 1: printf("1\n"); break;                                                                                 
  93.                                 case 2: printf("2\n"); break;                                                                               
  94.                                 case 3: printf("3\n"); break;                                                                               
  95.                                 case 4: printf("4\n"); break;                                                
  96.                                 case 5: printf("5\n"); break;                                                                               
  97.                                 case 6: printf("6\n"); break;                                                                               
  98.                                 case 7: printf("7\n"); break;                                                                        
  99.                                 case 8: printf("8\n"); break;                                                                                        
  100.                                 case 9: printf("9\n"); break;                                                                                                     
  101.                           case 10: printf("10\n"); break;                                                                                                      
  102.                                 case 11: printf("11\n"); break;                                                                              
  103.                                 case 12: printf("12\n"); break;                                                                                                      
  104.                           case 13: printf("13\n"); break;                                                                                                       
  105.                                 case 14: printf("14\n"); break;                                                                              
  106.                                 case 15: printf("15\n"); break;                                                                      
  107.     }
  108. }
复制代码

所有资料51hei提供下载:
KEY4x4.rar (294.53 KB, 下载次数: 146)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:608923 发表于 2019-9-19 10:20 | 只看该作者
不行的啊
,还缺了一些东西
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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