em đang viết chương trình đổi màu cho led RGB bằng timer0 mode 2, sử dụng ic họ 8051, thạch anh 5Mhz nhưng k hiểu sao lại k làm theo ý mình được.
em muốn nó sáng dần từng con thông qua lệnh switch case nhưng k hiểu sao cứ đến case thứ 2 thì nó lại trở lại case đầu, đây là code của em
void Init_timer0_mode2(void)
{
TMOD &= 0xF0; /* Timer 0 mode 2 with software gate */
TMOD |= 0x02; /* GATE0=0; C/T0#=0; M10=1; M00=0; */
TL0 = 225; /* init values */
TH0 = 225; /* reload value */
ET0=1; /* enable timer0 interrupt */
TR0=1; /* timer0 run */
}
unsigned char PWM_MAIN,PWM0,PWM1,PWM2;
unsigned char PWMS[3],PWMSB[3],PWMSBS[3],tocdo=30,trangthai;
unsigned int stick=0;
long demtt=0;
#define PWM0 P3_1
#define PWM1 P3_3
#define PWM2 P3_4
#define led_r PWMS[0]
#define led_g PWMS[1]
#define led_b PWMS[2]
void RGBC(void);
void timer0(void) interrupt 1
{
TR0=0; //stop timer0
TF0=0; // clear overflows flag
// while(stick>0) stick--;
if(PWM_MAIN>0) PWM_MAIN--; else PWM_MAIN=255;
if(PWMS[0]<PWM_MAIN) PWM0=1; else PWM0=0;
if(PWMS[1]<PWM_MAIN) PWM1=1; else PWM1=0;
if(PWMS[2]<PWM_MAIN) PWM2=1; else PWM2=0;
if(PWMSBS[0]<PWM_MAIN) PWMSB[0]=1; else PWMSB[0]=0;
if(PWMSBS[1]<PWM_MAIN) PWMSB[1]=1; else PWMSB[1]=0;
if(PWMSBS[2]<PWM_MAIN) PWMSB[2]=1; else PWMSB[2]=0;
demtt++;
RGBC();
TR0=1;
}
void RGBC(void)
{
unsigned char buoc;
switch(buoc)
{
case 0:
if(stick>20)
{
if(PWMS[0]<255) PWMS[0]++; else PWMS[0]=0;
stick=0;
}
else stick++;
break;
case 1:
if(stick>20)
{
if(PWMS[0]>0) PWMS[0]--; else PWMS[0]=255;
stick=0;
}
else stick++;
break;
case 2:
if(stick>20)
{
if(PWMS[2]<255) PWMS[2]++; else PWMS[2]=0;
stick=0;
}
else stick++;
break;
case 3:
if(stick>20)
{
if(PWMS[2]>0) PWMS[2]--; else PWMS[2]=255;
stick=0;
}
else stick++;
break;
}
if(demtt>3000)
{
buoc++;
demtt=0;
}
if(buoc>3) buoc=0;
}
em muốn nó sáng dần từng con thông qua lệnh switch case nhưng k hiểu sao cứ đến case thứ 2 thì nó lại trở lại case đầu, đây là code của em
void Init_timer0_mode2(void)
{
TMOD &= 0xF0; /* Timer 0 mode 2 with software gate */
TMOD |= 0x02; /* GATE0=0; C/T0#=0; M10=1; M00=0; */
TL0 = 225; /* init values */
TH0 = 225; /* reload value */
ET0=1; /* enable timer0 interrupt */
TR0=1; /* timer0 run */
}
unsigned char PWM_MAIN,PWM0,PWM1,PWM2;
unsigned char PWMS[3],PWMSB[3],PWMSBS[3],tocdo=30,trangthai;
unsigned int stick=0;
long demtt=0;
#define PWM0 P3_1
#define PWM1 P3_3
#define PWM2 P3_4
#define led_r PWMS[0]
#define led_g PWMS[1]
#define led_b PWMS[2]
void RGBC(void);
void timer0(void) interrupt 1
{
TR0=0; //stop timer0
TF0=0; // clear overflows flag
// while(stick>0) stick--;
if(PWM_MAIN>0) PWM_MAIN--; else PWM_MAIN=255;
if(PWMS[0]<PWM_MAIN) PWM0=1; else PWM0=0;
if(PWMS[1]<PWM_MAIN) PWM1=1; else PWM1=0;
if(PWMS[2]<PWM_MAIN) PWM2=1; else PWM2=0;
if(PWMSBS[0]<PWM_MAIN) PWMSB[0]=1; else PWMSB[0]=0;
if(PWMSBS[1]<PWM_MAIN) PWMSB[1]=1; else PWMSB[1]=0;
if(PWMSBS[2]<PWM_MAIN) PWMSB[2]=1; else PWMSB[2]=0;
demtt++;
RGBC();
TR0=1;
}
void RGBC(void)
{
unsigned char buoc;
switch(buoc)
{
case 0:
if(stick>20)
{
if(PWMS[0]<255) PWMS[0]++; else PWMS[0]=0;
stick=0;
}
else stick++;
break;
case 1:
if(stick>20)
{
if(PWMS[0]>0) PWMS[0]--; else PWMS[0]=255;
stick=0;
}
else stick++;
break;
case 2:
if(stick>20)
{
if(PWMS[2]<255) PWMS[2]++; else PWMS[2]=0;
stick=0;
}
else stick++;
break;
case 3:
if(stick>20)
{
if(PWMS[2]>0) PWMS[2]--; else PWMS[2]=255;
stick=0;
}
else stick++;
break;
}
if(demtt>3000)
{
buoc++;
demtt=0;
}
if(buoc>3) buoc=0;
}
Comment