找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请问下这段单片机按键函数什么意思?

[复制链接]
跳转到指定楼层
楼主
ID:508795 发表于 2019-4-10 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "key_m.h"


//函数声明        
unsigned char Key_Map(unsigned char _key);
#if KEYVALUE_MIR_123A
unsigned char KEY_Mir_123A(unsigned char _key);
#endif
#if KEYVALUE_MIR_ABCD
unsigned char KEY_Mir_ABCD(unsigned char _key);
#endif
#if KEYVALUE_ROT_CW90
unsigned char KEY_Rot_CW90(unsigned char _key);
#endif


//------------------------------------------------
// 函数介绍: 扫描矩阵键盘,并返回按键值
// 输入参数: mode:0不支持连续按键;1支持连按
// 返 回 值: 0无按键,其他有对应按键按下
// 修订版本:V1.1
//------------------------------------------------
unsigned char KeyScan(bit mode)
{
        unsigned char KeyValue = 0;
    static bit key_up = 1;
        char a = 0;
        GPIO_KEY=0x0f;//P1.7|P1.6|P1.5|P1.4拉低
        if((GPIO_KEY!=0x0f)&&key_up)//读取按键是否按下
        {
                key_up = mode;
        delay_ms(10);//延时10ms进行消抖
                if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
                {                        
                        //测试列
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0x80;break;
                                case(0X0b):        KeyValue=0x40;break;
                                case(0X0d): KeyValue=0x20;break;
                                case(0X0e):        KeyValue=0x10;break;
                        }
                        //测试行
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue+0x08;break;
                                case(0Xb0):        KeyValue=KeyValue+0x04;break;
                                case(0Xd0): KeyValue=KeyValue+0x02;break;
                                case(0Xe0):        KeyValue=KeyValue+0x01;break;
                        }
                }
        }
    else if(GPIO_KEY==0x0f)//按键松手检测
    {
        key_up = 1;
    }
          //以上返回为16进制行列值(1,2,4,8)X(1,2,4,8)
    KeyValue = Key_Map(KeyValue); //返回字符按键值


//对于按键的镜像和旋转都可以用这3个函数组合而实现   
#if KEYVALUE_MIR_123A
        KeyValue = KEY_Mir_123A(KeyValue);
#endif
#if KEYVALUE_MIR_ABCD
        KeyValue = KEY_Mir_ABCD(KeyValue);
#endif
#if KEYVALUE_ROT_CW90
    KeyValue = KEY_Rot_CW90(KeyValue);
#endif


    return KeyValue;

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

使用道具 举报

沙发
ID:508795 发表于 2019-4-10 15:17 | 只看该作者
KEY_M.H

当前版本V1.4

按键分布:
P14 P15 P16 P17
  |   |   |   |
--1---2---3---A--P10
  |   |   |   |
--4---5---6---B--P11
  |   |   |   |
--7---8---9---C--P12
  |   |   |   |  
--*---0---#---D--P13
  |   |   |   |
  
矩阵键盘扫描函数
返回值为位行列位置,如0x14位第1行第2列按键按下;
如果为0则无按键按下

可以配置按键值重映射为字符‘0’,‘1’,‘2’,,,‘D’
#define KEYVALUE_REMAPE 1

如果分布不正确,可以定义旋转和镜像分布


Copyright (c) 2017-2027 Quan's technology, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef _KEY_M_H_
#define _KEY_M_H_
#include <reg52.h>
#include "delay.h"

//如果使用按键重映射,定义为非0
//无按键事件返回值为数值0x00
#define KEYVALUE_MIR_123A 1 //123A方向镜像分布
#define KEYVALUE_MIR_ABCD 0        //ABCD方向镜像分布
#define KEYVALUE_ROT_CW90 1        //顺时针旋转90度



//--定义使用的IO口--//       
#define GPIO_KEY P1

//矩阵键盘扫描函数
unsigned char KeyScan(bit mode);

#endif

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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