极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19779|回复: 5

8*8点阵做的动画

[复制链接]
发表于 2016-6-11 16:42:41 | 显示全部楼层 |阅读模式
用51单片机做的8*8点阵动画。各种样式显示 I O U.
想不出来还有什么简单点的动画可以做出来的了,欢迎大家出出主意。
喔喔,插入动画还要第三方视频网站,暂时不想弄了
有兴趣的把代码下载进去看看效果吧。
8*8点阵用的是 max7219的标准模块
点阵显示很简单, 生成动画复杂一点
欢迎提意见,谢谢

[pre lang="c51" line="1"]#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
//定义Max7219端口
sbit Max7219_pinCLK = P2^2;
sbit Max7219_pinCS  = P2^1;
sbit Max7219_pinDIN = P2^0;
uchar code disp_data[6][8]={
{0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x7e},        //I
{0x66,0xff,0xff,0xff,0x7e,0x3c,0x18,0x81},        //V
{0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x66,0x3c},        //U
{0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55},        //花屏1
{0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa},        //花屏2
};

//随机数生成函数

//延时函数
void delay_xms(uint x)
{
        uint i,j;
        for(i=0;i<x;i++)
                for(j=0;j<112;j++);
}
//--------------------------------------------
//功能:向MAX7219(U3)写入字节
//入口参数:DATA
//出口参数:无
//说明:
void Write_Max7219_byte(uchar DATA)         
{
        uchar i;   
        Max7219_pinCS=0;               
        for(i=8;i>=1;i--)
          {                  
            Max7219_pinCLK=0;
            Max7219_pinDIN=DATA&0x80;
            DATA=DATA<<1;
            Max7219_pinCLK=1;
           }                                 
}
//-------------------------------------------
//功能:向MAX7219写入数据
//入口参数:address、dat
//出口参数:无
//说明:
void Write_Max7219(uchar address,uchar dat)
{
     Max7219_pinCS=0;
         Write_Max7219_byte(address);           //写入地址,即数码管编号
     Write_Max7219_byte(dat);               //写入数据,即数码管显示数字
         Max7219_pinCS=1;                        
}

void Init_MAX7219(void)
{
        Write_Max7219(0x09, 0x00);       //译码方式:BCD码
        Write_Max7219(0x0a, 0x01);       //亮度
        Write_Max7219(0x0b, 0x07);       //扫描界限;8个数码管显示
        Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1
        Write_Max7219(0x0f, 0x00);       //显示测试:1;测试结束,正常显示:0
}
/*
void add_point(uchar x,uchar y){
       
} */  

//获取字节的某位数据
uchar mask(uchar dat,uchar add){
        switch(add){
                case 0: return dat&=0x01;
                break;
                case 1: return dat&=0x02;
                break;
                case 2: return dat&=0x04;
                break;
                case 3: return dat&=0x08;
                break;
                case 4: return dat&=0x10;
                break;
                case 5: return dat&=0x20;
                break;
                case 6: return dat&=0x40;
                break;
                case 7: return dat&=0x80;
                break;
                default: return dat;
                break;
        }
}

//设置字节的某位数据
uchar set_mask(uchar dat,uchar add){
        switch(add){
                case 0: return dat|=0x01;
                break;
                case 1: return dat|=0x02;
                break;
                case 2: return dat|=0x04;
                break;
                case 3: return dat|=0x08;
                break;
                case 4: return dat|=0x10;
                break;
                case 5: return dat|=0x20;
                break;
                case 6: return dat|=0x40;
                break;
                case 7: return dat|=0x80;
                break;
                default: return dat;
                break;
        }
}

//清除字节的某位数据
uchar cls_mask(uchar dat,uchar add){
        switch(add){
                case 0: return dat&=0xfe;
                break;
                case 1: return dat&=0xfd;       
                break;
                case 2: return dat&=0xfb;
                break;
                case 3: return dat&=0xf7;
                break;
                case 4: return dat&=0xef;
                break;
                case 5: return dat&=0xdf;
                break;
                case 6: return dat&=0xbf;
                break;
                case 7: return dat&=0x7f;
                break;
                default: return dat;
                break;
        }
}

//图像随机出现          
disp_mem[8];         //全局disp_mem[8] 显示空间  
void appear_random(uchar disp[]){
         uchar i,j,disp_x,disp_y,comp_flag;
         uchar x[8];        //x[8]标志位,                          
         for(i=0;i<8;i++) x=0;
         for(i=0;i<8;i++) disp_mem=0;
         for(comp_flag=0;comp_flag<64;){               
                        j=(uchar)(rand()%64);
                        disp_x=j/8;         //计算坐标
                        disp_y=j%8;
                        if( mask(x[disp_x],disp_y)!=0 ) continue;  //判断是否已经显示
                        x[disp_x]=set_mask(x[disp_x],disp_y);
                        //if ( mask(disp[disp_x],disp_y+1)==0 ) continue;
                        comp_flag++        ;   //成功显示了一个点
                        disp_mem[disp_x]|=mask(disp[disp_x],disp_y);
                        //P0=disp_mem[disp_x]=disp[disp_x];       
                        //comp_flag++;
                        Write_Max7219(disp_x+1,disp_mem[disp_x]);
                        delay_xms(21);
                        //Write_Max7219(0x0a, j%16);
                }
                       
}

//当前图像随机消失       
void disappear_random(){
         uchar i,j,disp_x,disp_y,comp_flag;
         uchar x[8]; //x[8]标志位
         for(i=0;i<8;i++) x=0;
         for(comp_flag=0;comp_flag<64;){               
                        j=(uchar)(rand()%64);
                        disp_x=j/8;         //计算坐标
                        disp_y=j%8;
                        if( mask(x[disp_x],disp_y)!=0 ) continue;  //判断是否已经显示
                        x[disp_x]=set_mask(x[disp_x],disp_y);
                        //if ( mask(disp[disp_x],disp_y+1)==0 ) continue;
                        comp_flag++        ;   //成功消失了一个点
                        disp_mem[disp_x]&=cls_mask(disp_mem[disp_x],disp_y);
                        //P0=disp_mem[disp_x]=disp[disp_x];       
                        //comp_flag++;
                        Write_Max7219(disp_x+1,disp_mem[disp_x]);
                        delay_xms(10);
                        //Write_Max7219(0x0a, j%16);
                }
                       
}

//一行一行堆积出现
void  puil_up(uchar disp_data[]){
        uchar i,j,m;
        for(j=8;j>0;j--){
                for(i=1;i<=j;i++){
                        m=0xe0;
                        if(i!=1) Write_Max7219(i-1,0x00);
                        m>>=i;
                        Write_Max7219(i,m);
                        delay_xms(150);
                }
                Write_Max7219(j,disp_data[j-1]);
                delay_xms(50);
        }
}

//从中心旋转显示
void center_rotate(uchar disp_data[]){
          uchar i,temp_data;
          char j;
          uint time=130;
          temp_data=disp_data[3]&0x10;
      Write_Max7219(4,temp_data);
          delay_xms(time);
          for(j=3;j>=0;j--){
                    for(i=j;i<8-j;i++){
                          if(j==3) temp_data=disp_data&0x18;
                        else if(j==2)  temp_data=disp_data&0x3c;
                        else if(j==1)  temp_data=disp_data&0x7e;
                        else if(j==0)  temp_data=disp_data;
                        //else if(j==2)  temp_data=disp_data&0x3c;
                          Write_Max7219(i+1,temp_data);
                 
                    }                delay_xms(time);
          
          }
         
          
          
}
void main(void)
{
        uchar i,j;
       
        //uchar x[64];
        //uchar disp_mem[8];
        Init_MAX7219();         
        srand(6);         //设置随机数种子

        for(i=1;i<9;i++) Write_Max7219(i,0xff);         //显示所有点
        delay_xms(300);
        while(1)
        {       
                for(i=1;i<9;i++) Write_Max7219(i,0x00);          //消失所有点

                center_rotate(disp_data[1]);
                delay_xms(2000);

                puil_up(disp_data[1]);

                //while(1);
                delay_xms(1000);
                //for(i=1;i<9;i++) Write_Max7219(i,disp_data[3][i-1]);
                delay_xms(500);       
                appear_random(disp_data[3]);
                delay_xms(1000);
                disappear_random();
               
                appear_random(disp_data[1]);
                delay_xms(1000);
                disappear_random();
                appear_random(disp_data[2]);
                delay_xms(1000);
                disappear_random();
                delay_xms(1000);
               

               

                //  

                for(j=0;j<3;j++){
                      for(i=1;i<16;i++){
                                Write_Max7219(0x0a, i);
                                delay_xms(50);  
                        }
                        delay_xms(200);
                        for(i=15;i>0;i--){
                                Write_Max7219(0x0a, i);
                                delay_xms(50);  
                        }
                        delay_xms(200);
                }
                 

                delay_xms(1000);       
               
        }
}[/code]
回复

使用道具 举报

发表于 2016-6-12 08:58:49 | 显示全部楼层
好,有创意........................

uchar mask(uchar dat,uchar add)
uchar set_mask(uchar dat,uchar add)
uchar cls_mask(uchar dat,uchar add)
可以简化
将0x01、0x02、0x04... 存到数组mask[]中
       dat |= mask[add];
       dat &= mask[add];
回复 支持 反对

使用道具 举报

发表于 2016-6-12 15:11:49 | 显示全部楼层
嗯,最近正在研究点阵,留爪
回复 支持 反对

使用道具 举报

发表于 2016-7-3 17:27:32 | 显示全部楼层
不错,我试了很好
回复 支持 反对

使用道具 举报

发表于 2016-7-7 17:05:16 | 显示全部楼层
有Arduino的程序吗?
回复 支持 反对

使用道具 举报

发表于 2016-7-20 08:53:04 | 显示全部楼层
我也留下爪印,研究点阵的时候还要回来看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 07:30 , Processed in 0.054570 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表