久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6334|回復: 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)
回復

使用道具 舉報

ID:608923 發表于 2019-9-19 10:20 | 顯示全部樓層
不行的啊
,還缺了一些東西
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩国产中文字幕 | av天天看 | 99免费视频 | 四虎永久在线精品免费一区二 | 1区2区3区视频 | 国产精品99免费视频 | 午夜久久久久 | 91av在线不卡 | 综合一区二区三区 | 日韩电影中文字幕 | 成人做爰9片免费看网站 | 国产精品日韩欧美 | 欧美一区二区三区久久精品 | 欧美日韩一区精品 | 国产成人亚洲精品自产在线 | 成年人在线视频 | 精品一区二区三区免费视频 | 在线观看av网站永久 | 久久国产精品久久久久久久久久 | 久久成人精品一区二区三区 | 亚洲不卡在线观看 | 奇米av | 99re在线免费视频 | 亚洲国产专区 | 伊人免费视频二 | 亚洲欧美一区二区三区视频 | 欧美99 | 午夜天堂精品久久久久 | 欧美色999 | 国产精品亚洲综合 | 久久天天躁狠狠躁夜夜躁2014 | 国产精品高 | 91精品国产色综合久久不卡98口 | 欧美性猛交一区二区三区精品 | 视频一区在线观看 | av一级毛片| 国产高清在线精品一区二区三区 | 久热久 | 欧美日韩专区 | 97伦理电影 | 91精品国产综合久久福利软件 |