找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 708|回复: 15
收起左侧

请教16个独立按键控制16个LED灯互锁功能程序

[复制链接]
ID:384552 发表于 2024-6-23 14:16 | 显示全部楼层 |阅读模式
请教按图,16个独立按键控制16个LED灯,实现互锁功能,按下K1按键后放开LED1点亮,按下K2按键后放开LED2点亮LED1熄灭,按下任意一个按键对应的LED灯点亮,原先点亮的LED熄灭的功能程序怎么写,小白一个,辛苦了

互锁.PNG
回复

使用道具 举报

ID:161164 发表于 2024-6-23 15:17 | 显示全部楼层
  1. #include <reg52.h>
  2. bit lock = 0;
  3. void main()
  4. {
  5.     while (1)
  6.     {
  7.                 if(P1!=0xff || P3!=0xFF)
  8.                 {
  9.                         if(lock==0)
  10.                         {
  11.                                 lock = 1;
  12.                                 P0=P1;
  13.                                 P1=P3;
  14.                         }
  15.                 }else{
  16.                         lock = 0;
  17.                 }
  18.     }
  19. }

复制代码

评分

参与人数 1黑币 +18 收起 理由
QDMLIT + 18

查看全部评分

回复

使用道具 举报

ID:1109793 发表于 2024-6-23 15:30 | 显示全部楼层
所有按键的COM点是悬空的。这怎么搞?
while(1){
if(~P1||~P3){P0=P1;P3=P2;}
}
这样可以不
回复

使用道具 举报

ID:828160 发表于 2024-6-23 15:38 | 显示全部楼层
点亮之前先把所有灯灭了,怎么说就怎么写呀
回复

使用道具 举报

ID:332444 发表于 2024-6-23 19:29 | 显示全部楼层
首先按键公共点要接地才是独立按键电路,控制很简单,P1赋值给P0,P3赋值给P2即可,如P1的1引脚按下为低电平,那么,这时读取P1的值是1,用1赋值给P0即可,余类推。
回复

使用道具 举报

ID:332444 发表于 2024-6-24 09:17 | 显示全部楼层
  1. #include "reg52.h"
  2. void main()
  3. {//缘由http://www.51hei.com/bbs/dpj-236599-1.html
  4.         unsigned char sy=0,my=0,ls=0;
  5.         while(1)
  6.         {
  7.                 if(P1!=255&&++my==0){ls=P1;P0=ls;}
  8.                 if(P3!=255&&++my==0){ls=P3;P2=ls;}
  9.                 if(P1==255&&P3==255)my=0;//按键消抖综合
  10.         }
  11. }
复制代码

评分

参与人数 1黑币 +18 收起 理由
QDMLIT + 18

查看全部评分

回复

使用道具 举报

ID:1109793 发表于 2024-6-24 11:03 | 显示全部楼层
while(1){
if(~P1||~P3){P0=P1;P2=P3;}
}
不好意思,打错了位置了,软件模拟了一下,应该可以达到你要的
回复

使用道具 举报

ID:384552 发表于 2024-6-24 15:35 | 显示全部楼层
xiaobendan001 发表于 2024-6-23 15:30
所有按键的COM点是悬空的。这怎么搞?
while(1){
if(~P1||~P3){P0=P1;P3=P2;}

按键另一端是接地的,图画错了
回复

使用道具 举报

ID:384552 发表于 2024-6-24 15:36 | 显示全部楼层
xianfajushi 发表于 2024-6-23 19:29
首先按键公共点要接地才是独立按键电路,控制很简单,P1赋值给P0,P3赋值给P2即可,如P1的1引脚按下为低电 ...

公共端是接地的,图画错了
回复

使用道具 举报

ID:384552 发表于 2024-6-24 16:18 | 显示全部楼层

非常感谢您的付出,仿真时有个现象,我再前面没有描述明白,P1口按键从K1开始到K8,对应的P0口D1到D8都能实现互锁功能,现象P1.7按键K8按下后对应的P2.7D8点亮,再按P3口按键K9后对应的P2口D9点亮,此时P2.7D8不熄灭,程序怎么改,谢谢。
仿真1.PNG
回复

使用道具 举报

ID:384552 发表于 2024-6-24 22:28 | 显示全部楼层

仿真后发现,按下K9后D8熄灭,D9不亮再按其它按键无反应。我再前面没有描述明白,实验目的是按键从K1开始到K16,对应D1到D16依次互锁功能,不知程序怎么修改,谢谢。
仿真1.PNG
仿真2,按下K9后D8熄灭,D9不亮再按其它按键无反应。.PNG
回复

使用道具 举报

ID:384552 发表于 2024-6-24 23:01 | 显示全部楼层

按你的程序修改了14行IO口定义,仿真通过了。
仿真1.PNG
仿真通过2.PNG
回复

使用道具 举报

ID:161164 发表于 2024-6-24 23:34 | 显示全部楼层
QDMLIT 发表于 2024-6-24 22:28
仿真后发现,按下K9后D8熄灭,D9不亮再按其它按键无反应。我再前面没有描述明白,实验目的是按键从K1开始 ...

我打错了13行,已修正
  1. #include <reg52.h>
  2. bit lock = 0;
  3. void main()
  4. {
  5.     while (1)
  6.     {
  7.                 if(P1!=0xff || P3!=0xFF)
  8.                 {
  9.                         if(lock==0)
  10.                         {
  11.                                 lock = 1;
  12.                                 P0=P1;
  13.                                 P2=P3;
  14.                         }
  15.                 }else{
  16.                         lock = 0;
  17.                 }
  18.     }
  19. }

复制代码
回复

使用道具 举报

ID:332444 发表于 2024-6-25 09:10 | 显示全部楼层
QDMLIT 发表于 2024-6-24 16:18
非常感谢您的付出,仿真时有个现象,我再前面没有描述明白,P1口按键从K1开始到K8,对应的P0口D1到D8都能 ...

简单,把清零添加到对应的地方即可,如:
                if(P1!=255&&++my==0){P2=255;ls=P1;P0=ls;}
                if(P3!=255&&++my==0){P0=255;ls=P3;P2=ls;}
不用就清零,应该想得到,我因为写示例,让学人明白道理即可,其余的该是学人自己理解并灵活应用.
回复

使用道具 举报

ID:332444 发表于 2024-6-25 09:21 | 显示全部楼层
我由于懒得去画电路图,通常回复都是随手拿个电路就可以写示例的,然而,也通常学人不关注自己提问的部分,却常常追问与提问无关的部分,应该看我鼠标指示的地方就是提问有关的部分,其他部分不用关注. 20240625091829.gif



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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