(学习笔记)手把手教你学51单片机:变量进阶与点阵LED

一、变量的作用域

作用域:变量的有效范围。分为:局部变量和全局变量。

1.1局部变量

在函数内部声明的变量,只在本函数内部可以使用。

1.2全局变量

在函数外声明的变量就是全局变量。

二、变量的存储类别

变量的存储类别分为自动、静态、寄存器和外部四种。

局部变量如果不加static修饰都属于自动变量。关键词为auto,可以省略。

全局变量均为静态变量。

局部变量加 static 关键字也为静态局部变量。特点是,只赋一次初值,在之后使用中,可以保存前次的执行结果。

eg: static unsigned char i=0;

i 为静态局部变量,初始化 i=0 只执行一次。

三、点阵的初步认识

8*8点阵由64个LED小灯组成。通过控制行和列的电平来控制灯的亮灭。

点阵可以用来显示图形,需要用取模软件将点阵显示的图形数字化,将需要显示的的地方(亮)设置为0,将不显示的地方(暗)设置为1,这是因为译码器输出为低电平,此时一个格子为一位二进制数字,每一行为一个字节,例如0xff(全黑),0x00全亮从而达到显示图像的目的。

3.1点阵的纵向移动

横向移动时每一张图片都是和下一行连续的。

        switch(i)
	{
		case 0:ADDR2=0;ADDR1=0;ADDR0=0;P0=LedChar[index+0];i++;break;   
		case 1:ADDR2=0;ADDR1=0;ADDR0=1;P0=LedChar[index+1];i++;break;   
		case 2:ADDR2=0;ADDR1=1;ADDR0=0;P0=LedChar[index+2];i++;break;
		case 3:ADDR2=0;ADDR1=1;ADDR0=1;P0=LedChar[index+3];i++;break;
		case 4:ADDR2=1;ADDR1=0;ADDR0=0;P0=LedChar[index+4];i++;break;
		case 5:ADDR2=1;ADDR1=0;ADDR0=1;P0=LedChar[index+5];i++;break;
		case 6:ADDR2=1;ADDR1=1;ADDR0=0;P0=LedChar[index+6];i++;break;
		case 7:ADDR2=1;ADDR1=1;ADDR0=1;P0=LedChar[index+7];i=0;break;
		default:break;
	}

LedChar里储存的是整幅图片的每个字节(每一行),用 index 代表每张图片的起始位置,每次从index起始向下数8行代表了当前的图片。每隔一段时间后,改变一张图片通过index++实现,则可实现不停地动态刷新,这样就形成了动画。当index代表最后一张图片时,对index清零。

3.2点阵的横向移动

方法1:把板子侧过来放,纵向取模就可以完成。

方法2:利用二维数组来实现,算法基本上和上下移动相同。

3.2.1二维数组初始化

二维数组的初始化分为两种情况 :

(1)数组元素的数量小于数组元素个数,没有赋值的会自动给0;

unsigned char a[2][3]={{1,2}{3,4}};

等价于 unsigned char[2][3]={1,2,0,3,4,0};

(2)数组元素等于数组个数时如下:

unsigned char a[2][3] ={{1,2,3},{4,5,6}};

等价于 unsigned char a[2][3]={1,2,3,4,5,6};

二维数组初始化时行数可以省略,编译系统会自动根据列数计算出行数,但是列数不能省略。

3.2.2二维数组实现点阵横向移动

横向移动时图片切换时的字模数据不是连续的。需要对每一帧的图像进行字模转换。

	switch(i)
	{
		case 0:ADDR2=0;ADDR1=0;ADDR0=0;P0=image[index][0];i++;break;   
		case 1:ADDR2=0;ADDR1=0;ADDR0=1;P0=image[index][1];i++;break;   
		case 2:ADDR2=0;ADDR1=1;ADDR0=0;P0=image[index][2];i++;break;
		case 3:ADDR2=0;ADDR1=1;ADDR0=1;P0=image[index][3];i++;break;
		case 4:ADDR2=1;ADDR1=0;ADDR0=0;P0=image[index][4];i++;break;
		case 5:ADDR2=1;ADDR1=0;ADDR0=1;P0=image[index][5];i++;break;
		case 6:ADDR2=1;ADDR1=1;ADDR0=0;P0=image[index][6];i++;break;
		case 7:ADDR2=1;ADDR1=1;ADDR0=1;P0=image[index][7];i=0;break;
		default:break;
	}

image里储存的是每一帧的8个字节ndex代表当前帧数,0~7代表点阵的每一行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值