第7章-變量進(jìn)階與點(diǎn)陣LED
動(dòng)畫(huà)就是圖片切換





課后第三題
#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總開(kāi)關(guān)打開(kāi)
?? ?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總開(kāi)關(guān)打開(kāi)
?? ?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總開(kāi)關(guān)打開(kāi)
?? ?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;
// 點(diǎn)陣圖片
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
};
// 數(shù)碼管code
uchar code LedChar[] = {
??? 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
??? 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};
// led,數(shù)碼管,點(diǎn)陣緩沖區(qū)
uchar LedAllBuff[16] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
?? ??? ??? ?0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
// 流水燈數(shù)組常量
uchar code LedShift[] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F,
?? ??? ??? ? 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD}; // 14個(gè)
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總開(kāi)關(guān)打開(kāi)
?? ?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;
?? ??? ??? ?// 點(diǎn)陣處理
?? ??? ??? ?for (i = 0; i < 8; i++)
?? ??? ??? ?{
?? ??? ??? ??? ?LedAllBuff[i] = Image[led8_i][i];
?? ??? ??? ?}
?? ??? ??? ?led8_i--;
?? ??? ??? ?if (led8_i < 0)
?? ??? ??? ?{
?? ??? ??? ??? ?led8_i = 9;
?? ??? ??? ?}
?? ??? ??? ?// 數(shù)碼管處理
?? ??? ??? ?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個(gè)器件(實(shí)際只有15個(gè))
?? ?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; // 關(guān)閉138
?? ?// 選通138的某一路------到這兒才發(fā)現(xiàn),板卡設(shè)計(jì)的好,設(shè)計(jì)的妙
?? ?P1 &= 0xF0; // 低4位干掉
?? ?P1 |= i;??? // 低4位變成i
?? ?// 送數(shù)據(jù)
?? ?P0 = LedAllBuff[i];
?? ?ENLED = 0; // 開(kāi)啟138
?? ?i++;
?? ?i &= 0x0F; // 0000-1111;
}