|
|
用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] |
|