打印

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

[复制链接]
1099|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzcook|  楼主 | 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

相关帖子

沙发
fengfeng的恒| | 2018-6-13 11:42 | 只看该作者
用逐行扫描的方式吧,移植性也好一点,不依赖特定一组IO。赋值的时候一个个来就好了。

使用特权

评论回复
板凳
ayb_ice| | 2018-6-13 11:52 | 只看该作者
这有什么关系,就是麻烦点而已

使用特权

评论回复
地板
yzcook|  楼主 | 2018-6-13 11:56 | 只看该作者
fengfeng的恒 发表于 2018-6-13 11:42
用逐行扫描的方式吧,移植性也好一点,不依赖特定一组IO。赋值的时候一个个来就好了。 ...

逐行的我已经完成了一个 。但是产品运用到的有些地方  逐行的解决不了。

使用特权

评论回复
5
yzcook|  楼主 | 2018-6-13 13:01 | 只看该作者
ayb_ice 发表于 2018-6-13 11:52
这有什么关系,就是麻烦点而已

能否告诉下怎么解决

使用特权

评论回复
6
ayb_ice| | 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);
        }
        ....
       
}

使用特权

评论回复
7
yzcook|  楼主 | 2018-6-13 13:18 | 只看该作者
ayb_ice 发表于 2018-6-13 13:13
写几个函数就可以了

#define u8 unsigned char

谢谢 我琢磨一下

使用特权

评论回复
8
ayb_ice| | 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;
}

使用特权

评论回复
9
h286288986| | 2018-6-13 21:36 | 只看该作者
转变下思维,逐行扫描,可以做成通用函数,以后只改引脚定义就是

使用特权

评论回复
10
qinlu123| | 2018-6-14 16:11 | 只看该作者
需要我共享一个吗

使用特权

评论回复
11
yzcook|  楼主 | 2018-6-15 13:31 | 只看该作者
qinlu123 发表于 2018-6-14 16:11
需要我共享一个吗

有的话 麻烦了 谢谢

使用特权

评论回复
12
qinlu123| | 2018-6-16 09:10 | 只看该作者
yzcook 发表于 2018-6-15 13:31
有的话 麻烦了 谢谢

Key_Test-V2.0.rar (5.2 MB)
虽然这个是stm32的但是换汤不换药,用法都是一样的。


使用特权

评论回复
13
一路向北lm| | 2018-6-17 10:40 | 只看该作者
逐行扫描或者逐列扫描,也可以使用ADC按键,硬件比较简单

使用特权

评论回复
14
lxa0| | 2018-6-17 15:25 | 只看该作者
将那几个键组成一个字节
就容易写代码了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

84

帖子

0

粉丝