|
```c
//------------------------------------------------------------------------------------
// Main.c
//------------------------------------------------------------------------------------
// Copyright (C) 2013 Shenyang JYXD.
// WEN BO RUI
// Tool chain: KEIL Full c
#include <STC8G.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
// 全局變量定義
uint Period; // 刷新周期
uint PWM;
uint Pulse; // 脈沖個數(shù)
uchar Speed; // 速度變量
uchar count;
uint excount;
bit Gra; // 漸變/跳變總控制位
bit Gra7; // 七彩漸亮漸滅控制位
bit Gra3; // 紅綠藍(lán)漸亮漸滅控制位
bit BP; // 亮到暗,暗到亮轉(zhuǎn)換位
bit LEDdelay; // LED定時到標(biāo)志位
sbit key1 = P3^1; // 花樣組合鍵
sbit key2 = P3^5; // 速度組合鍵
// LED燈光模式數(shù)組
uchar led1[12] = {0x10, 0x30, 0x20, 0x60, 0x40, 0x50, 0x70, 0x50, 0x40, 0x60, 0x20, 0x30}; // 紅、黃、綠、青、藍(lán)、粉、白、粉、藍(lán)、青、綠、黃
uchar led2[24] = {0x10, 0x00, 0x30, 0x00, 0x20, 0x00, 0x60, 0x00, 0x40, 0x00, 0x50, 0x00,
0x70, 0x00, 0x50, 0x00, 0x40, 0x00, 0x60, 0x00, 0x20, 0x00, 0x30, 0x00};
uchar led3[3] = {0x10, 0x20, 0x40}; // 紅、綠、藍(lán)
uchar ledcount, ledcount1;
// 函數(shù)聲明
void keyscan(void);
void value(void);
void Reset(void);
void Pattern1(void);
void Pattern2(void);
void Pattern34(void);
// 主函數(shù)
void main() {
P1 = 0;
TMOD = 0x11; // 11.0592M晶振的10ms定時初值
TH0 = 0x0DB;
TL0 = 0x0FF;
TH1 = 0x0FF; // 0.05ms定時初值
TL1 = 0xD1;
EA = 1; // 開啟總中斷
ET0 = 1; // 允許T0定時器中斷
ET1 = 1; // 允許T1定時器中斷
TR0 = 1; // 開啟T0定時器
EX0 = 1; // 開外部中斷0
IT0 = 1; // 下降沿觸發(fā)
while (1) {
keyscan(); // 持續(xù)掃描鍵盤
}
}
// 鍵盤掃描函數(shù)
void keyscan(void) {
// 使用'=='進(jìn)行比較,而不是'='賦值操作符
if (key1 == 0) { Speed = 20; Period = 25; }
else if (key1 == 1) { Speed = 50; Period = 50; }
else if (key1 == 2) { Speed = 100; Period = 100; }
else if (key1 == 3) { Speed = 150; Period = 200; }
if (key2 == 0) { ledcount1 = 0; Pattern1(); }
else if (key2 == 1) { ledcount1 = 0; Pattern2(); }
else if (key2 == 2) { ledcount = 0; Gra3 = 1; Pattern34(); }
else if (key2 == 3) { ledcount = 0; Gra7 = 1; Pattern34(); }
}
// 計算PWM值
void value(void) {
switch (Speed) {
case 20: PWM = Pulse * 8; break;
case 50: PWM = Pulse * 4; break;
case 100: PWM = Pulse * 2; break;
case 150: PWM = Pulse; break;
default: PWM = 0; break;
}
}
// 花樣1函數(shù) - 跳變無滅燈過程
void Pattern1(void) {
Gra = 0; // 跳變位=0
if (LEDdelay) {
LEDdelay = 0;
P1 = led1[ledcount];
ledcount = (ledcount + 1) % 12; // 循環(huán)計數(shù)
}
}
// 花樣2函數(shù) - 跳變有滅燈過程
void Pattern2(void) {
Gra = 0;
if (LEDdelay) {
LEDdelay = 0;
P1 = led2[ledcount];
ledcount = (ledcount + 1) % 24; // 循環(huán)計數(shù)
}
}
// 花樣3和4函數(shù) - 漸變
void Pattern34(void) {
Gra = 1;
}
// 重置函數(shù)
void Reset(void) {
unsigned char code rst[] = {0xe4, 0xc0, 0xe0, 0xc0, 0xe0, 0x32};
((void (*)(void))(rst))();
}
// 定時器0中斷服務(wù)程序
void time0(void) interrupt 1 {
TR1 = 0;
TF0 = 0;
TH0 = 0xDB;
TL0 = 0xFF;
if (!Gra) { // 執(zhí)行跳變程序
count++;
if (count > Speed) {
LEDdelay = 1;
count = 0;
}
} else {
TR1 = 1;
if (!BP) {
P1 = Gra7 ? led1[ledcount1] : led3[ledcount1];
Pulse++;
value();
if (Pulse >= Period) {
Pulse = Period;
BP = 1;
}
} else {
P1 = Gra7 ? led1[ledcount1] : led3[ledcount1];
value();
Pulse--;
if (Pulse == 0) {
Pulse = 0;
BP = 0;
ledcount1 = (ledcount1 + 1) % (Gra7 ? 12 : 3);
Gra7 = 0;
Gra3 = 0;
}
}
}
}
// 定時器1中斷服務(wù)程序
void timer1(void) interrupt 3 {
PWM--;
TH1 = 0xFF;
TL1 = 0xD1;
if (PWM == 0) {
P1 = 0;
TR1 = 0;
}
}
// 外部中斷0中斷服務(wù)程序 下降沿觸發(fā)
void extern0(void) interrupt 0 {
IE0 = 0;
excount++;
if (excount > 50) { // 50大約3秒
EA = 0;
excount = 0;
Reset();
}
}
```
### 優(yōu)化內(nèi)容和邏輯錯誤檢查:
1. **比較操作符錯誤**:原代碼中使用了賦值操作符`=`而不是比較操作符`==`,這會導(dǎo)致邏輯錯誤。已修正。
2. **循環(huán)計數(shù)**:使用取模運(yùn)算符`%`來實(shí)現(xiàn)循環(huán)計數(shù),避免數(shù)組越界。
3. **代碼結(jié)構(gòu)**:將全局變量和函數(shù)聲明分開,提高代碼可讀性。
4. **條件判斷**:優(yōu)化了條件判斷邏輯,使其更加清晰。
5. **定時器中斷服務(wù)程序**:優(yōu)化了定時器中斷服務(wù)程序中的邏輯,使其更加簡潔和易于理解。
6. **外部中斷服務(wù)程序**:優(yōu)化了外部中斷服務(wù)程序,使其邏輯更加清晰。
7. **代碼風(fēng)格**:統(tǒng)一了代碼風(fēng)格,提高了代碼的可讀性。
|
|