找回密码
 立即注册
查看: 620|回复: 15

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

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

按键.bmp
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5454

积分

版主

积分
5454
发表于 2024-11-22 16:54:45 | 显示全部楼层
类似的,替换其中的内容即可实现不同IO集合到一起

  1. //将键盘IO集合为一个8位数据
  2. void Set_Key(unsigned char Dat)
  3. {
  4.         P30 = (Dat>>0)&1;
  5.         P31 = (Dat>>1)&1;
  6.         P32 = (Dat>>2)&1;
  7.         P33 = (Dat>>3)&1;
  8.         P34 = (Dat>>4)&1;
  9.         P35 = (Dat>>5)&1;
  10.         P42 = (Dat>>6)&1;
  11.         P44 = (Dat>>7)&1;
  12. }
  13. unsigned char Get_Key(void)
  14. {
  15.         unsigned char Dat;
  16.         Dat = ((P44?1:0)<<7)|((P42?1:0)<<6)|((P35?1:0)<<5)|((P34?1:0)<<4)|
  17.                                 ((P33?1:0)<<3)|((P32?1:0)<<2)|((P31?1:0)<<1)|((P30?1:0)<<0);
  18.         return Dat;
  19. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-02 03:42:37

22

主题

283

回帖

905

积分

高级会员

积分
905
发表于 2024-11-22 17:00:40 来自手机 | 显示全部楼层
dat = (P0 & 0XE0) |  (P15 << 4));
dat >>= 4;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 2024-11-22 17:05:41 | 显示全部楼层
王*** 发表于 2024-11-22 16:54
类似的,替换其中的内容即可实现不同IO集合到一起

感谢版主!我的C语言不过关!没想到这样组合!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 2024-11-22 17:06:36 | 显示全部楼层
邮*** 发表于 2024-11-22 17:00
dat = (P0 & 0XE0) |  (P15 >= 4;

非常感谢!原来是这样组合的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 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这种方式我原来也是用的你这种方式就是不行。

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2024-11-22 17:33:34 | 显示全部楼层
邮*** 发表于 2024-11-22 17:00
dat = (P0 & 0XE0) |  (P15 >= 4;

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-02 03:42:37

22

主题

283

回帖

905

积分

高级会员

积分
905
发表于 2024-11-22 18:04:46 来自手机 | 显示全部楼层
soma 发表于 2024-11-22 17:33
dat = (P0 & 0XE0) |  (P15

(u8)P15 应该可以
REMOVEUNUSED
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-02 03:42:37

22

主题

283

回帖

905

积分

高级会员

积分
905
发表于 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


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

REMOVEUNUSED
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-05-01 20:05:32

21

主题

168

回帖

1469

积分

金牌会员

积分
1469
发表于 2024-11-23 07:58:49 | 显示全部楼层
王*** 发表于 2024-11-22 16:54
类似的,替换其中的内容即可实现不同IO集合到一起

版主的程序好用,矩阵按键的万能程序,可以根据实际情况接任何IO口,谢谢分享!有你更上一层楼
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 13:17 , Processed in 0.144119 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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