keephot99 2023-11-20 22:11 采纳率: 0%
浏览 4

51单片机使用矩阵键盘控制led,不可以实现多个控制

51单片机用矩阵键盘,一个按键对应一个按键,但是使用我下面的这个代码确只能实现一个按键控制一个led。例如按下一个按键时,对应的led灭了,但是按住第一个按键,再按另一个按键时,却不能让另一个led同时灭。


#include <REGX52.H>
#include <delay.h>
void main()
{    
    while(1)
    {
        P2=0x00;
        P1=0xff;
    P1_3=0;
    while(P1_7==0){P2_0=1;}
    while(P1_6==0){P2_4=1;}
        P2=0x00;
        P1=0xff;
    P1_2=0;
    while(P1_7==0){P2_1=1;}
    while(P1_6==0){P2_5=1;}
            P2=0x00;
        P1=0xff;
    P1_1=0;
    while(P1_7==0){P2_2=1;}
    while(P1_6==0){P2_6=1;}
        P2=0x00;
        P1=0xff;
    P1_0=0;
    while(P1_7==0){P2_3=1;}
    while(P1_6==0){P2_7=1;}

    }
}
  • 写回答

2条回答 默认 最新

  • qllaoda 2023-11-21 09:12
    关注

    因为while(P1_7==0)这样的语句会阻塞流程,导致后面的语句暂时无法运行。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-21 08:44
    关注

    【相关推荐】



    • 你可以看下这个问题的回答https://ask.csdn.net/questions/29759
    • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:嵌入式设计 | 基于51单片机,用六位数码管做一个时钟
    • 除此之外, 这篇博客: 按键实现led左右移动中的 51单片机通过独立按键实现led左右移动 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
      #include "reg52.h"  //定义一些特殊功能寄存器
      typedef unsigned int u16;
      typedef unsigned char u8;
      sbit k1=P3^1;  
      sbit k2=P3^0;	   //位定义
       u8 n=0;
      u8 code a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //1-8 led 点亮数组
      /****************************************************
      * 函数名   :delay
      * 函数功能  :延时(i等于1时,大约延时1ms)
      ****************************************************/
      void delay(u16 i)	
      {
       while(i--);
      }
      /****************************************************
      * 函数名   :keypros
      * 函数功能  :检测按键
      ****************************************************/
      void keypros()	   
      {	if(k1==0)		 
          {
      	  delay(1000);	   //消抖
      	  if(k1==0)
      	 {  n++;
      		if(n>=7)
      		n=7;	  }
      	   while(!k1);
      	}
      
      	if(k2==0)
          {
      	  delay(1000);	     //消抖
      	  if(k2==0)
      	 {  n--;
      	   if(n<=0)
      	   n=0;}
      	   while(!k2);
      	}
      
      
      
      }
      void main()
      { 
       while(1)
       { P2=a[n];			  //调用数组,点亮流水灯
         keypros();		   //调用按键函数,改变n值
       }
      
      }
      

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月20日

悬赏问题

  • ¥15 字符串的比较老是报错
  • ¥15 很简单的c#代码补全
  • ¥15 复杂表达式求值程序里的函数优先级问题
  • ¥15 求密码学的客成社记ji着用
  • ¥35 POI导入树状结构excle
  • ¥15 初学者c语言题目解答
  • ¥15 div editable中的光标问题
  • ¥15 mysql报错1415Not allowed to return a result set from a trigger 不知如何修改
  • ¥60 Python输出Excel数据整理,算法较为复杂
  • ¥15 回答几个问题 关于数据库