2009_0228 – 流动数码管显示程序

接着上次的实验,这次只需要改变工作的数码管以及其显示的数字即可。我的实验板上有8个数码管,我安排为轮到第几个数码管工作,那个数码管就显示出它的位数,比如第0个数码管工作就显示0,第7个数码管工作就显示7。
其实,这次只需要在上次程序的基础上做小小的修改即可。毕竟上次是在同一个数码管上显示8个数字,这次只是不断的改动显示数字即工作的数码管,所以只需要运用一个相应变化的数组即可实现工作数码管的变换。以下是整个程序的流程图:

未命名

将第一个框单独设为一个while循环,实现数组的初始化,而剩余两个框设为一个for循环,来实现工作数码管及其相应显示代码的移动。程序如下所示

/*****************************************************
Project : LED display
Version : V1
Date    : 2009_0228
Author  : Lemy Wong           
Company : N/A                    
Comments: change displaying numbers and the LED that works

Chip type           : AT89S52
Program type        : Application
Clock frequency     : 12 MHz
*****************************************************/
#include <reg52.h>
main()
{
    int m = 0;
    int n = 0;                  // a proper initialization for short –>  int m = 0 ,n = 0;
    int LED_change[] = {0,1,2,3,4,5,6,7};
    int number_change[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  // initialize an array could not use a constant in[]
    void delay();

    while(1)
    {
        m = 0;
        n = 0;
        for(m == 0 , n == 0 ;m <= 7 ;m++ ,n++)
        {
            P0 = number_change[n];
            P2 = LED_change[m];
            delay();
            delay();
            delay();
        }

    }
}

void delay()
{
    int i = 30000;
    while(i–);
}

程序烧写之后再实验板上运行的效果如下面的视频所示

http://www.tudou.com/v/92G6e-7-iJM

##########c语言复习###########
这次编写这个程序出现了几个问题,首先,数组的初始化还是不熟悉,第二,变量的初始化其实可以有更简练的写法。查过相关课本后,对这两个问题进行一下总结:
1.数组的初始化
这次编写程序时,由于在更换工作数码管和显示代码的时候要使数组元素移动,所以设置了一个带变量的数组元素,所以最初的程序在初始化数组的时候写成了LED_change[m]之类的,结果马上被编译器检测出问题。
其实数组的维度是绝对不能出现变量的,这是因为程序运行之前检测到数组的时候,计算机立即检测其维度,来分配相应的内存空间。正因为这样,如果我们把数组的维度设置成一个变量,则计算机根本无法知道到底要分配多少内存空间给数组,这就使得整个程序编译的时候出问题。所以,初始化数组的时候,绝对不能用一个变量来放到其维度中。
正如上次程序一样,将数组维度制空是一个很不错的初始化方法,管它维度是多少,我用了多少就让计算机自己去计算出到底是多大的维度就得了。所以LED_change[]才是一个更简单更保险的初始化的方法
2.变量初始化的简化
连续初始化若干个变量如果像下面这样只有两个变量的话,下面的初始化方法还不算太麻烦
    int m = 0;
    int n = 0; 
可是如果有十几个变量要同时初始化的时候,这样写明显就显得很累赘了。所以,这里可以用逗号运算符将若干个变量初始化在同一行隔开,这样看起来还是写起来都会更舒服。
不过有个问题,切忌不能写成 int a = b = c = d = 0;的形式~

Leave a comment