找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1809|回复: 0
收起左侧

怎么改这个STM32矩阵按键程序的IO口

[复制链接]
ID:405123 发表于 2019-12-12 09:03 | 显示全部楼层 |阅读模式
1黑币
程序实在论坛下的 不过发现只会用 改了IO口就用不了了  有没有大佬能帮帮我怎么改  最好能写下备注 让我学习下怎么修改 附件放上。。。

/*************************************************本程序特点**********************************************************/
/* 1.连按与非连按:定义静态变量使得连按标志仅在本程序内有效。工作原理:初次进入键盘
扫描函数,将连按标志置一,即初次按下;当有键按下的时候,会进入扫描函数,在扫描函数内
将标志位挂起,即按键已按下;当程序执行完此次扫描,下次进入的时候,首先判断连按标志位
与键盘是否按下,如果按下了,但连按标志位是挂起的,那不进入此函数。接下来判断键盘是否
处于释放状态,如果键盘是释放的,则将标志位放下。否则,仍将标志位挂起。
2.端口的初始化,端口首先需要两种端口,一种是推完输出,另一种是上拉输入(没有信号时电平
为高),首先将输出置低,如果有键按下,会得到相应的列的位置,近而分别置低相应的行,从
而得到按下的按键所在的行。
3.本程序略显麻烦,但经过验证,完全可用。在写此程序时,网上有另一种方法,即不断改变端口
的模式,判断列时如此程序,接下来将两种端口的模式换过来,将相应的列置低作为输出,判断
相应行的位置,由是得到位置坐标,通过公式换算即可,如对程序实时性要求较高,可尝试此方
法。
*/

/*************************************************心得体会**************************************************************/
/* 1.使用if语句时一定要注意语句间的联系,如同本程序,键盘扫描需要依次将各个行线置低,并不
是分别将行线置低。
2.熟悉输入输出方式,对不必要的端口置位复位进行取消,省略,以简化程序。
3.switch 语句在使用时,一定要注意break的使用,所以在写程序时,尤其像此类程序,可以套用
复制粘贴的,首先确保最初的程序一定要没有基本错误。
4.有空的时候将变量标准化,利用define使代码简化易读易改
*/

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

  3. //从高(H)1---低(L)4接的            
  4. //按键初始化函数
  5. //PA15和PC5 设置成输入
  6. void KEY_Init(void)
  7. {
  8.         
  9.         GPIO_InitTypeDef GPIO_InitStructure;

  10.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟
  11.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//PA 0 1 2 3  H
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出
  13.          GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
  14.         
  15.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//PA 4 5 6 7  L
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  17.          GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
  18.         
  19. }
  20. //按键处理函数


  21. void BIXU(void)
  22. {
  23. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);        
  24. }


  25. int key_scan(void)
  26. {
  27.         static u8 key_up=1;
  28.         int key_num=0;
  29.         u8 temp=0;                                                                //判断列的数据缓存区
  30.         u8 temp1=0;                                                                //判断行的数据缓存区
  31.         GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);                        //拉低行线
  32.         delay_us(10);
  33.         temp=GPIO_ReadInputData(GPIOA)&0xff;                                //读出A的数据寄存器的值   ***0xff表示选择低8(0~7)位  写的话用或。读就要用与 获取高8位则将&0xff改成&0xff00
  34.         delay_us(1);
  35.         if (key_up&&(temp != 0xf0))                                                        //判断键是否按下与是否连按     ***0xf0表示获得4~7位
  36.         {
  37.                 delay_ms(10);                                                //消抖
  38.                 key_up=0;                                                        //当有键按下时,将连按标志位挂起   屏蔽这一段为连按 太快把延时加长
  39.                 temp = GPIO_ReadInputData(GPIOA)&0xff;                        //消抖后重新得到A的值
  40.                 if(temp != 0xf0)
  41.                 {                        
  42.                         switch(temp)                                                                //进入键盘按下的相应行线
  43.                         {
  44.                                 case 0xe0:
  45.                                 {
  46.                                        
  47.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);                //依次从第一行拉低到第四行,读出A的数据,从而判断
  48.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_0);                                                                                //是哪一行的键盘按下,从而给出相应的键值
  49.                                         delay_us(10);
  50.                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  51.                                         if (temp1==0xee)
  52.                                                 key_num=13;
  53.                                         else
  54.                                         {
  55.                                                 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  56.                                                 GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  57.                                                 delay_us(1);
  58.                                                 temp1=GPIO_ReadInputData(GPIOA)&0xff;
  59.                                        
  60.                                                 if (temp1==0xed)
  61.                                                         key_num=9;
  62.                                                 else
  63.                                                 {
  64.                                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  65.                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  66.                                                         delay_us(1);
  67.                                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  68.                                                 
  69.                                                         if (temp1==0xeb)
  70.                                                                 key_num=5;
  71.                                                         else
  72.                                                                 key_num=1;
  73.                                                 }
  74.                                         }
  75.                                 }
  76.                                 break;
  77.                                 case 0xd0:
  78.                                 {
  79.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  80.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  81.                                         delay_us(1);
  82.                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  83.                                         if (temp1==0xde)
  84.                                                 key_num=14;
  85.                                         else
  86.                                         {
  87.                                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  88.                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  89.                                                         delay_us(1);
  90.                                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  91.                                                 
  92.                                                         if (temp1==0xdd)
  93.                                                                 key_num=10;
  94.                                                         else
  95.                                                         {
  96.                                                                 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  97.                                                                 GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  98.                                                                 delay_us(1);
  99.                                                                 temp1=GPIO_ReadInputData(GPIOA)&0xff;
  100.                                                         
  101.                                                                 if (temp1==0xdb)
  102.                                                                         key_num=6;
  103.                                                                 else
  104.                                                                         key_num=2;
  105.                                                         }
  106.                                         }
  107.                                 }
  108.                                 break;
  109.                                 case 0xb0:
  110.                                 {
  111.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  112.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  113.                                         delay_us(1);
  114.                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  115.                                         if (temp1==0xbe)
  116.                                                 key_num=15;
  117.                                         else
  118.                                         {
  119.                                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  120.                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  121.                                                         delay_us(1);
  122.                                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  123.                                                 
  124.                                                         if (temp1==0xbd)
  125.                                                                 key_num=11;
  126.                                                         else
  127.                                                         {
  128.                                                                 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  129.                                                                 GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  130.                                                                 delay_us(1);
  131.                                                                 temp1=GPIO_ReadInputData(GPIOA)&0xff;
  132.                                                         
  133.                                                                 if (temp1==0xbb)
  134.                                                                         key_num=7;
  135.                                                                 else
  136.                                                                         key_num=3;
  137.                                                         }
  138.                                         }
  139.                                 }
  140.                                 break;
  141.                                 case 0x70:
  142.                                 {
  143.                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  144.                                         GPIO_ResetBits(GPIOA,GPIO_Pin_0);
  145.                                         delay_us(1);
  146.                                         temp1=(GPIO_ReadInputData(GPIOA)&0xff);
  147.                                         if (temp1==0x7e)
  148.                                                 key_num=16;
  149.                                         else
  150.                                         {
  151.                                                 GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  152.                                                 GPIO_ResetBits(GPIOA,GPIO_Pin_1);
  153.                                                 delay_us(1);
  154.                                                 temp1=GPIO_ReadInputData(GPIOA)&0xff;
  155.                                        
  156.                                                 if (temp1==0x7d)
  157.                                                         key_num=12;
  158.                                                 else
  159.                                                 {
  160.                                                         GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0);
  161.                                                         GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  162.                                                         delay_us(1);
  163.                                                         temp1=GPIO_ReadInputData(GPIOA)&0xff;
  164.                                                 
  165.                                                         if (temp1==0x7b)
  166.                                                                 key_num=8;
  167.                                                         else
  168.                                                                 key_num=4;
  169.                                                 }
  170.                                         }
  171.                                 }
  172.                                 break;
  173.                                 default :return 0;
  174.                         }               
  175.                 }
  176.         }
  177.         else if(temp == 0xf0)
  178.         {                                                                                                //当没有键按下后,将连按标志复位
  179.                 key_up=1;
  180.         }
  181.         return key_num;        
  182. }

复制代码

全部资料51hei下载地址:
完整.zip (2.48 KB, 下载次数: 8)

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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