您的位置:首页 > 其它

51单片机 漩涡流水点阵

2014-12-03 23:09 281 查看
#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++;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: