微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 共阳极数码管动态显示程序显示问题

共阳极数码管动态显示程序显示问题

时间:10-02 整理:3721RD 点击:
一个简单的共阳极数码管动态显示程序。
Q:当i=16时,按常理说数码管一直显示F,为什么会继续从0到F继续循环?
程序如下:
#include<reg52.h>
#define DUAN P0
#define uchar unsigned char
#define uint unsigned int
uchar code duan_code[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
void delayMs(uint);
void main()
{
        uchar i=0;
        for(i=0;i<16;i++)
        {
                DUAN=~duan_code;//共阴取反(接下来应写if(i==16) i=0;   但忽略此if语句也可以达到效果,so why?)
                delayMs(500);
        }
}
void delayMs(uint x)
{
        uint i,j;
        for(i=x;i>0;i--)
                for(j=113;j>0;j--);
}

好好努力,学透51,学其他的就好办了,不要直接去学STM32,那样付出的代价是你想不到的,如果有不懂的地方,可以来问我,我可以帮你解答一点点

你C语言基础不扎实,回去看看FOR语句的用法在来想想

哦,我会的。您能先提示下我嘛?

for(i=0;i<16;i++)
        {
                DUAN=~duan_code;//共阴取反(接下来应写if(i==16) i=0;   但忽略此if语句也可以达到效果,so why?)
                delayMs(500);
        }
}
你知道for(i = 0; i < 16; i++);的循环次数是从0-15,也就是16次,如果不到的话,i会一直++,那么当i= 16的时候,for循环的条件已经不满足了,自然就从头开始了

在for这个条件循环内,i的值是不可能等于16的,所以无效

另外,在main()函数内,建议添加while(1);

当i=16时,已不满足for语句,所以在执行完后会退出for语句,也就是说DUAN=0x00
为什么会从头开始循环呢?
我没有用while语句

我是想通过for语句和if语句的嵌套来达到循环的目的。
但目前是无需if语句就可以循环了。

我认为for语句最后 i 的结果是16(已不满足条件要求),只是不执行括号内语句直接退出循环。

你这孩子怎么还较真呢?呵呵,大家通用的学习方法就是加上while(1)
{
//代码
}
和while(1);前一种写法是在while函数里死循环,后面是停在这里,不让他继续往下执行,程序执行的是人的思维,学习别较真,大家怎么做你就怎么做就好了

我认为的结果应该是数码管最后始终为F,

你不妨试试在while(1)
{
}这个函数前点亮一个LED灯试试,看看代码进入到while(1)函数后他是否会熄灭,答案是不会的,一直会亮着,因为程序代码没有让他关闭啊

嘿嘿,多多尝试才好嘛!我也知道while(1){}是行的通哒!

你加上WHILE(1);停在这里,看看是不是F

嗯,可以的。但如果我想,在循环一遍后让数码管始终是F呢!
自我感觉程序木有问题呀!

待会试下!

程序执行的是人的思维,你告诉他干什么他才干什么!如果你不告诉他停下来,他会乱执行下面的未知代码,造成单片机跑飞或者是复位,总之。

嗯嗯,谢谢提醒,我会牢记在心的!
这个问题还真是有趣!我会继续探索的!

你现在读大几了?

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

网站地图

Top