51单片机 漩涡流水点阵

来源:互联网 发布:javascript格式化xml 编辑:程序博客网 时间:2024/05/17 05:54
#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--;elsey--;}void interruptTmr0() interrupt 1 {    static uint i = 0;    TH0 = T0RH;    TL0 = T0RL;    LEDScan();    if (i == rate) {        resetImage();        i = 0;    }    else        i++;}



0 0