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