不用定时器也可以控制很多个不同亮度的LED,这个程序应该可以用
#include <reg52.h>
// LED数据结构
struct LedData
{
sbit Bit; // LED的Pin
unsigned char pwm; // LED的PWM数值
};
// 8个LED的数组,缺省PWM=0
struct LedData LED[8] = {
{P1^0, 0},
{P1^1, 0},
{P1^2, 0},
{P1^3, 0},
{P1^4, 0},
{P1^5, 0},
{P1^6, 0},
{P1^7, 0}};
sbit k1=P2^3; // PWM++
sbit k2=P2^0; // PWM--
sbit k3=P2^1; // 转换当前按键控制的灯
void main()
{
unsigned char light; // 当前按键控制的灯
unsigned short key_count; // 按键消抖动
char k1_down, k2_down, k3_down;
unsigned char PWM = 0;
char c;
k1_down = 0;
k2_down = 0;
k3_down = 0;
for(;;)
{
if(k3==0)
{
k3_down = 1;
key_count = 0;
}
else if(k3_down==1)
{
// k3按下后再释放,超过一定时间才认为是有效按键,达到消抖动效果
key_count++;
if(key_count==3000) // 3000是延时,需要根据实际情况修改这个数值
{
// 有效按键,换灯
k3_down = 0;
light = (light+1)%8;
}
}
if(k1==0)
{
k1_down = 1;
key_count = 0;
}
else if(k1_down==1)
{
// k1按下后再释放,超过一定时间才认为是有效按键,达到消抖动效果
key_count++;
if(key_count==3000) // 3000是延时,需要根据实际情况修改这个数值
{
// 有效按键,PWM++
k1_down = 0;
if(LED[light].pwm<245) LED[light].pwm += 10;
}
}
if(k2==0)
{
k2_down = 1;
key_count = 0;
}
else if(k2_down==1)
{
// k2按下后再释放,超过一定时间才认为是有效按键,达到消抖动效果
key_count++;
if(key_count==3000) // 3000是延时,需要根据实际情况修改这个数值
{
// 有效按键,PWM--
k2_down = 0;
if(LED[light].pwm>10) LED[light].pwm -= 10;
}
}
PWM++;
if(PWM==255)
{
// 全部打开
for(c=0;c<8;c++) LED[c].Bit = 0;
PWM = 0;
}
// 根据不同LED的PWM值关闭对应的LED
for(c=0;c<8;c++)
{
if(LED[c].pwm==PWM) LED[c].Bit = 1;
}
}
}
|