240 likes | 329 Views
任务 5. 任意花样 LED 闪烁控制. 项目三 LED 流水灯设计制作. 任务 5 任意花样 LED 闪烁控制. 任务要求: 在广告彩灯控制和舞台灯光控制等领域,需要小灯具有间隔点亮、轮流点亮、逐点点亮等花样。此时控制数据没有任何规律,本任务将利用数组解决任意花样 LED 闪烁控制问题。. 任务 5 任意花样 LED 闪烁控制. 一、数组 1 、数组是一个由若干同类型变量组成的集合。 2 、数组分类 一维数组 如 a[5] 二维数组 a[2][4] 三维数组 a[3][4][5] 注意: 数组必须先定义后使用。.
E N D
任务5 任意花样LED闪烁控制 项目三 LED流水灯设计制作
任务5 任意花样LED闪烁控制 任务要求: 在广告彩灯控制和舞台灯光控制等领域,需要小灯具有间隔点亮、轮流点亮、逐点点亮等花样。此时控制数据没有任何规律,本任务将利用数组解决任意花样LED闪烁控制问题。
任务5 任意花样LED闪烁控制 一、数组 1、数组是一个由若干同类型变量组成的集合。 2、数组分类 一维数组 如a[5] 二维数组a[2][4] 三维数组a[3][4][5] 注意:数组必须先定义后使用。
任务5 任意花样LED闪烁控制 3、一维数组的定义 形式:类型说明符 数组名[整型表达式]; 例: int a[5]; 声明了一个整型数组。该数组名为a,包含5个元素,依 次为a[0]、a[1]、 a[2]、 a[3]、 a[4],其中每个元 素都相当于一个整型变量。 注意:数组元素的位置编号即索引是从0开始的。
任务5 任意花样LED闪烁控制 4、一维数组的赋值 (1)在定义数组时对数组的全部元素赋予初值。 例:int a[5]={1,2,3,4,5}; (2)只对数组的部分元素初始化。 例:int a[5]={1,2}; 说明:只对前面两个赋初值,因此a[0]和a[1]的值是1、 2,而后面三个元素的值全部是默认的0。 (3)在定义数组时对数组元素的全部元素都不赋初值, 则数组元素的值均被初始化为0。
任务5 任意花样LED闪烁控制 (4)可以在定义时不指明数组元素的个数,而根据赋值部分由编译器自动确定。 例: unsigned char BitTab[]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB}; 定义了一个BitTab[6]这样一个数组。
任务5 任意花样LED闪烁控制 (5)可以为数组指定存储空间,如果未指定空间时,则将数组定义在内部RAM中。 可以用code关键字将数组元素定义在ROM空间中,用于程序运行过程中元素数值不改变的场合。 例: char code ledsegcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
任务5 任意花样LED闪烁控制 (6)只有在初始化时,可以为数组的各个元素同时赋值,否则在程序的其他地方一次只能为数组的某一个元素赋值。 例: i=a[2];//将数组元素a[2]的值赋给变量i。
任务5 任意花样LED闪烁控制 (7)由于数组中的每一个元素是由顺序的编号来标识的,所以可以利用循环来访问和处理数组的每一个元素。 例:为数组a的10个元素分别赋值1-10。 for(i=0;i<10;i++) a[i]=i+1;
任务5 任意花样LED闪烁控制 注意:C 语言并不对越界使用数组进行检测,例如数组的长度是6,其元素应该是从BitTab[0]~ BitTab[5],但是如果在程序中写上BitTab[6],编译器并不会认为这有语法错误,也不会给出警告,这一点应引起编程者的注意。
任务5 任意花样LED闪烁控制 • #include "reg51.h" • unsigned char code Tab[ ]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0xFF,0xAA}; • void delay(unsigned int t) • { unsigned int i,j; • for(i=t;i>0;i--) • for(j=110;j>0;j--); } • void main(void) • { • unsigned char i; • while(1) • { • for(i=0;i<10;i++) • { P1=Tab[i]; • delay(500); } • } • }
任务5 任意花样LED闪烁控制 二、指针与指针变量 int a=1,b=2; char c=0xff; 一个地址唯一指向一个内存变量,这个地址称为变量的指针。 如果将变量的地址保存在内存的特定区域,用变量来存放这些地址,这样的变量就是指针变量。
任务5 任意花样LED闪烁控制 1、指针变量的定义 例1: int *ptr1; 指针变量ptr1指向一个整型变量。即ptr1可以存放整型变量的地址。 例2: char * ptr1; 指针变量ptr1指向一个字符型变量。即ptr1可以存放字符型变量的地址。
任务5 任意花样LED闪烁控制 2、指针变量的引用 *指针变量 含义:指针变量所指向的值。
任务5 任意花样LED闪烁控制 3、指针运算符与指针表达式 &运算符:取地址运算符,&m即是变量m的地址。
任务5 任意花样LED闪烁控制 练习: 执行下面程序段后,ab的值为( )。 int *var,ab; ab=100;var=&ab; ab=*var+10;
任务5 任意花样LED闪烁控制 4、指针与数组 变量存放于内存中时是有地址的,数组在内存存放时也同样具有地址。对数组来说,数组名的值就是数组在内存安放的首地址。指针变量是用于存放变量的地址,可以指向变量,也可以存放数组的首地址或数组元素的地址,也就是说,指针变量可以指向数组或数组元素,对数组而言,数组和数组元素的引用,也同样可以使用指针变量。
任务5 任意花样LED闪烁控制 (1)指针与一维数组 例:int a[10],*ptr; ptr=a; 或:ptr=&a[0];
任务5 任意花样LED闪烁控制 指针对数组的表示方法: (1)ptr+n与a+n表示数组元素a[n]的地址,即&a[n]。 (2)*(ptr+n)和*(a+n)表示数组的元素,即a[n]。 (3)指向数组的指针变量也可以用数组的下标形式表示ptr[n],即*(ptr+n)。
任务5 任意花样LED闪烁控制 #include "reg51.h" unsigned char code Tab[ ]={……}; void delay(unsigned int t) { unsigned int i,j; for(i=t;i>0;i--) for(j=110;j>0;j--); } void main(void) { unsigned char i; while(1) { for(i=0;i<40;i++) { P1=*(Tab+i); delay(500); } } }
任务5 任意花样LED闪烁控制 #include "reg51.h" unsigned char code Tab[ ]={……}; void delay(unsigned int t) { unsigned int i,j; for(i=t;i>0;i--) for(j=110;j>0;j--); } void main(void) { unsigned char i,*ptab; ptab=Tab; while(1) { for(i=0;i<40;i++) { P1=*(ptab+i); delay(500); } } }
任务5 任意花样LED闪烁控制 函数的首地址也可以存储在某个函数指针变量里。这样,就可以通过这个函数指针变量来调用所指向的函数了。 声明一个可以指向某个函数的函数指针变量pdelay的方法: void (*pdelay)(unsigned int t);
任务5 任意花样LED闪烁控制 #include "reg51.h" unsigned char code Tab[ ]={……}; void delay(unsigned int t) { unsigned int i,j; for(i=t;i>0;i--) for(j=110;j>0;j--); } void main(void) { unsigned char i,*ptab; void (*pdelay)(unsigned int t); pdelay=&delay; while(1) { ptab=Tab; for(i=0;i<40;i++) { P1=*ptab; ptab++; (*pdelay)(500);} } }