//------------------------------------------------------------------------------------
// Main.c
//------------------------------------------------------------------------------------
// Copyright (C) 2013 Shenyang JYXD.
// WEN BO RUI
// Tool chain: KEIL Full c
//
//#pragma CD OE DB SB // Compilation directives
#include <STC8G.H>
#include <intrins.h>
//#include
//#include
#define uchar unsigned char
#define uint unsigned int
uint Period; //Period刷新周期
uint PWM;
uint Pulse; //脈沖個數
uchar Speed; //速度變量
uchar count;
uint excount;
bit Gra; //漸變/跳變總控制位
bit Gra7; //七彩漸亮漸滅控制位
bit Gra3; //紅綠藍漸亮漸滅控制位
bit BP; //亮到暗,暗到亮轉換位
bit LEDdelay ; //LED定時到標志位
sbit key1 = P3^1; //花樣組合鍵
sbit key2 = P3^5; //速度組合鍵
uchar led1[12]={0x10,0x030,0x20,0x60,0x40,0x50,0x70,0x50,0x40,0x60,0x20,0x30};//紅、黃、綠、青、藍、粉、白、粉、藍、青、綠、黃
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}; //紅、綠、藍
uchar ledcount,ledcount1;
//***********************************************************
//以下定義函數
// 1毫秒延時函數delayms();花樣及速度掃描函數keyscan();
//***********************************************************
/*void delayms(unsigned int ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}*/
void Pattern1(); //花樣1函數--------->跳變無滅燈過程
void Pattern2(); //花樣2函數--------->跳變有滅燈過程
void Pattern34();
void keyscan()
{
if(k1 = 0) {Speed = 20;Period = 25;} //預設4種速度200MS
if(k1 = 1) {Speed = 50;Period = 50;} //500MS
if(k1 = 2) {Speed = 100;Period = 100;} //1S
if(k1 = 3) {Speed = 150;Period = 200;} //1.5S
if(k2 = 0) {ledcount1 = 0;Pattern1();} //預設4種花樣
if(k2 = 1) {ledcount1 = 0;Pattern2();}
if(k2 = 2) {ledcount = 0;Gra3 = 1;Pattern34();}
if(k2 = 3) {ledcount = 0;Gra7 = 1;Pattern34();}
}
void value()
{
if(Speed == 20) PWM = Pulse*8;
if(Speed == 50) PWM = Pulse*4; //脈沖個數
if(Speed == 100)PWM = Pulse*2;
if(Speed == 150)PWM = Pulse;
}
void Reset(void)
{
unsigned char code rst[ ]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};
(*((void (*)(void))(rst)))();
}
void main()
{
_nop_ ();
_nop_ ();
_nop_ ();
P1 = 0;
TMOD = 0x11; //11.0592M晶振的10ms定時初值(100分之一秒)
TH0 = 0x0db;
TL0 = 0x0ff;
TH1 = 0x0ff; //0.05ms(20000分之一秒)
TL1 = 0x0D1;
EA = 1; //開啟總中斷允許
ET0 = 1; //允許T0定時器中斷
ET1 = 1; //允許T1定時器中斷
TR0 = 1; //開啟T0定時器
EX0=1; //開外部中斷0
IT0=1; //下降沿觸發
while(1)
{
keyscan();
}
}
//*************************************************************************
//Pattern1() 花樣函數1-------------跳變無滅燈過程
//*************************************************************************
void Pattern1()
{
//keyscan();
Gra = 0; //跳變位=0
if(LEDdelay)
{
LEDdelay = 0;
P1 = led1[ledcount];
ledcount++;
if(ledcount>11)
{
ledcount = 0;
}
}
}
//***********************************************************************
//Pattern2() 花樣函數2-------------跳變有滅燈過程
//***********************************************************************
void Pattern2()
{
keyscan();
Gra = 0;
if(LEDdelay)
{
LEDdelay = 0;
P1 = led2[ledcount];
ledcount++;
if(ledcount>23)
{
ledcount = 0;
}
}
}
//***********************************************************************
//Pattern3() 花樣函數3-------------3彩漸變
//***********************************************************************
void Pattern3()
{
keyscan();
if(Speed == 20) Period = 25;
if(Speed == 50) Period = 50;
if(Speed == 100)Period = 100;
if(Speed == 150)Period = 200;
Gra = 1;
Gra3 = 1;
}
//***********************************************************************
//Pattern4() 花樣函數4-------------7彩漸變
//***********************************************************************
void Pattern34()
{
Gra = 1; //漸變位 = 1
}
/*********************************************************/
// 定時器0中斷服務程序
/*********************************************************/
void time0(void) interrupt 1
{
TR1 =0;
TF0 =0;
TH0=0xdb; //重新寫入初值
TL0=0xff;
if(!Gra) //執行跳變程序
{
count ++;
if(count > Speed)
{
LEDdelay = 1;
count = 0;
}
}
if(Gra)
{
TR1 = 1; //開啟TR1;
if(!BP) //
{
if(Gra7)
{
P1 = led1[ledcount1]; //10ms到,亮相應的LED
}
if(Gra3)
{
P1 = led3[ledcount1]; //10ms到,亮相應的LED
}
Pulse++;
value();
if(Pulse >= Period)
{
Pulse = Period;
BP = 1; //一個周期完成轉換模式
}
}
if(BP)
{
if(Gra7)
{
P1 = led1[ledcount1]; //10ms到,亮相應的LED
}
if(Gra3)
{
P1 = led3[ledcount1]; //10ms到,亮相應的LED
}
value();
Pulse--; //脈沖個數
if(Pulse == 0)
{
Pulse = 0;
BP = 0; //一個周期完成轉換模式
ledcount1++;
if(Gra7)
{
if(ledcount1 > 11)
{
ledcount1 = 0;
}
Gra7 = 0;
}
if(Gra3)
{
if(ledcount1 > 2)
{
ledcount1 = 0;
}
Gra3 = 0;
}
}
}
}
}
/*********************************************************/
// 定時器1中斷服務程序
/*********************************************************/
void timer1() interrupt 3
{
PWM --;
TH1 = 0xff; //0.05ms(20000分之一秒)
TL1 = 0xD1;
if(PWM == 0)
{
P1 = 0;
TR1 = 0;
}
}
/*********************************************************/
// 外部中斷0中斷服務程序 下降沿觸發
/*********************************************************/
void extern0(void) interrupt 0
{
IE0 = 0; // 清標志位
excount++;
if(excount>50) // 50大約3秒
{
EA = 0;
//P1_5 = 1;
excount = 0;
Reset();
}
} |