接着上次的实验,这次只需要改变工作的数码管以及其显示的数字即可。我的实验板上有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;的形式~