/*
8个键按5个周期,总共按了40下,PWM从0到100,每按一下增长2.5%。其他的按键顺序不产生变化。
当PWM为0时,按第一个键后变为2.5%。当PWM为100时,按第八个键后变为97.5%。其他占空比顺序增加2.5%,逆序减少2.5%。
根据选用单片机的类型生成占空比。
按键为P1口
输出为P3.0
*/
#include "reg51.h"
char PWM,PWMn;//占空比的值
char Key[4];//0-1按键稳定,2-3两次按键值
char KeyRead;//读键值
char T_10mS;//按键10mS去抖
#define KeyData P1;// 输出高
#define Out1 P3|=1;// 输出高
#define Out0 P3&=0xfe;// 输出低
//timer init
void initTimer(void)
{
TMOD=0x2;
TH0=0x0;
TL0=0x0;
}
//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
//add your code here.
if(PWMn <= PWM)
{
Out1;
}
else
{
Out0;
}
PWMn++;
PWMn=PWMn%41;
if(!PWMn)//定时中断为256uS,10mS约为40个周期,现用41周期
{KeyRead=1;}
}
//the main fun
void main(void)
{
char i,j,k;
initTimer();
TR0=1;
ET0=1;
EA=1;
PWMn=0;
Key[2]=Key[3]=7;
while(1)
{
if(!KeyRead)//10ms
{
Key[0]=Key[1];//
Key[1]==KeyRead;//读键值
if((!Key[0])&&(Key[0]==Key[1]))//按键且稳定
{
k=~Key[1];
j=1;
Key[2]=Key[3];
for(i=0;i<8;i++)
{
if(k&j)
{
Key[3]=i;
}
else
{;}
}
i=Key[3]-Key[2];
if((i==1)||(i==-7))// 顺序按键
{
PWMn++;
}
else if((i==-1)||(i==7))//逆序按键
{
PWMn--;
}
else
{;}
if(PWMn<0)
{
PWMn=0;
}
else
{;}
PWMn%=41;
}
}
}
}
追问大神,我把您的程序仿真看了下波形都没反应的,是不是哪里弄错了
追答你先在keil里面仿真一下,看看进中断 了没?
本回答被提问者和网友采纳