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

单片机通过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这样进行,

给按键键值,把键值附到占空比去追问

问题是这个按键的识别不知道怎么写,因为每个周期的同一个按键的PWM值是不一样的,请大神指教,可以不用管PWM的生成,只要某个按键按下后,输出PWM==多少,这样就可以了,

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-01-15
/*
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里面仿真一下,看看进中断 了没?

本回答被提问者和网友采纳
相似回答