我想写的程序是根据两个按键SW1,SW2的按下次数控制输出PWM的占空比
主程序如下:
INT32 main(VOID)
{
UINT8 ucRecord=0; //记录SW1按下的奇偶次,按下奇次时为1,按下偶次时为0,即按键SW1控制PWM波的输出与否
INT32 ucSpeed=0;
KeyInit(); //按键SW1(P3.2口),SW2(P3.6口)的初始化
LEDShowInit(); //用于显示的LED灯的初始化
/*PWM初始化,输出频率为10kHz*/
PWMInit();//用到PWM2345,即单片机要输出四路PWM波
TMR0Init(); //定时器0初始化,设计程序每隔20ms扫描一次按键,20ms的间隔用定时器中断实现
while(1)
{
/*每隔20ms进行一次按键检测*/
if(g_bTimer0IRQEvent)
{
g_bTimer0IRQEvent = 0; //进入定时器中断函数
ucRecord = KeyRead(); //按键扫描函数,检测SW1,SW2是否按下,SW1和SW2按下时ucRecord的第2位
//和第六位分别为1
if(ucRecord) //如果有按键按下
{
if(ucRecord & (1<<2)) //如果SW1按下
{
if(ucSpeed) //如果SW1之前按下过(按下偶数次)
{
ucSpeed = 0; //PWM停止输出控制
}
else
{
ucSpeed = 1; //如果SW1之前未按下过(按下奇数次),PWM开始输出
}
}
if((ucRecord & (1<<6)) && (ucSpeed)) //如果SW2按下,且SW1按下奇数次,
//即PWM是允许输出状态
{
ucSpeed = ucSpeed + 1; //SW2按键用于控制改变占空比,此时改变ucSpeed值表示切换占空比
ucSpeed = ucSpeed % 4;//设置三种PWM波占空比模式
if(!ucSpeed)
{
ucSpeed = 1; //多次按下SW2时,三种PWM波占空比模式循环设置
}
}
}
switch(ucSpeed)
{
case 0: //PWM波停止输出状态
{
CMR2A = 0;
CMR3A = 0;
CMR0B = 0;
CMR1B = 0;
}break;
case 1://占空比40%
{
CMR2A = 96;//PWM2,PWM为中心对齐模式
CMR3A = 96;
CMR0B = 144; //PWM4,PWM45设置为反向输出,实现PWM23和PWM45之间的180度相位差
CMR1B = 144;
P0_DOUT &=~ (1<<1); //点亮LED6
P3_DOUT |= (3<<4); //LED78灭
}break;
case 2://占空比60%
{
CMR2A = 144;//PWM2
CMR3A = 144;
CMR0B = 96; //PWM4
CMR1B = 96;
P0_DOUT |= (1<<1);
P3_DOUT &=~ (1<<4); //LED7亮
P3_DOUT |= (1<<5);
}break;
case 3://占空比80%
{
CMR2A = 192;//PWM2
CMR3A = 192;
CMR0B = 48; //PWM4
CMR1B = 48;
P0_DOUT |= (1<<1);
P3_DOUT |= (1<<4);
P3_DOUT &=~ (1<<5); //LED8亮
}break;
default:break;
}
}
}
}
问题,该程序烧写到板子上的时候,按下SW1键,松开瞬间LED6会亮,然后就一直不亮了。按下SW1后,再按SW2时板子没有任何反应,即LED78均不会亮。
程序中,有if语句判断,理论上应该是,在没有按键按下时,ucRecord为0,不进入if语句,那么各参数的配置不会变,也就是,LED灯可以一直亮,但从板子实现来看,好像是各参数的值在每次循环中都会初始化
求解决办法(完整的工程在附件中,程序是在keil4上写的,芯片信息M052ZDN)
|