找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 639|回复: 1
收起左侧

关于4x4矩阵键盘单片机代码修改,小白求助

[复制链接]
ID:993578 发表于 2024-4-3 15:09 | 显示全部楼层 |阅读模式
问题:图一是我仿真使用的矩阵键盘,仿真正常使用。在某一个宝买了一个图二的矩阵键盘,行列原理图是反着的请问我该如何修改我的单片机代码
  1. #include "button.h"
  2. #include "stm32f10x.h"
  3. #include "delay.h"

  4. extern u8 pass_word_state;        //输密码时判断是输入了第几位
  5. u8 Key_Data=0;  //按键按下的数据
  6. u8 Key_flag=0;  //按键按下标志位,区分按键按下一次的


  7. void KEY_Init(void)
  8. {
  9.         GPIO_InitTypeDef GPIO_InitStructure;
  10.         
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);//开启时钟
  12.         
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  14.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); //改变指定管脚的映射完全禁用(JTAG+SW-DP)
  15.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//改变指定管脚的映射,JTAG-DP 禁用 + SW-DP 使能
  16.                
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //LED
  18.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
  19.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  21.         LED0 = 0;
  22.         
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //蜂鸣器(beep) 低电平触发
  24.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0;
  25.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  27.         BEEP=1;
  28.         
  29.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //继电器(relay) 高电平触发
  30.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13;
  31.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  32.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  33.         RELAY=0;
  34. }

  35. //按键赋值,这里是将八个按键拼接成一组51单片机里面的Io,目前测试可行
  36. void Key_assignment(unsigned char z)
  37. {
  38.         Key_Data=0x00;   //清零
  39.         if(z==0)
  40.         {
  41.                 key_LowOutPutConfig();               
  42.                 key5_1;  key6_1;  key7_1;  key8_1;   //使用的方法是反转法
  43.                
  44.                 delay_us(500);  //短延时一下
  45.                
  46.                 if(key1==1) Key_Data=Key_Data|0x8F;
  47.                 else if(key2==1) Key_Data=Key_Data|0x4F;
  48.                 else if(key3==1) Key_Data=Key_Data|0x2F;
  49.                 else if(key4==1) Key_Data=Key_Data|0x1F;
  50.                 else Key_Data=Key_Data|0x0F;

  51.         }
  52.         else
  53.         {               
  54.                 key_HighOutPutConfig();
  55.                 key1_1;  key2_1;  key3_1;  key4_1;//使用的方法是反转法
  56.                 delay_us(500);  //短延时一下
  57.                
  58.                 if(key5==1) Key_Data=Key_Data|0xF8;
  59.                 else if(key6==1) Key_Data=Key_Data|0xF4;        
  60.                 else if(key7==1) Key_Data=Key_Data|0xF2;
  61.                 else if(key8==1) Key_Data=Key_Data|0xF1;
  62.                 else Key_Data=Key_Data|0xF0;
  63.         }
  64. }

  65. u8 Key_Scan() //按键扫描函数
  66. {
  67.                  u8 num=16;  //这里一定要先赋个用不到的值
  68.      u8 Key_x;
  69.             Key_assignment(1); //状态 0 ,此时按键没有按下的话是 0x0f
  70.            delay_us(100);   //短延时
  71.            if(Key_Data!=0xF0) //只要是按键按下,就会使得 Key_Data!=0x0f
  72.                  {
  73.                                 Key_flag=1; //有按键按下,标志位置1                        
  74.                           Key_x=Key_Data;//将此时的键值赋值
  75.                                  Key_assignment(0); //切换状态 1
  76.                                  delay_us(100);  //短延时一下
  77.                                  Key_Data=Key_Data&Key_x;  //两个数据按位与,就会产生独一无二的数据
  78.         
  79. //当前情况下的键值        ,十六进制数据
  80. //   88 48 28 18    →            7          8          9           12(add)
  81. //   84 44 24 14    →            4          5          6           13(sub)
  82. //   82 42 22 12    →            1          2          3           14(enter)
  83. //         81 41 21 11           →    10(xx) 0   11(yy) 15(back)
  84.                                   switch(Key_Data)
  85.                                    {
  86.                                      case 0x11 : num=back;   break;
  87.                                      case 0x12 : num=enter;  break;
  88.                                      case 0x14 : num=sub;   break;
  89.                                      case 0x18 : num=add;  break;
  90.                
  91.                                      case 0x21 : num=yy;   break;
  92.                                      case 0x22 : num=3;   break;
  93.                                      case 0x24 : num=6;   break;
  94.                                      case 0x28 : num=9;  break;
  95.                
  96.                                      case 0x41 : num=0;   break;
  97.                                      case 0x42 : num=2;   break;
  98.                                      case 0x44 : num=5;   break;
  99.                                      case 0x48 : num=8;  break;
  100.                
  101.                                      case 0x81 : num=xx;  break;
  102.                                      case 0x82 : num=1;   break;
  103.                                      case 0x84 : num=4;  break;
  104.                                      case 0x88 : num=7;  break;
  105.                                    }
  106.                                 Key_assignment(0);
  107.                                 while(Key_Data!=0x0f)//松手检测
  108.                                 {
  109.                                 Key_assignment(0);
  110.                                 }
  111.            }
  112.          return num;
  113. }

  114. void key_LowOutPutConfig(void)
  115. {
  116.         GPIO_InitTypeDef GPIO_InitStructure;
  117.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入
  118.         GPIO_InitStructure.GPIO_Pin =C1_pin;
  119.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  120.         GPIO_Init(C1_port, &GPIO_InitStructure);
  121.         
  122.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入
  123.         GPIO_InitStructure.GPIO_Pin =C2_pin;
  124.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  125.         GPIO_Init(C2_port, &GPIO_InitStructure);
  126.         
  127.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入
  128.         GPIO_InitStructure.GPIO_Pin =C3_pin;
  129.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  130.         GPIO_Init(C3_port, &GPIO_InitStructure);
  131.         
  132.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入
  133.         GPIO_InitStructure.GPIO_Pin =C4_pin;
  134.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  135.         GPIO_Init(C4_port, &GPIO_InitStructure);
  136.         
  137.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  138.         GPIO_InitStructure.GPIO_Pin =R1_pin;
  139.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  140.         GPIO_Init(R1_port, &GPIO_InitStructure);

  141.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出  
  142.         GPIO_InitStructure.GPIO_Pin =R2_pin;
  143.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  144.         GPIO_Init(R2_port, &GPIO_InitStructure);

  145.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出  
  146.         GPIO_InitStructure.GPIO_Pin =R3_pin;
  147.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  148.         GPIO_Init(R3_port, &GPIO_InitStructure);

  149.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出  
  150.         GPIO_InitStructure.GPIO_Pin =R4_pin;
  151.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  152.         GPIO_Init(R4_port, &GPIO_InitStructure);
  153. }
  154. void key_HighOutPutConfig(void)
  155. {
  156.         GPIO_InitTypeDef GPIO_InitStructure;
  157.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  158.         GPIO_InitStructure.GPIO_Pin =C1_pin;
  159.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  160.         GPIO_Init(C1_port, &GPIO_InitStructure);

  161.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  162.         GPIO_InitStructure.GPIO_Pin =C2_pin;
  163.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  164.         GPIO_Init(C2_port, &GPIO_InitStructure);

  165.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  166.         GPIO_InitStructure.GPIO_Pin =C3_pin;
  167.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  168.         GPIO_Init(C3_port, &GPIO_InitStructure);

  169.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  170.         GPIO_InitStructure.GPIO_Pin =C4_pin;
  171.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  172.         GPIO_Init(C4_port, &GPIO_InitStructure);

  173.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入
  174.         GPIO_InitStructure.GPIO_Pin =R1_pin;
  175.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  176.         GPIO_Init(R1_port, &GPIO_InitStructure);

  177.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入  
  178.         GPIO_InitStructure.GPIO_Pin =R2_pin;
  179.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  180.         GPIO_Init(R2_port, &GPIO_InitStructure);

  181.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入  
  182.         GPIO_InitStructure.GPIO_Pin =R3_pin;
  183.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  184.         GPIO_Init(R3_port, &GPIO_InitStructure);

  185.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;        //下拉输入  
  186.         GPIO_InitStructure.GPIO_Pin =R4_pin;
  187.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  188.         GPIO_Init(R4_port, &GPIO_InitStructure);
  189. }
复制代码

这个是我仿真使用的矩阵键盘

这个是我仿真使用的矩阵键盘
矩阵2.png
回复

使用道具 举报

ID:712097 发表于 2024-4-7 17:08 | 显示全部楼层
感觉一模一样啊,不用改。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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