单片机LED点阵的纵向移动

发布者:玉树琼花最新更新时间:2017-11-15 来源: eefocus关键字:单片机  LED点阵  纵向移动 手机看文章 扫描二维码
随时随地手机看文章

点阵的动画显示,说到底就是对多张图片分别进行取模,使用程序算法巧妙的切换图片,多张图片组合起来就成了一段动画了,我们所看到的动画片、游戏等等,它们的基本原理也都是这样的。

上一节我们学了如何在点阵上画一个❤形,有时候我们希望这些显示是动起来的,而不是静止的。对于点阵本身已经没有多少的知识点可以介绍了,主要就是编程算法来解决问题了。比如我们现在要让点阵显示一个 I ❤ U 的动画,首先我们要把这个图形用取模软件画出来看一下,如图7-10所示。

图7-10 上下移动横向取模

这张图片共有40行,每8行组成一张点阵图片,并且每向上移动一行就出现了一张新图片,一共组成了32张图片。

用一个变量 index 来代表每张图片的起始位置,每次从 index 起始向下数8行代表了当前的图片,250 ms 改变一张图片,然后不停的动态刷新,这样图片就变成动画了。首先我们要对显示的图片进行横向取模,虽然这是32张图片,由于我们每一张图片都是和下一行连续的,所以实际的取模值只需要40个字节就可以完成,我们来看看程序。

#include 

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code image[] = { //图片的字模表
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
    0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3,0xFF,
    0x99,0x00,0x00,0x00,0x81,0xC3,0xE7,0xFF,
    0x99,0x99,0x99,0x99,0x99,0x81,0xC3,0xFF,
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};

void main(){
    EA = 1;  //使能总中断
    ENLED = 0;  //使能 U4,选择 LED 点阵
    ADDR3 = 0;
    TMOD = 0x01; //设置 T0 为模式1
    TH0 = 0xFC; //为 T0 赋初值 0xFC67,定时 1 ms
    TL0 = 0x67;
    ET0 = 1;  //使能 T0 中断
    TR0 = 1;  //启动 T0
    while (1);
    }
    /* 定时器0中断服务函数 */
    void InterruptTimer0() interrupt 1{
    static unsigned char i = 0; //动态扫描的索引
    static unsigned char tmr = 0; //250 ms 软件定时器
    static unsigned char index = 0; //图片刷新索引

    TH0 = 0xFC; //重新加载初值
    TL0 = 0x67;
    //以下代码完成 LED 点阵动态扫描刷新
    P0 = 0xFF;  //显示消隐
    switch (i){
        case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index+0]; break;
        case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index+1]; break;
        case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index+2]; break;
        case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index+3]; break;
        case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index+4]; break;
        case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index+5]; break;
        case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index+6]; break;
        case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index+7]; break;
        default: break;
    }
    //以下代码完成每 250 ms 改变一帧图像
    tmr++;
    if (tmr >= 250){  //达到 250 ms 时改变一次图片索引
        tmr = 0;
        index++;
        if (index >= 32){  //图片索引达到32后归零
           index = 0;
        }
    }
}

大家把这个程序下载到单片机上看看效果,一个 I ❤ U 一直往上走动的动画就出现了,现在还有哪位敢说我们工科同学不懂浪漫的?还需要用什么玫瑰花取悦女朋友吗?一点技术含量都没有,要玩就玩点高科技,呵呵。

当然,别光图开心,学习我们还要继续。往上走动的动画我写出来了,那往下走动的动画,大家就要自己独立完成了,不要偷懒,一定要去写代码调试代码。瞪眼看只能了解知识,而能力是在真正的写代码、调试代码这种实践中培养起来的。


关键字:单片机  LED点阵  纵向移动 引用地址:单片机LED点阵的纵向移动

上一篇:51单片机 8*8LED点阵横向流水 使用位运算生成中间帧
下一篇:单片机LED点阵的介绍

推荐阅读最新更新时间:2024-03-16 15:45

51单片机最小系统是如何构成的
在了解原理之前, 首先让我们思考一个问题,什么是单片机, 单片机有什么用? 这是一个有意思的问题,因为任何人都不能给出一个被大家都认可的概念,那到底什么是单片机呢? 普遍来说, 单片机又称单片微控制器, 是在一块芯片中集成了CPU( 中央处理器)、RAM( 数据存储器)、ROM( 程序存储器)、定时器/ 计数器和多种功能的I/O( 输入/ 输出) 接口等一台计算机所需要的基本功能部件,从而可以完成复杂的运算、逻辑控制、通信等功能。在这里,我们没必要去找到明确的概念来解析什么是单片机,特别在使用C 语言编写程序的时,不用太多的去了解单片机的内部结构以及运行原理等。从应用的角度来说,通过从简单的程序入手,慢慢的熟悉然后逐步深入精通单片
[单片机]
51<font color='red'>单片机</font>最小系统是如何构成的
6课:单片机并行口结构
上两次我们做过两个实验,都是让P1.0这个管脚使灯亮,我们能设想:既然P1.0能让灯亮,那么其它的管脚可不能呢?看一下 图1 ,它是8031单片机管脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都能让灯亮呢?除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个管脚,前面我们以学过7个管脚,加上这32个这39个了。它们都以P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上,除了P10之外,还有P11 - P17都与LED相连,下面让我们来做一个实验,程序如下: MAIN: MOV P1,#0FFH LCALL DELAY MOV P1,#00H LC
[单片机]
6课:<font color='red'>单片机</font>并行口结构
如何用51单片机实现IIC通信
在之前的MCS-51系列单片机中内部没有IIC通信资源,所如果要想用51单片机实现IIC通信,就只能通过软件模拟其时序,这样也能实现IIC通信的功能。 这个是IIC的头文件,便于使用调用: #ifndef _IIC_H_ #define _IIC_H_ /***ucahr和uint 的宏定义很重要,否则下面的函数无法正常运行******/ #define uchar unsigned char //定义uchar型数据为无符号型 #define uint unsigned int //定义uint型数据为无符号型 sbit SCL = P2^3; sbit SDA = P2^4; /***申明外部函数****/ extern
[单片机]
如何用51<font color='red'>单片机</font>实现IIC通信
单片机温湿度光照二氧化碳 智能检测
仿真原理图如下 单片机源程序如下: #include reg51.h #include lcd.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define NACK 0 #define ACK 1 #define MEASURE_TEMP 0x03 //000 0001 1 #define MEASURE_HUMI 0x05 //000 0010 1 #define STATUS_REG_W 0x06
[单片机]
<font color='red'>单片机</font>温湿度光照二氧化碳 智能检测
汽车电子发展的蓝图:汽车超级ECU架构变化
在整理汽车电子发展的时候,看到了一个欧盟赞助的项目是有关于高运算能力的计算平台的发展,这个项目的名称是《European Processor Initiative》它是欧洲发展高运算能力计算平台,面向未来的AI和5G社会的一个研究项目。 在这个研究项目里面,BMW的前瞻研究工程师开了脑洞,在我们已知的域控角度,谈到了2025年和2030年的汽车电子发展的蓝图。如下所示: Processing units of automotive ECUs from past to future 汽车计算平台的发展是硬件和软件集成到一定程度的需求,核心驱动力是随着整个 芯片产业 的发展,汽车电子里面硬件资源也在不断增
[嵌入式]
汽车电子发展的蓝图:汽车超级ECU架构变化
STM32F105系列单片机对USB设备电路的设计
当STM32F105配置为USB设备时, PA9/OTG_FS_VBUS是用来检测presense USB主机的。意法半导体设计评估显示PA9/OTG_FS_VBUS引脚通过一个零欧姆电阻连接到5 VBUS 。有这种方法有两个潜在的问题。该第一电势的问题是, PA9/OTG_FS_VBUS输入,虽然它是5V容限,可能损坏(如每ST支持)如果连接到5V时的STM32F105 VDD为0V。这可能发生在两个自供电和主机供电的应用。当电源关闭/拔出,而USB连接到主机仍处于活动状态,这将发生在一个自供电的应用。这将发生在一个主机供电应用过程中所花费的VDD稳压器来达到它的稳压输出电压所需的时间。一些设计师建议之间的PA9/OTG_FS_
[单片机]
STM32F105系列<font color='red'>单片机</font>对USB设备电路的设计
单片机设计要注意的问题
单片机设计要注意以下几点:   1.不光单片机可以防范解密,偏冷门的相关元器件同样能够起到防范解密的作用。如将偏冷门的器件型号打磨等做法。   2.尽量不要选用MCS51系列单片机,因为该单片机在国内的普及程度最高,解密也最为广泛普及。国内宏晶STC第六代加密技术的单片机可考虑选择,这款单片机是一般的解密器不能解的。   3.如果条件许可,可采用两片不同型号单片机互为备份,相互验证,从而增加破解难度和代价。   4.在选定加密芯片前,要充分调研,了解单片机解密技术的新进展,包括哪些单片机是已经确认可以破解的。尽量不选用已可破解或同系列、同型号的芯片,或者解密代价非常大的芯片。 任何一款单片机芯片,从理论上讲,反向研究只要
[单片机]
基于C8051F060单片机和K9F2808UOC存储器实现数据采集系统的设计
从上个世纪九十年代起,电子技术在钻井井下得到应用。但井下钻具的振动会给很多传感器带来不利影响。 特别是对测量井下钻头姿态的惯性导航传感器影响巨大,在随钻振动环境中,如果对信号不作处理,根本就不能测量出正确的井斜角和方位角,也就无法实现井眼轨迹随钻控制的要求。本文介绍应用SoC芯片中的DMA技术对振动的高速采集和存储功能的实现方法,并给出了钻井环境中测试的结果。 1 方法的提出 传统的数据采集方法采用CPU直接控制的方式进行数据采集,数据传送需要经过CPU的中转才能存入存储器,传送速度慢且采集速率受到CPU的限制,极大影响了系统的采样频率,不能满足对振动信号高速采集的要求。而在DMA传送方式下,数据传送不经过CPU,由DMA
[单片机]
基于C8051F060<font color='red'>单片机</font>和K9F2808UOC存储器实现数据采集系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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