标题: STC89C52单片机C语言代码在用数组判断处无法判断,再次请各位大佬出山看看 [打印本页]

作者: 雨人1212    时间: 2021-9-2 16:27
标题: STC89C52单片机C语言代码在用数组判断处无法判断,再次请各位大佬出山看看
STC89C52代码在用数组判断处无法判断,再次跪求请各位大佬出山看看
自己调试过发现是判断无效,也就是“keyword[y]==right[y]”无效,但是语言和逻辑上都没有错呀,实在想不通,还请各位指点

主要单片机代码如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include<OLED.h>               
  4. #include <intrins.h>
  5. #define led P1

  6. sbit b1=P2^0;
  7. sbit b2=P3^3;
  8. sbit b3=P2^1;
  9. sbit b4=P2^2;
  10. sbit b5=P4^2;
  11. sbit b6=P4^3;
  12. sbit bee=P2^4;
  13. sbit b10=P1^0;



  14. unsigned int y;
  15. unsigned int right[6]={1,3,1,4,2,1};
  16. unsigned int keyword[6]={1,3,1,4,2,1};

  17. void delay(int ms)
  18. {
  19.    int ii,jj;
  20.    if (ms<1) ms=1;
  21.    for(ii=0;ii<ms;ii++)
  22.      for(jj=0;jj<500;jj++);      
  23. }

  24. void start()
  25. {
  26.         bee=0;
  27.         delay(10);
  28.         OLED_Init();
  29.         OLED_CLS();
  30.         OLED_Fill(0x00);
  31.         OLED_P14x16Ch(25,1,0);
  32.         OLED_P14x16Ch(39,1,1);
  33.         OLED_P14x16Ch(53,1,2);                     
  34.         OLED_P14x16Ch(67,1,3); //显示密码文字//               
  35.         OLED_P14x16Ch(81,1,4);        
  36. }

  37. void beep()
  38. {
  39.         delay(20);
  40.         bee=1;
  41.         delay(100);
  42.         bee=0;
  43. }

  44. void data_input()
  45. {
  46.         unsigned int i=0;
  47.         unsigned char location[6]={36,46,56,66,76,86};

  48.         start();

  49.         while(1)
  50.         {
  51.                 if(i<=5)
  52.                 {
  53.                         if(b1==0)
  54.                         {
  55.                                 delay(20);
  56.                                 while(!b1);
  57.                                 beep();
  58.                                 keyword[i]=1;
  59.                                 OLED_P6x8Str(location[i],5,"1");
  60.                                 i++;
  61.                         }
  62.                
  63.                         if(b5==0)
  64.                         {
  65.                                 delay(20);
  66.                                 while(!b5);
  67.                                 beep();
  68.                                 keyword[i]=2;
  69.                                 OLED_P6x8Str(location[i],5,"2");
  70.                                 i++;
  71.                         }
  72.                
  73.                         if(b2==0)
  74.                         {
  75.                                 delay(20);
  76.                                 while(!b2);
  77.                                 beep();
  78.                                 keyword[i]=3;
  79.                                 OLED_P6x8Str(location[i],5,"3");
  80.                                 i++;
  81.                         }
  82.                
  83.                         if(b6==0)
  84.                         {
  85.                                 delay(20);
  86.                                 while(!b6);
  87.                                 beep();
  88.                                 keyword[i]=4;
  89.                                 OLED_P6x8Str(location[i],5,"4");
  90.                                 i++;
  91.                         }
  92.                 }

  93.                 if(b3==0&&i<=6)
  94.                 {
  95.                         delay(20);
  96.                         while(!b3);
  97.                         beep();
  98.                         i--;
  99.                         OLED_P6x8Str(location[i],5," ");
  100.                 }

  101.                 if(b4==0)
  102.                 {
  103.                         delay(20);
  104.                         while(!b4);
  105.                         beep();
  106.                         break;
  107.                 }
  108.         }
  109. }

  110. void main()
  111. {
  112.         unsigned int t;
  113.     data_input();
  114.         for(y=0;y<6;y++)
  115.         {
  116.                 if(keyword[y]==right[y])
  117.                 {
  118.                         t++;
  119.                 }
  120.         }
  121.         while(1)
  122.         {
  123.                 if(t==5)
  124.                 {
  125.                         bee=0;
  126.                 delay(10);
  127.                  OLED_Init();
  128.                 OLED_CLS();
  129.                 OLED_Fill(0x00);
  130.                         OLED_P14x16Ch(30,6,3);
  131.                         OLED_P14x16Ch(46,6,4);
  132.                         OLED_P14x16Ch(62,6,5);
  133.                         OLED_P14x16Ch(78,6,6);
  134.                         delay(20);
  135.                         bee=1;
  136.                         delay(10000);
  137.                         bee=0;        
  138.                 }
  139.                 else
  140.                 {
  141.                         OLED_P14x16Ch(30,6,3);
  142.                         OLED_P14x16Ch(46,6,4);
  143.                         OLED_P14x16Ch(62,6,7);
  144.                         OLED_P14x16Ch(78,6,8);
  145.                         delay(20);
  146.                         bee=1;
  147.                         delay(1000);
  148.                         bee=0;
  149.                         led=0;
  150.                         delay(50000);        
  151.                         while(1)
  152.                 {
  153.                                 P0=0x00;
  154.                     delay(1000);
  155.                     P0=0xff;
  156.                     delay(1000);
  157.                }
  158.                 }
  159.         }
  160. }
复制代码

作者: xuyaqi    时间: 2021-9-2 19:14
本帖最后由 xuyaqi 于 2021-9-2 19:17 编辑

这个循环进去就出不来,程序没发循环。while(1)
{
    P0=0x00;
    delay(1000);
    P0=0xff;
   delay(1000);
}


作者: xianfajushi    时间: 2021-9-2 19:31
做这样判断有和用处!Y值一样数组值一样还用判断?
作者: 雨人1212    时间: 2021-9-2 19:33
xianfajushi 发表于 2021-9-2 19:31
做这样判断有和用处!Y值一样数组值一样还用判断?

两个数组一样是之前为了查问题换了,原来keyword那个数组应该是空的
作者: 188610329    时间: 2021-9-2 19:47
把:
unsigned int right[6]={1,3,1,4,2,1};
unsigned int keyword[6]={1,3,1,4,2,1};
改成:
unsigned char code right[]={1,3,1,4,2,1};
unsigned char code keyword[]={1,3,1,4,2,1};
试试,别谈理论,试完再说。
作者: 雨人1212    时间: 2021-9-2 19:59
xuyaqi 发表于 2021-9-2 19:14
这个循环进去就出不来,程序没发循环。while(1)
{
    P0=0x00;

我知道这里跳不出来但我想问的问题是
for(y=0;y<6;y++)
        {
                if(keyword[y]==right[y])
                {
                        t++;
                }
        }
这里的判断为什么不起作用
作者: 雨人1212    时间: 2021-9-2 20:01
188610329 发表于 2021-9-2 19:47
把:
unsigned int right[6]={1,3,1,4,2,1};
unsigned int keyword[6]={1,3,1,4,2,1};

已经试过了,没用

作者: 188610329    时间: 2021-9-2 20:11
雨人1212 发表于 2021-9-2 20:01
已经试过了,没用

for(y=0;y<6;y++)
        {
                if(keyword[y]==right[y])
                {
                        t++;
                }
        }
你这里只跑一次,跑完t = 6;
之后进入while(1) 这里就再也不跑了,你说的不起作用是什么不起作用? 不相等? t不变6?
作者: 雨人1212    时间: 2021-9-2 21:27
188610329 发表于 2021-9-2 20:11
for(y=0;y

按道理是t变成6进入循环,循环判断t==6,然后执行t=6时的程序,但是始终执行的是else后的程序,我想不通是哪里出问题了

作者: lkc8210    时间: 2021-9-2 22:18
雨人1212 发表于 2021-9-2 21:27
按道理是t变成6进入循环,循环判断t==6,然后执行t=6时的程序,但是始终执行的是else后的程序,我想不通是 ...


t==6 执行else,没错啊~?

作者: 雨人1212    时间: 2021-9-2 22:25
lkc8210 发表于 2021-9-2 22:18
t==6 执行else,没错啊~?

那个是之前调试错误的时候改的忘了改为“t==6”,但就算改为"t==6"这个判断仍然是不起作用的,我很迷
作者: lkc8210    时间: 2021-9-2 22:57
雨人1212 发表于 2021-9-2 22:25
那个是之前调试错误的时候改的忘了改为“t==6”,但就算改为"t==6"这个判断仍然是不起作用的,我很迷

我改为“t==6”
运行后直接按b4
可以进if(t==6)啊~

你如何判断进哪个?

另外
你开头#define led P1
在else内又是用P0=0x00;
你硬件是接哪组脚?
作者: xuyaqi    时间: 2021-9-3 06:19
雨人1212 发表于 2021-9-2 19:59
我知道这里跳不出来但我想问的问题是
for(y=0;y

你根据什么说判断不起作用。
作者: sinside    时间: 2021-9-3 08:18
代码我没有细看, 不知道right和keword的值在中间过程有没有变化.

但是根据你的描述, 你看看编译后的汇编代码, 看看right[y] == keyword[y]是否存在?

可以试试用下面的方法再试试看看:
volatile unsigned int right[6]={1,3,1,4,2,1};
volatile unsigned int keyword[6]={1,3,1,4,2,1};
作者: xianfajushi    时间: 2021-9-3 08:50
从哪里你得出无法正确判断的结论?
作者: xianfajushi    时间: 2021-9-3 08:51
代码执行后t等于多少知道?
作者: xianfajushi    时间: 2021-9-3 08:52
而且那段代码只能执行一次




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1