用户工具

站点工具


侧边栏

抱歉,您没有权限增加页面
3.单片机c语言:8.二维数组流水灯

八位流水灯学单片机C语言之二维数组

前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。二维数组定义的一般形式是:

类型说明符 数组名[常量表达式1][常量表达式2]]

其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:

int a[3][4];

上面说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:

a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]

二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,在C语言中,二维数组是按行排列的。
即:先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。

二维数组初始化也是在类型说明时给各下标变量赋以初值。例如对数组a[5][3]:

int a[5][3]={ 
               {80,75,92},
               {61,65,71},
               {59,63,70},
               {85,87,90},
               {76,77,85} 
            };

二维数组元素的引用,二维数组的元素也称为双下标变量,其表示的形式为:

数组名[下标][下标]
例如:a[0][2]; 表示a数组第一行,第3个元素92

来看个例子,一个学习小组有5个人,每个人有三门课的考试成绩。求各科平局分和总成绩平均分。可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下:

    #include <stdio.h>
    int main(void){
    
        int i,j,s=0, average,v[3];
        int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
        
        for(i=0;i<3;i++)
        {
            for(j=0;j<5;j++)
                s=s+a[j][i];
            v[i]=s/5;
            s=0;
        }
        average=(v[0]+v[1]+v[2])/3;
        printf("math:%d\nc languag:%d\ndFoxpro:%d\n",v[0],v[1],v[2]);
        printf("total:%d\n", average);
        return 0;
    }

来看个单片机例子,使用for循环来查询对应二维数组中的值,实现花样流水灯。

#include<stc12.h> //STC12系列头文件 复制到工程目录下
sbit LEDK = P1^4;// 控制三极管基极

               //定义数组保存在程序存储区
unsigned char code LED[4][8]={ 
				{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80},
				{0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01},
				{0x18,0x3c,0x7e,0xff,0x81,0xc3,0xe7,0xff},
				{0x55,0xaa,0xaa,0x55,0xff,0x00,0xff,0x00},
			     };

void main(void)							
{   
       unsigned char i=0,j=0; //局部变量
       unsigned int k;
       LEDK=0;  //置0使PNP型三极管导通LED负极接地
       P0=0x00;	//P0口电平初始化为0 关闭全部LED
       P0M1=0x00;
       P0M0=0xff; //P0口全部设置为推挽输出 见手册87页 IO口模式配置
	while(1)
	{
	  for(j=0;j<4;j++) //循环四次 每次j增1
	  {
	      for(i=0;i<8;i++) //循环八次 每次i增1
	      {
		  P0=LED[j][i]; //j对应数组中的行,i对应列,每次取出来的值赋给P0口
		  for(k=0;k<50000;k++);  //延时一会 
	      }
	  }
	}
}

  以上代码完整工程在\STC51 Discovery\实验例程\基础实验\实验十一
3.单片机c语言/8.二维数组流水灯.txt · 最后更改: 2017/03/01 13:33 由 wawooo