求助一下大佬。关于不同管脚矩阵键盘

[复制链接]
282|13
 楼主 | 2018-6-13 11:14 | 显示全部楼层 |阅读模式
在做一个3x4矩阵键盘,但是硬件上面他是在不同管脚控制的,不像普遍的将P1 或者P1整组IO口作为按键的数据口  

现在是这样不同的管脚
sbit X1 = P3^4;
sbit X2 = P3^5;
sbit X3 = P2^7;

sbit Y1 = P1^6;
sbit Y2 = P1^7;
sbit Y3 = P3^2;
sbit Y4 = P3^3;
请问要怎么才能像整组P1口那样赋值。比如 给0xff   P1.6 P1.7 P3.2 P3.4 P6.5 P2.7 P3.3的值就会等于1111 1111
| 2018-6-13 11:42 | 显示全部楼层
用逐行扫描的方式吧,移植性也好一点,不依赖特定一组IO。赋值的时候一个个来就好了。
| 2018-6-13 11:52 | 显示全部楼层
这有什么关系,就是麻烦点而已
 楼主 | 2018-6-13 11:56 | 显示全部楼层
fengfeng的恒 发表于 2018-6-13 11:42
用逐行扫描的方式吧,移植性也好一点,不依赖特定一组IO。赋值的时候一个个来就好了。 ...

逐行的我已经完成了一个 。但是产品运用到的有些地方  逐行的解决不了。
 楼主 | 2018-6-13 13:01 | 显示全部楼层
ayb_ice 发表于 2018-6-13 11:52
这有什么关系,就是麻烦点而已

能否告诉下怎么解决
| 2018-6-13 13:13 | 显示全部楼层
yzcook 发表于 2018-6-13 13:01
能否告诉下怎么解决

写几个函数就可以了

#define u8 unsigned char
#define BIT(x)        (1<<(x))

void SetGpio(u8 ucPotr, u8 ucMask)
{
        if (ucPotr == 0)
        {
                P0 |= ucMask;
        }
        else
                ...
}

void ClrGpio(u8 ucPotr, u8 ucMask)
{
        if (ucPotr == 0)
        {
                P0 &= ~ucMask;
        }
        else
                ...
}


u8 GetGpio(u8 ucPotr, u8 ucMask)
{
        if (ucPotr == 0)
        {
                return (P0 & ucMask);
        }
        else
                ...
}

// sbit X1 = P3^4;
// sbit X2 = P3^5;
// sbit X3 = P2^7;

// sbit Y1 = P1^6;
// sbit Y2 = P1^7;
// sbit Y3 = P3^2;
// sbit Y4 = P3^3;

#define X1        3,BIT(4)
#define X2        3,BIT(5)
#define X3        2,BIT(7)
#define Y1        1,BIT(6)
#define Y2        1,BIT(7)
#define Y3        3,BIT(2)
#define Y4        3,BIT(3)


void KeyScan(void)
{
        u8 ucTmp = 0;
       
        SetGpio(X1);
        SetGpio(X2);
        SetGpio(X3);
       
        ClrGpio(Y1);
        ClrGpio(Y2);
        ClrGpio(Y3);
        ClrGpio(Y4);
       
        if (!GetGpio(X1))
        {
                ucTmp |= BIT(0);
        }
        if (!GetGpio(X2))
        {
                ucTmp |= BIT(1);
        }
        ....
       
}
 楼主 | 2018-6-13 13:18 | 显示全部楼层
ayb_ice 发表于 2018-6-13 13:13
写几个函数就可以了

#define u8 unsigned char

谢谢 我琢磨一下
| 2018-6-13 13:19 | 显示全部楼层
本帖最后由 ayb_ice 于 2018-6-13 13:29 编辑
yzcook 发表于 2018-6-13 13:01
能否告诉下怎么解决

void SetGpio(u8 ucMask)
{
        //X1=P34
        P34 = (ucMask & BIT0);
        ...
}

u8 GetGpio(void)
{
        u8 ucTmp = 0;
       
        if (P34)
        {
                ucTmp |= BIT(0);
        }
        ....
       
        return ucTmp;
}
| 2018-6-13 21:36 | 显示全部楼层
转变下思维,逐行扫描,可以做成通用函数,以后只改引脚定义就是
| 2018-6-14 16:11 | 显示全部楼层
需要我共享一个吗
 楼主 | 2018-6-15 13:31 | 显示全部楼层
qinlu123 发表于 2018-6-14 16:11
需要我共享一个吗

有的话 麻烦了 谢谢
| 2018-6-16 09:10 | 显示全部楼层
yzcook 发表于 2018-6-15 13:31
有的话 麻烦了 谢谢


虽然这个是stm32的但是换汤不换药,用法都是一样的。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-6-17 10:40 | 显示全部楼层
逐行扫描或者逐列扫描,也可以使用ADC按键,硬件比较简单
| 2018-6-17 15:25 | 显示全部楼层
将那几个键组成一个字节
就容易写代码了
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /4 下一条

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