#include <reg52.h>
typedef unsigned char uchar;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
uchar code image[5][8] = {
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, //动画帧0
{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3}, //动画帧8
{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7}, //动画帧16
{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3}, //动画帧24
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} //动画帧32
};
void main() {
EA = 1;
ENLED = 0;
ADDR3 = 0;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
while (1);
}
void interruptTimer0() interrupt 1 {
static uchar i = 0, tmr = 0, index = 0;
uchar p = index / 8, q = index % 8;
TH0 = 0xFC;
TL0 = 0x67;
P0 = 0xFF;
P1 = (P1 & 0xF8) | i;
if (q == 0)
P0 = image[p][i];
else
P0 = (image[p][i] << q) | (image[(p+1)%5][i] >> (8-q));
if (i < 7)
i++;
else
i = 0;
if (tmr < 125)
tmr++;
else {
tmr = 0;
if (index < 39)
index++;
else
index = 0;
}
}
反向移动
#include <reg52.h>
typedef unsigned char uchar;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
uchar code image[5][8] = {
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, //动画帧0
{0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3}, //动画帧8
{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7}, //动画帧16
{0xFF,0x99,0x99,0x99,0x99,0x99,0x81,0xC3}, //动画帧24
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} //动画帧32
};
void main() {
EA = 1;
ENLED = 0;
ADDR3 = 0;
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
while (1);
}
void interruptTimer0() interrupt 1 {
static uchar i = 0, tmr = 0, index = 0;
uchar p = index / 8, q = index % 8, tmp;
TH0 = 0xFC;
TL0 = 0x67;
P0 = 0xFF;
P1 = (P1 & 0xF8) | i;
if (q == 0)
P0 = image[p][i];
else {
tmp = (image[p][i] << q) | (image[(p+1)%5][i] >> (8-q));
tmp = (tmp<<1 & 0xAA) | (tmp>>1 & 0x55);
tmp = (tmp<<2 & 0xCC) | (tmp>>2 & 0x33);
tmp = (tmp<<4) | (tmp>>4);
P0 = tmp;
}
if (i < 7)
i++;
else
i = 0;
if (tmr < 125)
tmr++;
else {
tmr = 0;
if (index < 39)
index++;
else
index = 0;
}
}