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

双向流水:

#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);
	image[7-y] ^= (0x01 << 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-1)
		y++;
	else if (y >= x-1 && 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++;
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值