找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1494|回复: 26
收起左侧

3个IO口这样能接6个按键吗?

  [复制链接]
ID:1136941 发表于 2025-1-14 00:39 | 显示全部楼层 |阅读模式
请完善程序

3个IO口接6个按键.pdf

95.02 KB, 下载次数: 0

回复

使用道具 举报

ID:1136941 发表于 2025-1-14 00:49 | 显示全部楼层

有兴趣完善程序
3个IO口接6个按键_1.jpg
回复

使用道具 举报

ID:526108 发表于 2025-1-14 10:28 | 显示全部楼层

什么乱七八糟的,来搞笑的吧
回复

使用道具 举报

ID:1136941 发表于 2025-1-14 10:47 | 显示全部楼层
这样写可以实用吧,消抖用按键并电容,
char key()
{
  B1=1;
  B2=1;
  B3=1;
        if(B1==0)return 1;
else  if(B1==0&&B2==0)return 2;
else  if(B2==0)return 3;
else  if(B2==0&&B3==0)return 4;
else  if(B3==0)return 5;
else  if(B3==0&&B1==0)return 6;
else  return 0;
}
回复

使用道具 举报

ID:1003477 发表于 2025-1-14 13:47 | 显示全部楼层
判断B1、B2、B3的电平高低   b1低且b2、b3高对应sw1,b2低且b1、b3高对应sw3,b3低且b1、b2高对应sw5,b1、b2低且b3高对应sw2......
回复

使用道具 举报

ID:476244 发表于 2025-1-14 14:00 | 显示全部楼层
可以,也可以再接第7个开关同时拉低三个I/O口。
也可以只用3个开关组合使用。
二进制的 000-111 。
回复

使用道具 举报

ID:161164 发表于 2025-1-14 14:46 | 显示全部楼层

  1. sbit Pin_B1 = P3^2;
  2. sbit Pin_B2 = P3^3;
  3. sbit Pin_B3 = P3^4;
  4. u8 KeyVal = 0;//用完清零
  5. void key_Proc()//多键短按,1ms中断内运行
  6. {
  7.         static u8 Delay_XD=0; //消抖计数
  8.         static bit ons = 0;
  9.         if(!Pin_B1 || !Pin_B2 || !Pin_B3)
  10.         {
  11.                 if(++Delay_XD>=20 && !ons) //消抖
  12.                 {
  13.                         ons = 1;
  14.                         if(!Pin_B1 && !Pin_B2)
  15.                         {
  16.                                 KeyVal = SW2;
  17.                         }else if(!Pin_B2 && !Pin_B3)
  18.                         {
  19.                                 KeyVal = SW4;
  20.                         }else if(!Pin_B1 && !Pin_B3)
  21.                         {
  22.                                 KeyVal = SW6;
  23.                         }else{
  24.                                 if(!Pin_B1)
  25.                                 {
  26.                                         KeyVal = SW1;
  27.                                 }
  28.                                 if(!Pin_B2)
  29.                                 {
  30.                                         KeyVal = SW3;
  31.                                 }
  32.                                 if(!Pin_B3
  33.                                 {
  34.                                         KeyVal = SW5;
  35.                                 }                               
  36.                         }
  37.                 }
  38.         }
  39.         else //按键抬起
  40.         {
  41.                 Delay_XD=0; //Delay_XD清0
  42.                 ons = 0;
  43.         }
  44. }
复制代码


回复

使用道具 举报

ID:1143011 发表于 2025-1-14 15:24 | 显示全部楼层
不知道什么原理 ,为何不用ADC口
回复

使用道具 举报

ID:277550 发表于 2025-1-14 15:26 | 显示全部楼层
逻辑像是 3 排列,取2个、和取1个。

这硬件电路没有问题,测试过。
程序中,可以使用扫描,也可以用3个中断、再判断哪个按钮
回复

使用道具 举报

ID:277550 发表于 2025-1-14 15:38 | 显示全部楼层
再加3只二极管,可以7个按钮
回复

使用道具 举报

ID:69038 发表于 2025-1-14 15:49 | 显示全部楼层
逻辑上没啥问题。
但对于现在的MCU来说,意义不大,
6个4148不是钱?
为什么不用AD口来测按键?还能少两个IO。
要知道硬件成本远大于软件成本。
回复

使用道具 举报

ID:446156 发表于 2025-1-14 16:37 | 显示全部楼层
注意按键不要同时按下多个就行
回复

使用道具 举报

ID:1136941 发表于 2025-1-14 16:48 | 显示全部楼层

这样就很完善了,学习了。
回复

使用道具 举报

ID:1109793 发表于 2025-1-14 18:50 | 显示全部楼层
这是都对地接,如果接两个IO之间,是不是还能更多?
回复

使用道具 举报

ID:161164 发表于 2025-1-15 09:44 | 显示全部楼层
太阳雨ZW 发表于 2025-1-14 16:48
这样就很完善了,学习了。

5楼提醒了我,代码可以简化为

  1. sbit Pin_B1 = P3^2;
  2. sbit Pin_B2 = P3^3;
  3. sbit Pin_B3 = P3^4;
  4. u8 KeyVal = 0;//用完清零
  5. void key_Proc()//多键短按,1ms中断内运行
  6. {
  7.         static u8 Delay_XD=0; //消抖计数
  8.         static bit ons = 0;
  9.         u8 KeyTemp = 0;
  10.         if(!Pin_B1)KeyTemp |= 0x01;
  11.         if(!Pin_B2)KeyTemp |= 0x02;
  12.         if(!Pin_B3)KeyTemp |= 0x04;
  13.         if(KeyTemp)
  14.         {
  15.                 if(++Delay_XD>=20 && !ons) //消抖
  16.                 {
  17.                         ons = 1;
  18.                         KeyVal = KeyTemp;
  19.                 }
  20.         }
  21.         else //按键抬起
  22.         {
  23.                 Delay_XD=0; //Delay_XD清0
  24.                 ons = 0;
  25.         }
  26. }
复制代码
回复

使用道具 举报

ID:1136941 发表于 2025-1-15 13:31 | 显示全部楼层
zhuls 发表于 2025-1-14 15:49
逻辑上没啥问题。
但对于现在的MCU来说,意义不大,
6个4148不是钱?

用的是AT89C2051,不带ADC
回复

使用道具 举报

ID:1034262 发表于 2025-1-16 13:17 | 显示全部楼层

3个IO不需要节任何别的零件,可以节6个按键:
IO1、IO2、IO3分别对地接一个按键。
IO1-IO2、IO1-IO3、IO2-IO3接3个按键。
回复

使用道具 举报

ID:264021 发表于 2025-1-16 20:55 | 显示全部楼层
可以,但是那3个I/O必须带ADC功能
回复

使用道具 举报

ID:69038 发表于 2025-1-17 09:16 | 显示全部楼层
太阳雨ZW 发表于 2025-1-15 13:31
用的是AT89C2051,不带ADC

AT89C2051,可以说是史前文物了!
现在哪家上新项目还用这料?
现在新出的20脚MCU,哪个性能配置比不过它?除了固有的库存,全新货还贵的要人命。。
回复

使用道具 举报

ID:1109793 发表于 2025-1-17 09:54 | 显示全部楼层
zhuls 发表于 2025-1-17 09:16
AT89C2051,可以说是史前文物了!
现在哪家上新项目还用这料?
现在新出的20脚MCU,哪个性能配置比不过 ...

我手里还有一点库存呢,你要不?
回复

使用道具 举报

ID:1136941 发表于 2025-1-17 11:01 | 显示全部楼层
zhuls 发表于 2025-1-17 09:16
AT89C2051,可以说是史前文物了!
现在哪家上新项目还用这料?
现在新出的20脚MCU,哪个性能配置比不过 ...

手中还有过去买的几十个,放着浪费了,现在用来做些小制做利用下。
回复

使用道具 举报

ID:1136941 发表于 2025-1-17 11:05 | 显示全部楼层
单片机学习习 发表于 2025-1-16 20:55
可以,但是那3个I/O必须带ADC功能

3个口带ADC,没有搞懂
回复

使用道具 举报

ID:1136941 发表于 2025-1-17 12:15 | 显示全部楼层
devcang 发表于 2025-1-14 15:38
再加3只二极管,可以7个按钮

也可以接10个按键,7个加B1-B2,B2-B3,B1-B3三个。
回复

使用道具 举报

ID:69038 发表于 2025-1-17 14:27 | 显示全部楼层
xiaobendan001 发表于 2025-1-17 09:54
我手里还有一点库存呢,你要不?

我要这东西做什么哎。。。
手里还的几十个8G1K08A的,当时刚出来没多久就买了,放在手里吃灰呢。。
回复

使用道具 举报

ID:69038 发表于 2025-1-17 14:29 | 显示全部楼层
太阳雨ZW 发表于 2025-1-17 11:01
手中还有过去买的几十个,放着浪费了,现在用来做些小制做利用下。

也是哈,就DIY乐呵乐呵,真做项目不要再考虑用它了。
回复

使用道具 举报

ID:584814 发表于 2025-1-20 11:39 | 显示全部楼层
3个IO口这样能接6个按键,是查理复用接法的上限,并不是51单片机能力的上限。
用电阻电压法理论上可以单口无限,实际单口接三五个也很常见。
回复

使用道具 举报

ID:1143230 发表于 2025-1-20 14:02 | 显示全部楼层
也可以
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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