找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32不连续IO口矩阵键盘的源码

[复制链接]
跳转到指定楼层
楼主
ID:82098 发表于 2018-5-29 22:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不连续IO口矩阵键盘

单片机源程序如下:
  1. #include "pkey.h"
  2. #include "delay.h"
  3. #include "sys.h"

  4. void HardwareInit(void);
  5. int main(void)
  6. {        
  7.         HardwareInit();        
  8.         
  9.         while(1)
  10.         {                        
  11.     GetKeyVal();
  12.                
  13.   }
  14. }


  15. void HardwareInit(void)
  16. {
  17.    uart_init(9600);   //串口,便于观察
  18.    Key_Config();                                  //按键初始化
  19.          delay_init();                                //延时函数
  20. }
复制代码
  1. #include "pkey.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. /**
  5. ** PB5-PB8,列,输出。 PB10-PB14,行,输入
  6. **/


  7. void Key_Config(void)
  8. {
  9.    GPIO_InitTypeDef GPIO_InitStructure;   
  10.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
  11.    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  12.        
  13.          /********4行输出*********/
  14.          GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11| GPIO_Pin_12 ;
  15.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  16.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.    GPIO_Init(GPIOC, &GPIO_InitStructure);
  18.        
  19.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
  20.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  21.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
  22.    GPIO_Init(GPIOA, &GPIO_InitStructure);
  23.          /********4列输入*********/
  24.          GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
  25.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;         
  26.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  27.    GPIO_Init(GPIOB, &GPIO_InitStructure);       
  28.        
  29.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;         
  30.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  32.          GPIO_Init(GPIOD, &GPIO_InitStructure);       
  33. }

  34. int KeyScan(void)
  35. {
  36.    uchar KeyVal;
  37.        
  38.    GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x1C00));         //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
  39.          GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x8000));         //不管其余12位0xf0ff,先让PA15输出高。

  40.          if(((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))==0x0000)                                                                    //如果PB12到PB15全为零则没有按键按下
  41.                   return -1;
  42.          else
  43.          {       
  44.             delay_ms(5);    //延时5ms去抖动
  45.             if(((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))==0x0000)
  46.             return -1;
  47.          }
  48.          


  49.          
  50.          GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0000));         //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
  51.          GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x8000));         //不管其余12位0xf0ff,先让PA15输出高。
  52.          switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))        //第一行,由低到高,同理,不赘述
  53.          {
  54.              case 0x0004: KeyVal=13;  break;
  55.                         case 0x0008: KeyVal=12;        break;
  56.                         case 0x0010: KeyVal=11;        break;
  57.                         case 0x0020: KeyVal=10;        break;
  58.    }
  59.          while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004)        > 0);     //等待按键释放
  60.          
  61.          GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0400));         //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
  62.          GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000));         //不管其余12位0xf0ff,先让PA15输出高。
  63.                 switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))                        
  64.                 {
  65.              case 0x0004: KeyVal=14;  break;
  66.                         case 0x0008: KeyVal=9;        break;
  67.                         case 0x0010: KeyVal=6;        break;
  68.                         case 0x0020: KeyVal=3;        break;
  69.                 }
  70.     while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004)        > 0);
  71.                
  72.          GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x0800));         //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
  73.          GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000));         //不管其余12位0xf0ff,先让PA15输出高。
  74.                 switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))                        
  75.                 {
  76.              case 0x0004: KeyVal=0;  break;
  77.                         case 0x0008: KeyVal=8;        break;
  78.                         case 0x0010: KeyVal=5;        break;
  79.                         case 0x0020: KeyVal=2;        break;
  80.                 }
  81.     while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004)        > 0);
  82.                
  83.           GPIO_Write(GPIOC, (GPIOC->ODR & 0xE3FF | 0x1000));         //不管其余12位0xf0ff,先让PC10到PC12全部输出高。
  84.           GPIO_Write(GPIOA, (GPIOA->ODR & 0x7FFF | 0x0000));         //不管其余12位0xf0ff,先让PA15输出高。
  85.                 switch((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004))                        
  86.                 {
  87.              case 0x0004: KeyVal=15;  break;
  88.                         case 0x0008: KeyVal=7;        break;
  89.                         case 0x0010: KeyVal=4;        break;
  90.                         case 0x0020: KeyVal=1;        break;
  91.                 }

  92. //                printf("%#x\n  ",(GPIOB->IDR & 0x0038));
  93. //          printf("%#x\n  ",(GPIOD->IDR & 0x0004));
  94. //          //printf("%#x\n  ",(GPIOD->IDR & 0x0004)|(GPIOB->IDR & 0x0038));
  95.                 while((GPIOB->IDR & 0x0038)|(GPIOD->IDR & 0x0004)        > 0);
  96.           
  97.                 return KeyVal;
  98. }

  99. /************************************
  100. 按键表盘为:                0  1  2  3
  101.                                                         4  5  6  7
  102.                                                         8  9  10 11
  103.                                                         12 13 14 15
  104. ************************************/
  105. void GetKeyVal(void)
  106. {
  107.     int num;
  108.           num = KeyScan();
  109.           switch(num)
  110.           {
  111.         case 0: printf("0\n"); break;                                                                               
  112.                                 case 1: printf("1\n"); break;                                                                                 
  113.                                 case 2: printf("2\n"); break;                                                                               
  114.                                 case 3: printf("3\n"); break;                                                                               
  115.                                 case 4: printf("4\n"); break;                                                
  116.                                 case 5: printf("5\n"); break;                                                                               
  117.                                 case 6: printf("6\n"); break;                                                                               
  118.                                 case 7: printf("7\n"); break;                                                                        
  119.                                 case 8: printf("8\n"); break;                                                                                        
  120.                                 case 9: printf("9\n"); break;                                                                                                     
  121.                           case 10: printf("10\n"); break;                                                                                                      
  122.                                 case 11: printf("11\n"); break;                                                                              
  123.                                 case 12: printf("12\n"); break;                                                                                                      
  124.                           case 13: printf("13\n"); break;                                                                                                       
  125.                                 case 14: printf("14\n"); break;                                                                              
  126.                                 case 15: printf("15\n"); break;                                                                      
  127.     }
  128. }
复制代码


所有资料51hei提供下载:
不连续IO口矩阵键盘.rar (281.38 KB, 下载次数: 26)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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