51单片机 漩涡流水点阵

#include <reg52.h>

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

uchar image[8] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
uchar T0RH, T0RL;
uint rate;

void LEDScan();
void resetImage();
void configTmr0(uint ms1, uchar ms2);

void main() {
	EA = 1;
	ADDR3 = 0;
	ENLED = 0;
    configTmr0(50, 2);
    while (1) ;
}

void configTmr0(uint ms1, uchar ms2) {
    ulong tmp;

    rate = ms1 / ms2;

    tmp = 11059200 / 12;      //定时器计数频率
    tmp = (tmp * ms2) / 1000;  //计算所需的计数值
    tmp = 65536 - tmp;        //计算定时器重载值
    tmp = tmp + 12;           //补偿中断响应延时造成的误差
    T0RH = tmp >> 8;  //定时器重载值拆分为高低字节
    T0RL = tmp;

	TMOD &= 0xF0;
    TMOD |= 0x01;   
    TH0 = T0RH;     
    TL0 = T0RL;
    ET0 = 1;        
    TR0 = 1;       
}

#define LEDScan(); {	\
    static uchar i = 0;	 	\
    P0 = 0xFF;				\
    P1 = (P1 & 0xF8) | i;	\
    P0 = image[i];			\
    i = ++i & 0x07;			\
}

void resetImage() {			
    static uchar x = 0, y = 0;	
								
    image[y] ^= (0x80 >> x);	
    if (x == 3 && y == 4) {		
        x = 0;
        y = 0;
    }
    else if (y <= x + 1 && x + y < 7) {
        x++;
    }
    else if (x + y >= 7 && y < x) {
        y++;
    }
    else if (y >= x && x + y > 7) {
        x--;
    }
    else
        y--;
}

void interruptTmr0() interrupt 1 {
    static uint i = 0;

    TH0 = T0RH;
    TL0 = T0RL;
    LEDScan();
    if (i == rate) {
        resetImage();
        i = 0;
    }
    else
        i++;
}

你可能感兴趣的:(51单片机 漩涡流水点阵)