第7章-变量进阶与点阵LED
动画就是图片切换





课后第三题
#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;
}