51单片机 8*8LED点阵横向流水 使用位运算生成中间帧

#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;
    }
}

 

你可能感兴趣的:(51单片机 8*8LED点阵横向流水 使用位运算生成中间帧)