51单片机基于Proteus的8X8点阵滚动显示心形

发布者:masphia最新更新时间:2020-03-14 来源: eefocus关键字:51单片机  Proteus  8X8点阵  滚动显示心形 手机看文章 扫描二维码
随时随地手机看文章

一、效果展示及连线方式

注:制作动图时效果显示不好


二、所用材料

1、Proteus中8x8点阵

 

8x8点阵主要分为以下两种:

第一种为行共阴,第二种为行共阳


详细介绍可以参考这位大神说的:


http://www.51hei.com/bbs/dpj-31998-1.html

在Proteus中我选择的是绿色的8x8的点阵,其类型是行共阴


2、74hc595

详细介绍见我上一篇文章


https://blog.csdn.net/qq_41639829/article/details/82151706


3、stc89c52

可以选择其他单片机,我用的这个


三、原理介绍

1、点阵的 “静态显示”

这里所说的静态显示就是不滚动画面的意思,比如你用点阵只显示一个数字,或者只显示一个心形。


首先明白点阵显示的原理就相当于发光二极管一样,只不过是64个发光二极管罢了。

假如你想让第一行全亮,应该怎么做?


很简单,因为是行共阴,所以第一行首先接负极,其他行都接正极或者不接,然后每一列都接正极,这样就可以使第一行全亮。如果第二列不接正极,则第一行的第二列的灯就不会亮,就只亮七个灯。如果第二行这时接地,则第二行也会和第一行一样亮同样的七个灯(不懂得话看看上边的原理图)。


假如你想显示心形应该怎么办?


如果我们想显示上面的这个图形,可知,第一行和第八行是不需要接地的,其他的需要接地。


但是看列,每一列都能用到。如果按照上面说的接线就是下图这个样子(不懂看原理图)。

所以不能采取这种方法,我们采取“扫描”的方式,即一行一行的亮,也就是先第一行接地(其他行不接地),然后如果按照心形的图,就是所有都列都不接正极。然后接着第二行接地(其他行不接地),由心形图可知,需要第二、三、六、七列亮,则这几列接正。再往下是第三行,第三行再接地,然后第一、四、五、八列接正,依次往下。循环一圈后接着再第一行然后一直循环即可。


或许大家会疑惑,假如第二行接地,只有第二行的几个灯亮,那么其他行都是暗的,怎么会看到心形呢,其实这个每一行的切换时间需要很短,几毫秒左右,利用人眼的视觉暂留效应(不懂得可以查一下)来显示,正所谓 ”眼见不一定为实“ 啊。


2、点阵的滚动显示

本实验应为行扫描即行选择端口,所以上下滚动显示,当然也可以左右,大家可以自己探索一下。


滚动显示和静态类似,只不过差别是,在一次循环后回到第一行时,静态情况下是显示第一行应有的列,而滚动是显示上次循环第二行对应的列,第二行就显示第三行对应的列,依次往下,这样就相当于图形往上移了一个格。然后每次循环都说是这样,这样就滚动显示了。不懂可以再看代码。


3、74hc595的原理

详细原理见我上一篇文章


https://blog.csdn.net/qq_41639829/article/details/82151706


四、取模软件

软件来源于网络(使用方法百度一下):


链接:https://pan.baidu.com/s/1fRfJ_QPTqsN8LM9Npya_lQ 密码:avhl


五、Proteus连线方式

如下图:

六、代码展示

#include

#include

 

//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用

//OE 第13脚 输出有效(低电平

//MR 第10脚 主复位(低电平)

 

typedef unsigned char uchar;

typedef unsigned int uint;

 

 

/**********管脚说明********************/

#define P P1   //define 不用加;

 

sbit SER = P3^4;    //p3.4串行数据输入   DS

sbit SCK = P3^6;    //串行输入时钟,上升沿有效    SHCP 第11脚 数据输入时钟线

sbit RCK = P3^5;    //串行寄存器时钟,上升沿有效  STCP 第12脚 输出存储器锁存时钟线

 

/***********************************/

 

/**********函数声明********************/

void SendTo595(uchar byteData);

/***********************************/

 

/**********全局参数声明********************/

char shu=0xFE;

/***********************************/

 

 

void delay(unsigned int n)//延时函数

{

    unsigned int i=0,j=0;

    for(i=0;i        for(j=0;j<123;j++);

}

 

void hang()//行扫描

{

P=shu;

shu=_crol_(shu,1);

}

 

char a[32]={0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,

0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00,

0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,

  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

void main()

{

  int i,b=0;

while(1)

{

int num=12;

while(num--)

{

for(i=0;i<8;i++)

{

hang();     //先位选再段选

SendTo595(a[i+b]);

delay(3);

}

//P=0xFF;

//SendTo595(0x00);

}

  b++;

if(b>=24)b=0;

//P=0xFF;

}

}

 

//发送一个字节数据给595再并行输出

void SendTo595(uchar Data)

{

   int j=0;

   for(j;j<8;j++)

   {

    SCK = 0; 

        SER=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0 

        Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010

        SCK = 1;          //上升沿让串行输入时钟变成高电平 并延时两个时钟周期

        _nop_();

 

   }  

   

   /*位移寄存器完毕,转移到存储寄存器*/

 

RCK = 0;

   RCK = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期

   _nop_();

RCK = 0;

 

}

关键字:51单片机  Proteus  8X8点阵  滚动显示心形 引用地址:51单片机基于Proteus的8X8点阵滚动显示心形

上一篇:51单片机实验8:led点阵(1):点亮一个点
下一篇:使用51单片机实现点阵汉字平滑滚动显示

小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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