手把手教你学51单片机:变量进阶与点阵LED

发布者:HeavenlyWhisper最新更新时间:2020-06-17 来源: eefocus关键字: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代表点阵的每一行。

关键字:51单片机  变量进阶  点阵LED 引用地址:手把手教你学51单片机:变量进阶与点阵LED

上一篇:[51单片机学习笔记FOUR]---16*16LED点阵
下一篇:51单片机一键多功能按键识别技术

推荐阅读最新更新时间:2024-11-16 19:45

基于51单片机的霍尔水流量计设计
1、开发准备 (1)YF-B1流量传感器一个 (2)51开发板一个 2、基础知识 (1)YF-B1流量传感器只有三根线。即数据线、VCC、GND。数据线输出为占空比为50%的方波。当水流通过水流转子组件时,磁性转子转动并且转速随着流量的变化而成线性变化。霍尔传感器(霍尔元件采样)输出相应的脉冲信号。其流量脉冲特性计算公式为:脉冲f(Hz)=8.1x流量Q(L/min)-3。 (2)51单片机的中断工作方式。51单片机有定时器T0和T1,他们既有定时又有计数的功能。通过设置相关的特殊功能寄存器就可以启用定时或计数功能。需要注意的是,定时器系统是单片机内部一个独立的硬件部分,CPU一旦设置定时功能,定时器便在晶振的作用下计时
[单片机]
51单片机入门教程(6)——外部中断
一、外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了。(传送门:51单片机入门教程(5)——定时器中断) 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 51单片机的中断源优先级与向量号如下表: 中断源 优先级 中断向量号 INT0 – 外部中断0 最高 0 T0 – 定时器/计数器0中断 第2 1 INT1 – 外部中断1 第3 2 T1 – 定时器/计数器1中断 第4 3 串口中断 第5 4 T2 – 定时器/计数器2中断 最低 5 1.2 外部中断 除了定时器中断外,51单片机还有两个外部中断源
[单片机]
<font color='red'>51单片机</font>入门教程(6)——外部中断
#51单片机#A/D差分输入信号
在上一节已经提到过,控制字的第 4 位和第 5 位是用于控制 PCF8591 的模拟输入引脚是单端输入还是差分输入。差分输入是模拟电路常用的一个技巧,这里我们把相关知识做一些简单介绍。 从严格意义上来讲,其实所有的信号都是差分信号,因为所有的电压只能是相对于另外一个电压而言。但是大多数系统,我们都是把系统的 GND 作为基准点。而对于 A/D 来说的差分输入,通常情况下是除了 GND 以外,另外两路幅度相同,极性相反的输入信号,其实理解起来很简单,就如同跷跷板一样。如图17-8 所示。 图 17-8 差分输入原理 差分输入的话,就不是单个输入,而是由 2 个输入端构成的一组输入。PCF8591 一共是4 个模拟输入端,可以配置
[单片机]
#<font color='red'>51单片机</font>#A/D差分输入信号
壹拾壹:音乐实验
#基础知识 扬声器(Speaker)俗称喇叭,是一种发生器件,可以发出多种音频,在实际生活中应用相当广泛。 发声原理: 声音的产生是一种音频振动的效果,振动的频率高则为高音,频率低则为低音。 音频的范围为20Hz-200kHz,人类的耳朵比较容易辨识的声音大概是200Hz -20kHz。 一般音响电路是以正弦波信号驱动喇叭,产生悦耳的音乐;在数字电路里,则一般是以脉冲信号驱动喇叭以产生声音,其效果相对会差一些。 1)音调 以Do、Re、Mi、Fa、So、La、St分别代表某一个频率的声音,称之为“音调”,即Tone。 2)节拍 节拍能让音乐具有旋律(固定的律动),更可以调节各个音的快慢速度。“节拍”即Beat。 C3/4代表
[单片机]
壹拾壹:音乐实验
89c51单片机32个心形流水灯
#include reg52.h #include intrins.h //库函数 #define uint unsigned int #define uchar unsigned char//宏定义 void delay(uint xms)//延时函数 { uint i,j; for(i=xms;i 0;i--) for(j=110;j 0;j--); } void zys(uint t)//左右闪烁 { while(t--) { P3=P2=0x00; delay(500); P3=P2=0xff; P1=P0=0x00; delay(500);
[单片机]
89c<font color='red'>51单片机</font>32个心形流水灯
51单片机教程:单片机的特殊功能寄存器
我们已知单片机的内部有ROM、有RAM、有并行I/O口,那么,除了这些东西之外,单片机内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部的寄存器作一个完整的功能分析吧! 下图中我们能看出,在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在一个51单片机的内部包含了这么多的东西。 单片机内部结构图 对上面的图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到对应I/O口的锁存器就能了,那么对于定时/计数器,串行I/O口等怎么用
[单片机]
<font color='red'>51单片机</font>教程:单片机的特殊功能寄存器
51单片机系统中使用8155
简介:单片机自身的 RAM 存储空间和引脚数目往往有些不足,当需要在外部拓展不太多的时候,8155 芯片就是首选了。 一片8155,可以提供256字节的RAM,3个并行IO接口和一个14位的定时器。 8155的内部还集成了地址锁存器,如果只是需要扩展8155,就可以省去常用的地址锁存器74LS373。 下面,先写一个使用单片机自身资源来驱动16个LED进行流水的程序。 然后,再把它改造为利用8155来驱动。 利用51单片机驱动16个LED流水灯的汇编语言程序如下。 ;========================================================= ;16个LED接到P0
[单片机]
在<font color='red'>51单片机</font>系统中使用8155
用C51单片机设计物体分级设备的测量光幕
1 引言 光幕是电子测量系统中应用比较多的一种设备。利用光幕可以测量恒速传送带上的物体高度、长度或宽度等一系列数据,以便为后面的电子系统提供相应的参数。本文给出了一种利用单片机实现物体高度测量的光幕测量方法。 2 光幕测量物体高度的基本原理 图1所示是一个用普通光幕测量物体高度的测试原理结构示意图。图中,光幕的一边等间距安装有多个红外发射管,另一边相应的有相同数量同样排列的红外接收管,每一个红外发射管都对应有一个相应的红外接收管,且安装在同一条直线上。当同一条直线上的红外发射管、红外接收管之间没有障碍物时,红外发射管发出的调制信号(光信号)能顺利到达红外接收管。红外接收管接收到调制信号后,相应的电路输出低电平,而在有
[单片机]
用C<font color='red'>51单片机</font>设计物体分级设备的测量光幕
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved