可以参考下这个
#include <reg52.h>
#define LED1 P0
#define LED2 P2
#define PWM_Module_Num 16
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
sbit KEY4 = P3^5;
unsigned int LED_Temp[PWM_Module_Num]={ 0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};
unsigned char Flow_Mode;
void Delay(unsigned int Num)
{
unsigned int i,j;
for(i=0;i<Num;i++)
for(j=0;j<110;j++)
;
}
void Time0_Mode1(void)
{
TMOD=0x01; //设置T0为工作方式0
TH0=(65535-50000)/256; //5000us延时
TL0=(65535-50000)%256;
/*Timer0工作在模式0下时为13位定时/计数器,
TL0只使用前5位,故对32进行求余/模 */
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void KEY_Scan(void)
{
if(KEY1 == 0)
{
Delay(1);
if(KEY1 ==0)
{
Flow_Mode = 1;
while(!KEY1);
}
}
if(KEY2 == 0)
{
Delay(1);
if(KEY2 ==0)
{
Flow_Mode = 2;
while(!KEY2);
}
}
if(KEY3 == 0)
{
Delay(1);
if(KEY3 ==0)
{
Flow_Mode = 3;
while(!KEY3);
}
}
if(KEY4 == 0)
{
Delay(1);
if(KEY4 ==0)
{
Flow_Mode = 4;
while(!KEY4);
}
}
}
void main()
{
unsigned int LED;
Time0_Mode1();
while(1)
{
KEY_Scan();
}
}
unsigned char i=0;
unsigned char Old_Mode;
void Timer0()interrupt 1
{
TH0=(65535-50000)/256; //5000us延时
TL0=(65535-50000)%256;
switch(Flow_Mode)
{
case 1:
i++;
if(i==PWM_Module_Num)
i=0;
Old_Mode = Flow_Mode;
LED1 = ~LED_Temp[i]/256;
LED2 = ~LED_Temp[i]%256;
break;
case 2:
i--;
LED1 = ~LED_Temp[i]/256;
LED2 = ~LED_Temp[i]%256;
if(i==0)
i=PWM_Module_Num-1;
Old_Mode = Flow_Mode;
break;
case 3:
P2 = 0x0f;
i=0;
break;
case 4:
Flow_Mode = Old_Mode;
P2 = 0xf0;
break;
default:
Flow_Mode = 1;
break;
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632