Tuier 发表于 2024-11-22 16:39:21

不在一组IO口的矩阵按键扫描程序C语言如何处理?

在同一组IO口做4x4矩阵按键,网上扫描程序很多,也很经典。但是行线、列线不在同一组IO口,甚至比较分散的IO口进行编程网上很少.最近用STC8H4K64TL做试验,由于完整的P2口和P4口均被数码管占用,只能用其它不连续的IO作为4X4矩阵按键,自己琢磨了很久还是不得其法,特发帖求助各位大佬,谢谢!

王昱顺 发表于 2024-11-22 16:54:45

类似的,替换其中的内容即可实现不同IO集合到一起

//将键盘IO集合为一个8位数据
void Set_Key(unsigned char Dat)
{
        P30 = (Dat>>0)&1;
        P31 = (Dat>>1)&1;
        P32 = (Dat>>2)&1;
        P33 = (Dat>>3)&1;
        P34 = (Dat>>4)&1;
        P35 = (Dat>>5)&1;
        P42 = (Dat>>6)&1;
        P44 = (Dat>>7)&1;
}

unsigned char Get_Key(void)
{
        unsigned char Dat;
        Dat = ((P44?1:0)<<7)|((P42?1:0)<<6)|((P35?1:0)<<5)|((P34?1:0)<<4)|
                                ((P33?1:0)<<3)|((P32?1:0)<<2)|((P31?1:0)<<1)|((P30?1:0)<<0);
        return Dat;
}

邮箱 发表于 2024-11-22 17:00:40

dat = (P0 & 0XE0) |(P15 << 4));
dat >>= 4;

Tuier 发表于 2024-11-22 17:05:41

王昱顺 发表于 2024-11-22 16:54
类似的,替换其中的内容即可实现不同IO集合到一起

感谢版主!我的C语言不过关!没想到这样组合!

Tuier 发表于 2024-11-22 17:06:36

邮箱 发表于 2024-11-22 17:00
dat = (P0 & 0XE0) |(P15 >= 4;

非常感谢!原来是这样组合的{:4_167:}

Tuier 发表于 2024-11-22 17:17:00

本帖最后由 Tuier 于 2024-11-22 17:46 编辑

邮箱 发表于 2024-11-22 17:00
dat = (P0 & 0XE0) |(P15 >= 4;
unsigned char hex_num;      
hex_num=(P0&0XE0)|(P15<<4);

编译通不过?
提示:main.c(146): error C193: '<<': bad operand type。不能用P15<<4这种方式{:4_167:}我原来也是用的你这种方式就是不行。

dat=(P07<<7)|(P06<<6)|(P05<<5)|(P15<<4),这种方式失败了!编译通不过!

soma 发表于 2024-11-22 17:33:34

邮箱 发表于 2024-11-22 17:00
dat = (P0 & 0XE0) |(P15 >= 4;

dat = (P0 & 0XE0) |(P15 << 4));
这个不对吧P15是bit怎么可以移4位?

邮箱 发表于 2024-11-22 18:04:46

soma 发表于 2024-11-22 17:33
dat = (P0 & 0XE0) |(P15

(u8)P15 应该可以

邮箱 发表于 2024-11-22 18:06:11

本帖最后由 邮箱 于 2024-11-22 18:30 编辑

Tuier 发表于 2024-11-22 17:17
unsigned char hex_num;      
hex_num=(P0&0XE0)|(P15

我回复前面的错了,看一楼的

Tuier 发表于 2024-11-23 07:58:49

王昱顺 发表于 2024-11-22 16:54
类似的,替换其中的内容即可实现不同IO集合到一起

版主的程序好用,矩阵按键的万能程序,可以根据实际情况接任何IO口,谢谢分享!有你更上一层楼{:4_250:}
页: [1] 2
查看完整版本: 不在一组IO口的矩阵按键扫描程序C语言如何处理?