微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手请教:怎么实现按一个键使一个数码管在两种状态下...

新手请教:怎么实现按一个键使一个数码管在两种状态下...

时间:10-02 整理:3721RD 点击:
新手请教:
初学单片机C语言。有个小问题请教高手!
怎么实现按一个键使一个数码管在两种状态下来回切换呢?按一下显示一个状态,再按一下显示显示原来状态!
我定义了一个变量,不知道为什么程序运行后,能实现一次切换,切换后就不能要切换到原状态了!

假如数码管与P0相连,P2.0连接开关且开关另一端接地。P2.0初始为1,用一个while循环不断判断P2.0的值当值为0时,就改变P0的值,当P2.0为1时,P0的值不变。
你学了中断的话,就用中断来做。我也是刚学51单片机,前2天被这最小系统搞得很伤。

我定义了一个变量,当做状态转化开关,P1_4 脚接独立按键,通过判断此按键,确定数码管状态,判断代码如下,请帮忙看看有什么错误么?
if(P1_4==0)               
           {
                        delay(50);    //延时消抖
                        if(P1_4==0)
                        {
                          bai++;
                        
                           if(bai>1)
                          {
                                   bai==0;        
                          }
                          
                         }
                  while(P1_4==0);
                }

虽然几年不写程序了,但感觉你的程序写的好怪怪的,最后为什么要while(P1_4==0)

这样不行。
可以这样做:
给一个初始值。
如果有按键的,显示状态取反就行

学习学习学习学习

bai==0;你这个是想赋值吗?应该是bai=0;

是赋值!这里应该是用错了!
嘿嘿,马虎了,我说怎么就只能管一次呢!一会修改下试试!

新人学习中,向各位前辈学习..

嗯……是这里错了,改过来以后, bai 的值就在0和1之间转换了,搞定!

有那么笨嘛。你按键之后付个值不就可以了嘛,按一次是变量加1,再整个switch 别说两种就是一千种一万种都可以啊。

while 语句的一般形式为:
while(表达式)语句
其中表达式是循环条件,语句为循环体。
while 语句的语义是:计算表达式的值,当值为真(非 0)时, 执行循环体语句。其执行
过程可用下图表示。


do-while 语句的一般形式为:
do
语句
while(表达式);
这个循环与 while 循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为
真, 如果为真则继续循环;如果为假, 则终止循环。因此, do-while 循环至少要执行一次
循环语句。其执行过程可用下图表示。


在 C 语言中,for 语句使用最为灵活,它完全可以取代 while 语句。它的一般形式为:
for(表达式 1;表达式 2;表达式 3) 语句
它的执行过程如下:
1)  先求解表达式 1。
2)  求解表达式 2,若其值为真(非 0),则执行 for 语句中指定的内嵌语句,然后执行下面
第 3)步;若其值为假(0),则结束循环,转到第 5)步。
3)  求解表达式 3。
4)  转回上面第 2)步继续执行。
5)  循环结束,执行 for 语句下面的一个语句。
其执行过程可用下图表示。


for 语句最简单的应用形式也是最容易理解的形式如下:
for(循环变量赋初值;循环条件;循环变量增量) 语句
循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值; 循环条件是一个
关系表达式,它决定什么时候退出循环;循环变量增量,定义循环控制变量每循环一次后
按什么方式变化。这三个部分之间用“;”分开。
例如:
for(i=1; i<=100; i++)sum=sum+i;
先给 i 赋初值 1,判断 i 是否小于等于 100, 若是则执行语句,之后值增加 1。再重新判断,
直到条件为假,即 i>100 时,结束循环。
相当于:
i=1;
while(i<=100)
{ sum=sum+i;
i++;
}
对于 for 循环中语句的一般形式,就是如下的 while 循环形式:
表达式 1;
while(表达式 2)
{语句
表达式 3;
}
注意:
1)  for 循环中的“表达式 1(循环变量赋初值)”、“表达式 2(循环条件)”和“表达式 3(循
环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。
2)  省略了“表达式 1(循环变量赋初值)”, 表示不对循环控制变量赋初值。
3)  省略了“表达式 2(循环条件)”, 则不做其它处理时便成为死循环。
例如:
for(i=1;;i++)sum=sum+i;
相当于:
i=1;
while(1)
{sum=sum+i;
i++;}
4)  省略了“表达式 3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中
加入修改循环控制变量的语句。
例如:
for(i=1;i<=100;)
{sum=sum+i;
i++;}
5)  省略了“表达式 1(循环变量赋初值)”和“表达式 3(循环变量增量)”。
例如:
for(;i<=100;)
{sum=sum+i;
i++;}
相当于:
while(i<=100)
{sum=sum+i;
i++;}
6)  3 个表达式都可以省略。
例如:
for(;;)语句
相当于:
while(1)语句
7)  表达式 1 可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。
例如:
for(sum=0;i<=100;i++)sum=sum+i;
8)  表达式 1 和表达式 3 可以是一个简单表达式也可以是逗号表达式。
for(sum=0,i=1;i<=100;i++)sum=sum+i;
或:
for(i=0,j=100;i<=100;i++,j--)k=i+j;
9)  表达式 2 一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其
值非零,就执行循环体。
例如:
for(i=0;(c=getchar())!=’\n’;i+=c);
又如:
for(;(c=getchar())!=’\n’;)
printf(“%c”,c);
几种循环的比较
1)  四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用goto型循
环。
2)  while和do-while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。
3)  用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完
成,而for语句可以在表达式1中实现循环变量的初始化。
授之以鱼不如授之以渔
相信你应该知道该怎么改了吧。

while(P1_4==0);是用来防止按着不放的那种情况出现的,个人意见 支持这种用方法,我以前就是这样用的,不知道哪位大神有木有更好的用法

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top