找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2204|回复: 6
收起左侧

单片机C语言while循环为假,为什么一直跳不出去(就是松手确定那里)

[复制链接]
ID:195361 发表于 2020-5-22 22:09 | 显示全部楼层 |阅读模式
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

  char num;
  char  temp;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 keyvalue;
void delay(u16 i)
{
  while(i--);

}

void main()
{         num=0;          P2=0;
        while(1)
        {
          P1=0xfe;
          temp=P1;
          temp=temp&0xf0;
          while(temp!=0xf0)
          {
            delay(500);
                temp=P1; //
                temp= temp&0xf0;
                while(temp!=0xf0)
  {           temp=P1;         //此句非常重要
          switch(temp)
            {
             case 0xee : num=1;
                    break;
                   case 0xde : num=2;
                    break;
                case 0xbe : num=3;
                    break;
                case 0x7e : num=4;
                    break;
            }
                while( temp!=0xf0) //松手确定
                {
                   temp=P1;
                   temp=temp&0xf0;
                }        
                  
                 P0=0;
           P2=smgduan[num];
   }
          }         
                   P1=0xfd;
          temp=P1;
          temp=temp&0xf0;
          while(temp!=0xf0)
          {
            delay(500);
                temp=P1; //
                temp= temp&0xf0;
                while(temp!=0xf0)
  {           temp=P1;         //此句非常重要
          switch(temp)
            {
             case 0xed : num=5;
                    break;
                   case 0xdd : num=6;
                    break;
                case 0xbd : num=7;
                    break;
                case 0x7d : num=8;
                    break;
            }
        /*        while(temp!=0xf0)
                {
                   temp=P1;
                   temp=temp&0xf0;
                }        */
                  
                 P0=0;
           P2=smgduan[num];
   }
          }
          P1=0xfb;
          temp=P1;
          temp=temp&0xf0;
          while(temp!=0xf0)
          {
            delay(500);
                temp=P1; //
                temp= temp&0xf0;
                while(temp!=0xf0)
  {           temp=P1;         //此句非常重要
          switch(temp)
            {
             case 0xeb : num=1;
                    break;
                   case 0xdb : num=2;
                    break;
                case 0xbb : num=3;
                    break;
                case 0x7b : num=4;
                    break;
            }
                while(temp!=0xf0)
                {
                   temp=P1;
                   temp=temp&0xf0;
                }
                  
                  
                 P0=0;
           P2=smgduan[num];
   }
          }
           P1=0xf7;
          temp=P1;
          temp=temp&0xf0;
          while(temp!=0xf0)
          {
            delay(500);
                temp=P1; //
                temp= temp&0xf0;
                while(temp!=0xf0)
  {           temp=P1;         //此句非常重要
          switch(temp)
            {
             case 0xe7 : num=1;
                    break;
                   case 0xd7 : num=2;
                    break;
                case 0xb7 : num=3;
                    break;
                case 0x77 : num=4;
                    break;
            }
                while(temp!=0xf0)
                {
                   temp=P1;
                   temp=temp&0xf0;
                }
                  
                  
                 P0=0;
           P2=smgduan[num];
   }
          }
        }
}


1.jpg
回复

使用道具 举报

ID:235200 发表于 2020-5-23 01:44 | 显示全部楼层
while(temp!=0xf0)不应该嵌套使用
回复

使用道具 举报

ID:420836 发表于 2020-5-23 04:04 | 显示全部楼层
嵌入了许多WHILE条件循环,如果使用IF条件进行替换应加以改进。
回复

使用道具 举报

ID:23064 发表于 2020-5-23 06:10 来自手机 | 显示全部楼层
按键处理不是这样写的,正常来说应该根据IO状态的变化做debounce,不要死等。while(temp!=0xf0)你这个嵌套太多,可以 temp=(P0&0xF0),根据IO前后两次的状态不同来检测
回复

使用道具 举报

ID:213173 发表于 2020-5-23 07:14 | 显示全部楼层
多余语句全部注释掉,只做少量修改,楼主只要逐条语句对比就能明白错在哪里。 无标题.jpg
  1. #include "reg52.h"         //此文件中定义了单片机的一些特殊功能寄存器
  2. typedef unsigned int u16;  //对数据类型进行声明定义
  3. typedef unsigned char u8;
  4. char num;
  5. char  temp;
  6. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  7.                                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//显示0~F的值
  8. u8 keyvalue;
  9. void delay(u16 i)
  10. {
  11.         while(i--);
  12. }

  13. void main()
  14. {
  15.         num=17;
  16. //        P2=0;
  17.         while(1)
  18.         {
  19.                 P1=0xfe;
  20.                 temp=P1;
  21. //                temp=temp&0xf0;
  22.                 if(temp!=0xfe)
  23.                 {
  24.                         delay(500);
  25.                         temp=P1; //
  26. //                        temp= temp&0xf0;
  27. //                        while(temp!=0xf0)
  28. //                        {
  29. //                        temp=P1; //此句非常重要
  30.                         switch(temp)
  31.                         {
  32.                                 case 0xee : num=1;break;
  33.                                 case 0xde : num=2;break;
  34.                                 case 0xbe : num=3;break;
  35.                                 case 0x7e : num=4;break;
  36.                         }
  37.                         while(P1!=0xfe); //松手确定
  38. //                        {
  39. //                                temp=P1;
  40. //                                temp=temp&0xf0;
  41. //                        }        
  42. //                        P0=0;
  43. //                        P2=smgduan[num];
  44. //                        }
  45.                 }         
  46.                 P1=0xfd;
  47.                 temp=P1;
  48. //                temp=temp&0xf0;
  49.                 if(temp!=0xfd)
  50.                 {
  51.                         delay(500);
  52.                         temp=P1; //
  53. //                        temp= temp&0xf0;
  54. //                        while(temp!=0xf0)
  55. //                        {
  56. //                                temp=P1;         //此句非常重要
  57.                         switch(temp)
  58.                         {
  59.                                 case 0xed : num=5;break;
  60.                                 case 0xdd : num=6;break;
  61.                                 case 0xbd : num=7;break;
  62.                                 case 0x7d : num=8;break;
  63.                         }
  64.                         while(P1!=0xfd);
  65. //                        {
  66. //                                temp=P1;
  67. //                                temp=temp&0xf0;
  68. //                        }
  69. //                        P0=0;
  70. //                        P2=smgduan[num];
  71. //                        }
  72.                 }
  73.                 P1=0xfb;
  74.                 temp=P1;
  75. //                temp=temp&0xf0;
  76.                 if(temp!=0xfb)
  77.                 {
  78.                         delay(500);
  79.                         temp=P1; //
  80. //                        temp= temp&0xf0;
  81. //                        while(temp!=0xf0)
  82. //                        {
  83. //                                temp=P1;         //此句非常重要
  84.                         switch(temp)
  85.                         {
  86.                                 case 0xeb : num=9;break;
  87.                                 case 0xdb : num=10;break;
  88.                                 case 0xbb : num=11;break;
  89.                                 case 0x7b : num=12;break;
  90.                         }
  91.                         while(P1!=0xfb);
  92. //                        {
  93. //                                temp=P1;
  94. //                                temp=temp&0xf0;
  95. //                        }
  96. //                        P0=0;
  97. //                        P2=smgduan[num];
  98. //                        }
  99.                 }
  100.                 P1=0xf7;
  101.                 temp=P1;
  102. //                temp=temp&0xf0;
  103.                 if(temp!=0xf7)
  104.                 {
  105.                         delay(500);
  106.                         temp=P1; //
  107. //                        temp=temp&0xf0;
  108. //                        while(temp!=0xf0)
  109. //                        {
  110. //                                temp=P1;         //此句非常重要
  111.                         switch(temp)
  112.                         {
  113.                                 case 0xe7 : num=13;break;
  114.                                 case 0xd7 : num=14;break;
  115.                                 case 0xb7 : num=15;break;
  116.                                 case 0x77 : num=16;break;
  117.                         }
  118.                         while(P1!=0xf7);
  119. //                        {
  120. //                                temp=P1;
  121. //                                temp=temp&0xf0;
  122. //                        }
  123. //                        P0=0;
  124. //                        P2=smgduan[num];
  125. //                        }
  126.                 }
  127.                 P0=0;
  128.                 P2=smgduan[num-1];
  129.         }
  130. }        
复制代码




回复

使用道具 举报

ID:195361 发表于 2020-5-23 09:06 | 显示全部楼层
csmyldl 发表于 2020-5-23 01:44
while(temp!=0xf0)不应该嵌套使用

谢谢呀,其实我的问题,循环是没有问题的,调试执行循环一次,temp变为0xf0了,就应该出循环呀,为什么它没有出去?
回复

使用道具 举报

ID:195361 发表于 2020-5-23 09:08 | 显示全部楼层
TTQ001 发表于 2020-5-23 04:04
嵌入了许多WHILE条件循环,如果使用IF条件进行替换应加以改进。

谢谢呀,其实我的问题,循环是没有问题的,调试执行循环一次,temp变为0xf0了,就应该出循环呀,为什么它没有出去?选择if也是可以的,但是我看郭天祥师傅也是这么用的,只是端口不一样而已
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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