找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4027|回复: 37
收起左侧

C语言while(1)里是不能赋值吗?

  [复制链接]
ID:734017 发表于 2020-12-14 22:16 | 显示全部楼层 |阅读模式
本帖最后由 happy2058 于 2020-12-15 15:52 编辑

int minute=30,sec=0;
unsigned char Key_tmp = 9;
void main()
        {
               
               
                Timer1(1);        中断,一毫秒进一次,1 秒钟时间减1
                EA=1;
        
               
        while(1)
                {
        
                        minute=25;
                        sec=55;                        覆盖上面初值。然后为什么只运行一次?
                        minutesec();                    这里是数码管显示,正常的
                                if(Key_tmp==9)    这里也不运行
                                {
                                        minute=1;
                                        sec=0;
                                }
                                
               
                }
        }       显示的
void minutesec()
{               
                unsigned char led[4] = {0x00};
                unsigned char k=0;               
                while (1)
                {
                led[3] = sec % 10;
                led[2] = sec / 10 % 10;
                led[1] = minute % 10;
                led[0] = minute / 10 % 10;
       
                        if (k < 3)
                        {
                        k++;
                        }
                        else
                        {
                        k = 0;
                        }
                        Send_Data(Led2_One[led[k]],Led2_Two[k]);
                        if (500 > Counter)
                                                Send_Data(Led2_One[led[k]]^0X80,Led2_Two[k]);   
                               
                       
                        if        (minute==0)       
                                {
                                        if(sec==0)
                                        {
                                                minute=1 ;
                                          sec=0;
                                          //ET1 = 1;
                  //EA = 1;
                                        }
                                }
                }       
}
中断的
unsigned char tmp;
unsigned char T1RH = 0;  //T0重载值的高字节
unsigned char T1RL = 0;  //T0重载值的低字节
Counter=0;




void Timer1(unsigned int ms)      //haomiao
{
    unsigned long tmp;             //临时变量

    tmp = 12000000 / 12;           //定时器计数频率
    tmp = (tmp * ms) / 1000;       //计算所需的计数值
    tmp = 65536 - tmp;             //计算定时器重载值
    tmp = tmp + 18;                //补偿中断响应延时造成的误差
    T1RH = (unsigned char)(tmp>>8);//定时器重载值拆分为高低字节
    T1RL = (unsigned char)tmp;
               
    TMOD &= 0x0F;                  //清零T1的控制位
    TMOD |= 0x10;                  //配置T1为模式1
    TH1 = T1RH;     //加载T1重载值
    TL1 = T1RL;
    ET1 = 1;        //使能T1中断
    TR1 = 1;        //启动T1
}

void InterruptTimer1() interrupt 3
{
       
                TH1 = T1RH;  //重新加载重载值
    TL1 = T1RL;
                Counter++;

       
        if (1000 == Counter)
        {
                Counter = 0;
                sec--;
                if(sec<0)
                {
                sec=59;
                }
                if (sec == 59)
                {
                        minute--;
                }
        }
       
}
       


回复

使用道具 举报

ID:88256 发表于 2020-12-14 23:12 | 显示全部楼层
不是不行,是你的程序有问题
minute=25;
sec=55;                        覆盖上面初值。然后为什么只运行一次?
这两句不应该放在循环里,否则送显示一直显示25分55秒,也就是你认为的只运行一次(实际上不止,只是人眼视觉暂留)

if(Key_tmp==9)    这里也不运行
{
   minute=1;
   sec=0;
}
这个也一样,虽然赋值1分0秒,但是重新循环马上被更改赋值为25分55秒,还没进入显示就被更改了,当然无效,必须把第一个红色部分的删除

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:136485 发表于 2020-12-15 08:26 | 显示全部楼层
能赋值啊,当为真时一直执行循环里的程序,为假时不执行里面的程序

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:743654 发表于 2020-12-15 08:47 | 显示全部楼层
while(1)是死循环,while(1)循环的语句会重复执行

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:860332 发表于 2020-12-15 09:18 | 显示全部楼层
while循环里面是可以赋值的,只是你显示的参数每次回来之后都会被你 minute=25;
                        sec=55; 给重新赋值了,导致你显示的都是这些值 minute=25;
                        sec=55; 所以才会认为是代码错了,只是你的逻辑问题没搞好

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:856541 发表于 2020-12-15 09:48 | 显示全部楼层
你这个程序只能显示25分55秒,

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:856541 发表于 2020-12-15 09:54 | 显示全部楼层
1 程序有问题,你这个程序只会显示25分55秒。 2 你觉得if程序部分没有运行是因为在if函数里面你没有调用显示函数minutesec(),他其实运行了只是你看不到。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:860369 发表于 2020-12-15 10:19 | 显示全部楼层
1.minute=25;
    sec=55;                        覆盖上面初值。然后为什么只运行一次?

   每次循环都重新复制一次  所以不会变

2. if(Key_tmp==9)    这里也不运行
                                {
                                        minute=1;
                                        sec=0;
                                }
这里一直不会为真  所以不会运行

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:734017 发表于 2020-12-15 14:18 | 显示全部楼层
谢谢大家,上午测试了一下,实际情况和大家说的不相同

while(1)
                {        
                        minute=25;               上电显示,只运行一次
                        sec=55;                        
                        minutesec();           显示函数,中断1ms进,标志加到1000 sec减1.   数管码每秒刷新字数。      
                                if(Key_tmp==9)    这个函数不运行
                                {
                                        minute=1;
                                        sec=0;
                                }
                   }
显数函数
void minutesec()
{               
                unsigned char led[4] = {0x00};
                unsigned char k=0;               
                while (1)
                {
                led[3] = sec % 10;
                led[2] = sec / 10 % 10;
                led[1] = minute % 10;
                led[0] = minute / 10 % 10;
       
                        if (k < 3)
                        {
                        k++;
                        }
                        else
                        {
                        k = 0;
                        }
                        Send_Data(Led2_One[led[k]],Led2_Two[k]);
                        if (500 > Counter)
                                                Send_Data(Led2_One[led[k]]^0X80,Led2_Two[k]);   
                               
                       
                        if        (minute==0)       
                                {
                                        if(sec==0)
                                        {
                                                minute=33 ;
                                          sec=33;
                                          
                  EA = 1;
                                        }
                                }
                }       
最终数码管显示停在 33 33

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:734017 发表于 2020-12-15 14:19 | 显示全部楼层
lj200666 发表于 2020-12-15 10:19
1.minute=25;
    sec=55;                        覆盖上面初值。然后为什么只运行一次?

谢谢,unsigned char Key_tmp = 9;不为真吗?
回复

使用道具 举报

ID:734017 发表于 2020-12-15 14:21 | 显示全部楼层
hhdsdy 发表于 2020-12-14 23:12
不是不行,是你的程序有问题
minute=25;
sec=55;                        覆盖上面初值。然后为什么只运 ...

谢谢,实际情况,只赋值一次,数码管一直在刷新减1.真到关中断
回复

使用道具 举报

ID:734017 发表于 2020-12-15 14:24 | 显示全部楼层
本帖最后由 happy2058 于 2020-12-15 14:26 编辑
1714461639 发表于 2020-12-15 09:18
while循环里面是可以赋值的,只是你显示的参数每次回来之后都会被你 minute=25;
                         ...

谢谢,minute=25;sec=55;这个确实只运行了一次,数码管显示一直在减,minute=25;sec=55;不能重新覆盖
回复

使用道具 举报

ID:734017 发表于 2020-12-15 14:25 | 显示全部楼层
东来乡杀马特 发表于 2020-12-15 09:48
你这个程序只能显示25分55秒,

不会,中断可以减时间,minute=25; sec=55; 不会重新覆盖
回复

使用道具 举报

ID:734017 发表于 2020-12-15 14:30 | 显示全部楼层
东来乡杀马特 发表于 2020-12-15 09:54
1 程序有问题,你这个程序只会显示25分55秒。 2 你觉得if程序部分没有运行是因为在if函数里面你没有调用显 ...

时间会变,可以做加减。就是不能重新在while(1)里赋值
回复

使用道具 举报

ID:734017 发表于 2020-12-15 14:38 | 显示全部楼层
本帖最后由 happy2058 于 2020-12-15 14:39 编辑
东来乡杀马特 发表于 2020-12-15 09:54
1 程序有问题,你这个程序只会显示25分55秒。 2 你觉得if程序部分没有运行是因为在if函数里面你没有调用显 ...

程序可以25:54
回复

使用道具 举报

ID:451629 发表于 2020-12-15 14:44 | 显示全部楼层
你这个是一直赋值显示的问题,要把第一次赋值放在while循环外面

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:553941 发表于 2020-12-15 14:49 | 显示全部楼层
我觉得,这么讨论没意义,大伙只看到了他给这两个函数赋值,并没有看到他显示函数中调用的是什么变量,也许是另一个变量,当然不受这个影响。还有中断服务程序中的内容,不贴完整代码,不发表自己的意见。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:553941 发表于 2020-12-15 14:52 | 显示全部楼层
我猜测最大的一个可能是他的显示函数中还有一个while(1),所以这个会只执行一次,if也不判断,因为在显示函数里面死循环了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:734017 发表于 2020-12-15 15:04 | 显示全部楼层
13303022280 发表于 2020-12-15 14:49
我觉得,这么讨论没意义,大伙只看到了他给这两个函数赋值,并没有看到他显示函数中调用的是什么变量,也许 ...

code unsigned char Led2_One[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code unsigned char Led2_Two[10] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0xff,0xff};
void Send_Data(unsigned int uiDataOne, unsigned int uiDataTwo)
{          
      unsigned int i = 0;       
          /* 将片选信号置为低电平 */
          HC595RCK = 0;
       
          /* 输入第一个数据:uiDataOne */
          for (i = 0; i < 8; i++)
          {
                /* 给出脉冲信号,首先将CLK置为0 */
                    HC595CLK = 0;
                        if (0 != (uiDataOne & 0x80))
                        {
                    HC595DATA = 1;   
                      }
                    else
                    {
                    HC595DATA = 0;
                }
                        /* 给出脉冲信号,首先将CLK置为1 */
                        HC595CLK = 1;
                        /* 准备第二个数据 */
                        uiDataOne = uiDataOne << 1;
      }
               
          /* 输入第二个数据:uiDataTwo */
          for (i = 0; i < 8; i++)
          {
                /* 给出脉冲信号,首先将CLK置为0 */
                    HC595CLK = 0;
                    if (0 != (uiDataTwo & 0x80))
                        {
                    HC595DATA = 1;   
                }
                        else
                        {
                    HC595DATA = 0;
                }
                        /* 给出脉冲信号,首先将CLK置为1 */
                        HC595CLK = 1;
                        /* 准备第二个数据 */
                        uiDataTwo = uiDataTwo << 1;
      }
               
          /* 将片选信号置为高电平 */
          HC595RCK = 1;
}
void minutesec()
{               
                unsigned char led[4] = {0x00};
                unsigned char k=0;               
                while (1)
                {
                led[3] = sec % 10;
                led[2] = sec / 10 % 10;
                led[1] = minute % 10;
                led[0] = minute / 10 % 10;
       
                        if (k < 3)
                        {
                        k++;
                        }
                        else
                        {
                        k = 0;
                        }
                        Send_Data(Led2_One[led[k]],Led2_Two[k]);
                        if (500 > Counter)
                                                Send_Data(Led2_One[led[k]]^0X80,Led2_Two[k]);   
                               
                       
                        if        (minute==0)       
                                {
                                        if(sec==0)
                                        {
                                                minute=33 ;
                                          sec=33;
                                          EA = 1;
                                        }
                                }
                }       
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:860399 发表于 2020-12-15 15:05 | 显示全部楼层
while(1)就是个死循环,目的是为了无意义消耗时间 相当于延时

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:734017 发表于 2020-12-15 15:06 | 显示全部楼层
本帖最后由 happy2058 于 2020-12-15 15:09 编辑
13303022280 发表于 2020-12-15 14:52
我猜测最大的一个可能是他的显示函数中还有一个while(1),所以这个会只执行一次,if也不判断,因为在显示函 ...

void Timer1(unsigned int ms)      //haomiao
{
    unsigned long tmp;             //临时变量
   
    tmp = 12000000 / 12;           //定时器计数频率
    tmp = (tmp * ms) / 1000;       //计算所需的计数值
    tmp = 65536 - tmp;             //计算定时器重载值
    tmp = tmp + 18;                //补偿中断响应延时造成的误差
    T1RH = (unsigned char)(tmp>>8);//定时器重载值拆分为高低字节
    T1RL = (unsigned char)tmp;
               
    TMOD &= 0x0F;                  //清零T1的控制位
    TMOD |= 0x10;                  //配置T1为模式1
    TH1 = T1RH;     //加载T1重载值
    TL1 = T1RL;
    ET1 = 1;        //使能T1中断
    TR1 = 1;        //启动T1
}

void InterruptTimer1() interrupt 3
{
        
                TH1 = T1RH;  //重新加载重载值
    TL1 = T1RL;
                Counter++;

      
        
        if (1000 == Counter)
        {
                Counter = 0;
                sec--;
                if(sec<0)
                {
                sec=59;
                }
                if (sec == 59)
                {
                        minute--;
                }
        }
        
}
回复

使用道具 举报

ID:381466 发表于 2020-12-15 15:11 | 显示全部楼层
下面给minute和sec赋的值在下一个循环的开始就被覆盖了吧
回复

使用道具 举报

ID:734017 发表于 2020-12-15 15:16 | 显示全部楼层
13303022280 发表于 2020-12-15 14:49
我觉得,这么讨论没意义,大伙只看到了他给这两个函数赋值,并没有看到他显示函数中调用的是什么变量,也许 ...

利害,我没太注意那部份,应该和你说的一样
code unsigned char Led2_One[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code unsigned char Led2_Two[10] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0xff,0xff};
void minutesec()
{               
                unsigned char led[4] = {0x00};
                unsigned char k=0;               
                while (1)
                {
                led[3] = sec % 10;
                led[2] = sec / 10 % 10;
                led[1] = minute % 10;
                led[0] = minute / 10 % 10;
       
                        if (k < 3)
                        {
                        k++;
                        }
                        else
                        {
                        k = 0;
                        }
                        Send_Data(Led2_One[led[k]],Led2_Two[k]);
                        if (500 > Counter)
                                                Send_Data(Led2_One[led[k]]^0X80,Led2_Two[k]);   
                               
                       
                        if        (minute==0)       
                                {
                                        if(sec==0)
                                        {
                                                minute=1 ;
                                          sec=0;
                                          //ET1 = 1;
                  //EA = 1;
                                        }
                                }
                }       
}

void Timer1(unsigned int ms)      //haomiao
{
    unsigned long tmp;             //临时变量
   
    tmp = 12000000 / 12;           //定时器计数频率
    tmp = (tmp * ms) / 1000;       //计算所需的计数值
    tmp = 65536 - tmp;             //计算定时器重载值
    tmp = tmp + 18;                //补偿中断响应延时造成的误差
    T1RH = (unsigned char)(tmp>>8);//定时器重载值拆分为高低字节
    T1RL = (unsigned char)tmp;
               
    TMOD &= 0x0F;                  //清零T1的控制位
    TMOD |= 0x10;                  //配置T1为模式1
    TH1 = T1RH;     //加载T1重载值
    TL1 = T1RL;
    ET1 = 1;        //使能T1中断
    TR1 = 1;        //启动T1
}

void InterruptTimer1() interrupt 3
{
       
                TH1 = T1RH;  //重新加载重载值
    TL1 = T1RL;
                Counter++;

       
       
        if (1000 == Counter)
        {
                Counter = 0;
                sec--;
                if(sec<0)
                {
                sec=59;
                }
                if (sec == 59)
                {
                        minute--;
                }
        }
       
}
       
回复

使用道具 举报

ID:734017 发表于 2020-12-15 15:50 | 显示全部楼层
13303022280 发表于 2020-12-15 14:52
我猜测最大的一个可能是他的显示函数中还有一个while(1),所以这个会只执行一次,if也不判断,因为在显示函 ...

应该和你说的一样,
回复

使用道具 举报

ID:453198 发表于 2020-12-17 11:04 | 显示全部楼层
我建议你把C预言基础学扎实了再试试
回复

使用道具 举报

ID:862112 发表于 2020-12-17 14:07 | 显示全部楼层
程序有问题,你这个程序只会显示25分55秒。 2 你觉得if程序部分没有运行是因为在if函数里面你没有调用显示函数minutesec(),他其实运行了只是你看不到。下面给minute和sec赋的值在下一个循环的开始就被覆盖了吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:852300 发表于 2020-12-17 17:21 | 显示全部楼层
楼主是把简单的功能写复杂了!还不讲对电路的具体要求!用两个while(1)在这个小程序里不必要也不应该的啊!!!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:843617 发表于 2020-12-17 19:10 | 显示全部楼层
前两句不参与循环
回复

使用道具 举报

ID:863028 发表于 2020-12-18 20:26 | 显示全部楼层
while()语句括号中是一个逻辑表达式,用以判断while循环是否需要继续执行。可以是赋值语句。  while循环的bai一般格式为:  while(expr)  {      ;//body  }

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:517466 发表于 2020-12-19 07:42 | 显示全部楼层
你的程序逻辑就有问题。主循环里使用了minutesec这个函数,而这个函数里又用了while(1)循环,试问,一直在函数minutesec里循环,那么条不出去,主循环又怎么可能被执行?
所以程序执行的顺序是:主循环中的分秒赋值语句只被执行了一次后,执行minutesec函数,进入这个函数的死循环,就退不出来了。主循环的if判断就肯定不会被执行了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:517466 发表于 2020-12-19 07:49 | 显示全部楼层
你想循环显示分秒对应的数码管,完全可以在主循环中处理,一个循环就够了,要做亮灭时间的配比处理,否则显示亮度会比较弱。led和k做成全局变量。
回复

使用道具 举报

ID:863315 发表于 2020-12-19 12:02 | 显示全部楼层
while (1)是个死循环,会一直循环 while (1)里的内容

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:863358 发表于 2020-12-19 13:31 | 显示全部楼层
while(1)不就是一直循环吗
回复

使用道具 举报

ID:862052 发表于 2020-12-19 14:20 | 显示全部楼层
while(1)是死循环
回复

使用道具 举报

ID:863386 发表于 2020-12-19 14:27 | 显示全部楼层
while(1)  是死循环可以一直执行,里面可以对变量赋值
回复

使用道具 举报

ID:863848 发表于 2020-12-20 11:27 | 显示全部楼层
while(1)死循环
回复

使用道具 举报

ID:861923 发表于 2020-12-20 12:53 | 显示全部楼层
没有break中断,不是就执行一次,而是一直在执行,死循环

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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