您的位置:首页 > 其它

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

2018-11-04 17:04 337 查看

一、变量的作用域

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

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点阵的纵向移动

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

[code]        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二维数组实现点阵横向移动

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

[code]	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代表点阵的每一行。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: