欢迎光临散文网 会员登陆 & 注册

第7章-变量进阶与点阵LED

2023-08-23 23:18 作者:feifeiluan2  | 我要投稿

动画就是图片切换



课后第三题
#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 code Image[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
         0x99, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3, 0xFF, // u
         0x99, 0x00, 0x00, 0x00, 0x81, 0xC3, 0xE7, 0xFF, // love
         0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3, 0xFF, // i
         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void main(void)
{
    ENLED = 0; // 138总开关打开
    ADDR3 = 0;

    TMOD = 0x01;
    TH0 = 0xFC;
    TL0 = 0x66;
    TR0 = 1;
    EA = ET0 = 1;

    while (1)
    {
    }
}

void Timer0_ISR(void) interrupt 1
{
    static char i = 0;
    static char index = 32;
    static uchar cnt = 0;

    TH0 = 0xFC; // 重装初值
    TL0 = 0x66;

    if (++cnt >= 200)
    {
        cnt = 0;
        if (--index == 0)
        {
            index = 32;
        }
    }

    P0 = 0xFF; // 消影
    switch (i)
    {
    case 0:
        ADDR2 = 0;
        ADDR1 = 0;
        ADDR0 = 0;
        break;
    case 1:
        ADDR2 = 0;
        ADDR1 = 0;
        ADDR0 = 1;
        break;
    case 2:
        ADDR2 = 0;
        ADDR1 = 1;
        ADDR0 = 0;
        break;
    case 3:
        ADDR2 = 0;
        ADDR1 = 1;
        ADDR0 = 1;
        break;
    case 4:
        ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 0;
        break;
    case 5:
        ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 1;
        break;
    case 6:
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 0;
        break;
    case 7:
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 1;
        break;
    }

    P0 = Image[index + i];
    i++;
    i &= 0x07; // 0000-0111;
}


课后第4题
#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 code Image[][8] = {
    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // 0
    {0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0xFF}, // 1
    {0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x7F}, // 2
    {0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x9F, 0x1F, 0x3F}, // 3
    {0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0x0F, 0x1F}, // 4
    {0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x07, 0x0F}, // 5
    {0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x03, 0x87}, // 6
    {0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3}, // 7
    {0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xC0, 0xE1}, // 8
    {0xE6, 0xE6, 0x66, 0x66, 0x66, 0x66, 0xE0, 0xF0}, // 9
    {0x73, 0x73, 0x33, 0xB3, 0xB3, 0x33, 0x70, 0xF8}, // 10
    {0x39, 0x39, 0x99, 0x59, 0xD9, 0x99, 0x38, 0x7C}, // 11
    {0x9C, 0x1C, 0x4C, 0xAC, 0xEC, 0x4C, 0x9C, 0x3E}, // 12
    {0xCE, 0x0E, 0x26, 0xD6, 0xF6, 0x26, 0xCE, 0x1F}, // 13
    {0x67, 0x07, 0x93, 0x6B, 0xFB, 0x93, 0x67, 0x0F}, // 14
    {0x33, 0x03, 0x49, 0xB5, 0xFD, 0x49, 0x33, 0x87}, // 15
    {0x99, 0x81, 0x24, 0x5A, 0x7E, 0x24, 0x99, 0xC3}, // 16
    {0xCC, 0xC0, 0x92, 0xAD, 0xBF, 0x92, 0xCC, 0xE1}, // 17
    {0xE6, 0xE0, 0xC9, 0xD6, 0xDF, 0xC9, 0xE6, 0xF0}, // 18
    {0x73, 0xF0, 0xE4, 0xEB, 0xEF, 0xE4, 0xF3, 0x78}, // 19
    {0x39, 0x78, 0x72, 0x75, 0x77, 0x72, 0x79, 0x38}, // 20
    {0x1C, 0x3C, 0x39, 0x3A, 0x3B, 0x39, 0x3C, 0x1E}, // 21
    {0x0E, 0x9E, 0x9C, 0x9D, 0x9D, 0x9C, 0x9E, 0x0F}, // 22
    {0x87, 0xCF, 0xCE, 0xCE, 0xCE, 0xCE, 0xCF, 0x87}, // 23
    {0xC3, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3}, // 24
    {0xE1, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xF3, 0xE1}, // 25
    {0xF0, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF9, 0xF0}, // 26
    {0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8}, // 27
    {0xFC, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFC}, // 28
    {0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE}, // 29
    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, // 30
};
void main(void)
{
    ENLED = 0; // 138总开关打开
    ADDR3 = 0;

    TMOD = 0x01;
    TH0 = 0xFC;
    TL0 = 0x66;
    TR0 = 1;
    EA = ET0 = 1;

    while (1)
    {
    }
}

void Timer0_ISR(void) interrupt 1
{
    static char i = 0;
    static char index = 30;
    static uchar cnt = 0;

    TH0 = 0xFC; // 重装初值
    TL0 = 0x66;

    if (++cnt >= 200)
    {
        cnt = 0;
        if (--index == 0)
        {
            index = 30;
        }
    }

    P0 = 0xFF; // 消影
    switch (i)
    {
    case 0:
        ADDR2 = 0;
        ADDR1 = 0;
        ADDR0 = 0;
        break;
    case 1:
        ADDR2 = 0;
        ADDR1 = 0;
        ADDR0 = 1;
        break;
    case 2:
        ADDR2 = 0;
        ADDR1 = 1;
        ADDR0 = 0;
        break;
    case 3:
        ADDR2 = 0;
        ADDR1 = 1;
        ADDR0 = 1;
        break;
    case 4:
        ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 0;
        break;
    case 5:
        ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 1;
        break;
    case 6:
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 0;
        break;
    case 7:
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 1;
        break;
    }

    P0 = Image[index][i];
    i++;
    i &= 0x07; // 0000-0111;
}

课后第5题
#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 code Image[][8] = {
    {0xFF, 0xC7, 0xBB, 0xBD, 0x9D, 0xCD, 0xE3, 0xFF}, // 0
    {0xFF, 0xDF, 0xCF, 0xEF, 0xE7, 0xF7, 0xF3, 0xFB}, // 1
    {0xFF, 0xE3, 0xC9, 0xED, 0x2F, 0x87, 0xE7, 0xF7}, // 2
    {0xC1, 0xCF, 0xEF, 0xE3, 0x9F, 0xEF, 0xF1, 0xFF}, // 3
    {0xE7, 0xEB, 0xE9, 0xED, 0xEC, 0xC3, 0xEF, 0xFF}, // 4
    {0xFB, 0xC3, 0xFB, 0xF7, 0xEF, 0xEF, 0xF1, 0xFF}, // 5
    {0xCF, 0xF3, 0xF9, 0xF5, 0xEE, 0xEC, 0xF1, 0xFF}, // 6
    {0xC3, 0xD9, 0xDF, 0xDF, 0xDF, 0xEF, 0xEF, 0xEF}, // 7
    {0xC3, 0xDB, 0xDB, 0xC3, 0xE9, 0xED, 0xED, 0xE1}, // 8
    {0xC3, 0xDB, 0xDB, 0xC3, 0xEF, 0xEF, 0xEF, 0xE1}, // 9
};
void main(void)
{
    ENLED = 0; // 138总开关打开
    ADDR3 = 0;

    TMOD = 0x01;
    TH0 = 0xFC;
    TL0 = 0x66;
    TR0 = 1;
    EA = ET0 = 1;

    while (1)
    {
    }
}

void Timer0_ISR(void) interrupt 1
{
    static char i = 0;
    static char index = 9;
    static uint cnt = 0;

    TH0 = 0xFC; // 重装初值
    TL0 = 0x66;

    if (++cnt >= 1000)
    {
        cnt = 0;
        if (--index < 0)
        {
            index = 9;
        }
    }

    P0 = 0xFF; // 消影
    switch (i)
    {
    case 0:
        ADDR2 = 0;
        ADDR1 = 0;
        ADDR0 = 0;
        break;
    case 1:
        ADDR2 = 0;
        ADDR1 = 0;
        ADDR0 = 1;
        break;
    case 2:
        ADDR2 = 0;
        ADDR1 = 1;
        ADDR0 = 0;
        break;
    case 3:
        ADDR2 = 0;
        ADDR1 = 1;
        ADDR0 = 1;
        break;
    case 4:
        ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 0;
        break;
    case 5:
        ADDR2 = 1;
        ADDR1 = 0;
        ADDR0 = 1;
        break;
    case 6:
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 0;
        break;
    case 7:
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 1;
        break;
    }

    P0 = Image[index][i];
    i++;
    i &= 0x07; // 0000-0111;
}

课后第6题
#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 code Image[][8] = {
    {0xFF, 0xC7, 0xBB, 0xBD, 0x9D, 0xCD, 0xE3, 0xFF}, // 0
    {0xFF, 0xDF, 0xCF, 0xEF, 0xE7, 0xF7, 0xF3, 0xFB}, // 1
    {0xFF, 0xE3, 0xC9, 0xED, 0x2F, 0x87, 0xE7, 0xF7}, // 2
    {0xC1, 0xCF, 0xEF, 0xE3, 0x9F, 0xEF, 0xF1, 0xFF}, // 3
    {0xE7, 0xEB, 0xE9, 0xED, 0xEC, 0xC3, 0xEF, 0xFF}, // 4
    {0xFB, 0xC3, 0xFB, 0xF7, 0xEF, 0xEF, 0xF1, 0xFF}, // 5
    {0xCF, 0xF3, 0xF9, 0xF5, 0xEE, 0xEC, 0xF1, 0xFF}, // 6
    {0xC3, 0xD9, 0xDF, 0xDF, 0xDF, 0xEF, 0xEF, 0xEF}, // 7
    {0xC3, 0xDB, 0xDB, 0xC3, 0xE9, 0xED, 0xED, 0xE1}, // 8
    {0xC3, 0xDB, 0xDB, 0xC3, 0xEF, 0xEF, 0xEF, 0xE1}, // 9
};

// 数码管code
uchar code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

// led,数码管,点阵缓冲区
uchar LedAllBuff[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
            0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// 流水灯数组常量
uchar code LedShift[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F,
             0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD}; // 14个

bit flag220ms = 1;
bit flag1s = 1;

void main(void)
{
    char led_i = 0;
    char led8_i = 9;
    char i;
    ulong sec = 100;

    ENLED = 0; // 138总开关打开
    ADDR3 = 0;

    TMOD = 0x01;
    TH0 = 0xFC;
    TL0 = 0x66;
    TR0 = 1;
    EA = ET0 = 1;

    while (1)
    {
        if (flag220ms)
        {
            flag220ms = 0;

            // Led处理
            LedAllBuff[14] = LedShift[led_i];
            led_i++;
            if (led_i > 13)
            {
                led_i = 0;
            }
        }
        if (flag1s)
        {
            flag1s = 0;

            // 点阵处理
            for (i = 0; i < 8; i++)
            {
                LedAllBuff[i] = Image[led8_i][i];
            }
            led8_i--;
            if (led8_i < 0)
            {
                led8_i = 9;
            }

            // 数码管处理
            sec++;
            LedAllBuff[8] = LedChar[sec % 10];
            LedAllBuff[9] = LedChar[sec / 10 % 10];
            LedAllBuff[10] = LedChar[sec / 100 % 10];
            LedAllBuff[11] = LedChar[sec / 1000 % 10];
            LedAllBuff[12] = LedChar[sec / 10000 % 10];
            LedAllBuff[13] = LedChar[sec / 100000 % 10];
        }
    }
}

void Timer0_ISR(void) interrupt 1
{
    static char i = 0; // 刷新16个器件(实际只有15个)
    static uchar cnt220ms = 0;
    static uint cnt1s = 0;

    TH0 = 0xFC; // 重装初值
    TL0 = 0x66;

    // 判断220ms
    if (++cnt220ms >= 220)
    {
        cnt220ms = 0;
        flag220ms = 1;
    }

    // 判断1s
    if (++cnt1s >= 1000)
    {
        cnt1s = 0;
        flag1s = 1;
    }

    ENLED = 1; // 关闭138

    // 选通138的某一路------到这儿才发现,板卡设计的好,设计的妙
    P1 &= 0xF0; // 低4位干掉
    P1 |= i;    // 低4位变成i

    // 送数据
    P0 = LedAllBuff[i];

    ENLED = 0; // 开启138

    i++;
    i &= 0x0F; // 0000-1111;
}

第7章-变量进阶与点阵LED的评论 (共 条)

分享到微博请遵守国家法律