永发信息网

单片机通过8个独立按键改变PWM值的问题

答案:2  悬赏:40  手机版
解决时间 2021-03-02 09:25
  • 提问者网友:愿为果
  • 2021-03-01 19:50
单片机通过8个独立按键改变PWM值的问题,8个按键按照从左到右依次按下后,PWM从0渐渐变大,当8个按键依次从左到右重复按了五个周期(一个周期就是从按键1按到按键8)后,PWM才变为最大100,然后反过方向按下那8个按键五个周期后,PWM变回0.关于PWM的生成可以不用管,重要的是这个键盘的扫描判断不知道如何用C语言写的,大神帮帮忙,指教下

对了,还是只用6个按键吧,五个周期的,‘
按键按下的顺序就是K1、K2、K3、K4、K5、K6、K1、K2、K3、K4、K5、K6、K1、K2、K3、K4、K5、K6、K1、K2、K3、K4、K5、K6、K1、K2、K3、K4、K5、K6这样进行,
最佳答案
  • 五星知识达人网友:神鬼未生
  • 2021-03-01 21:23

#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;
}
}
}
}
全部回答
  • 1楼网友:有你哪都是故乡
  • 2021-03-01 22:34
给按键键值,把键值附到占空比去 再看看别人怎么说的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯