430单片机程序,用pwm以按键控制灯泡亮度,我感觉程序没有错,为什么按键没有反应。
求大佬指点
#include <msp430.h>#include "L12864.h"#define keyin (P6IN&BIT1)#define keyin1 (P6IN&BIT2)#define CPU_F ((double)1035000)#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))int ii,x=300;void Timer_A2_1_init() //TA2.1输出PWM P2.4输出{ TA2CTL |= TASSEL_1+MC_1; //ACLK,增计数 TA2CCTL1 = OUTMOD_7; //输出模式7 TA2CCR0 = 512-1;//时钟频率为32768HZ,1KHZ if (x<0){ x=0; } if(x>500){ x=500; } TA2CCR1 =x ; //x//占空比CCR1/CCR0=1/4 左}void IO_init(){ P2SEL|=BIT4; P2DIR|=BIT4;//P2.4输出 P6OUT|=BIT1;//P2配置为输入,P2.2为按键 P6REN|=BIT1; //给按键上拉,通过上拉给上高频 P6OUT=BIT2; //P2配置为输入,P2.0为按键 P6REN|=BIT2; //给按键上拉,通过上拉给上高频 TA0CCTL0 = CCIE; //设置捕获/比较控制寄存器中CCIE位为1,CCR0捕获/比较功能中断为允许。 TA0CCR0 = 512-1; //约1ms.实现X*(1/32768)=Y秒的定时,捕获/比较控制寄存器CCR0初值为32768。 TA0CTL = TASSEL_1+ID_0 + MC_1; //时钟源选择为ACLK(32768HZ)、1分频、增计数模式(0-CCR0溢出),32768/1=32768 HZ.// _BIS_SR(LPM0_bits + GIE); //进入低功耗模式LPM0和开中断 __enable_interrupt(); //开总中断}void anjian(){ if(!keyin)//如果有键按下 { delay_ms(10);//延时消抖 if(!keyin)//再次检测按键状态 { delay_ms(300); if(!keyin) { x++; } else { x++; } } while(!keyin);//等待按键被放开 } if(!keyin1)//如果有键按下 { delay_ms(10);//延时消抖 if(!keyin1)//再次检测按键状态 { delay_ms(300); if(!keyin1) { x--; } else { x--; } } while(!keyin1);//等待按键被放开 }}int main(void) { WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timer port_init(); LCD_Init(); LCD_CLS(); IO_init(); //ADC(); while(1) { //chazhi(); xianshi(); anjian(); }//return 0;}//void light()//{ P2OUT |= BIT0; // P2DIR |= BIT0;//}void xianshi(){ ii++; if(ii>50) { LCD_CLS(); ii=0; } LCD_Write_6x8Int(82,3,x);}
求大佬指点
#include <msp430.h>#include "L12864.h"#define keyin (P6IN&BIT1)#define keyin1 (P6IN&BIT2)#define CPU_F ((double)1035000)#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))int ii,x=300;void Timer_A2_1_init() //TA2.1输出PWM P2.4输出{ TA2CTL |= TASSEL_1+MC_1; //ACLK,增计数 TA2CCTL1 = OUTMOD_7; //输出模式7 TA2CCR0 = 512-1;//时钟频率为32768HZ,1KHZ if (x<0){ x=0; } if(x>500){ x=500; } TA2CCR1 =x ; //x//占空比CCR1/CCR0=1/4 左}void IO_init(){ P2SEL|=BIT4; P2DIR|=BIT4;//P2.4输出 P6OUT|=BIT1;//P2配置为输入,P2.2为按键 P6REN|=BIT1; //给按键上拉,通过上拉给上高频 P6OUT=BIT2; //P2配置为输入,P2.0为按键 P6REN|=BIT2; //给按键上拉,通过上拉给上高频 TA0CCTL0 = CCIE; //设置捕获/比较控制寄存器中CCIE位为1,CCR0捕获/比较功能中断为允许。 TA0CCR0 = 512-1; //约1ms.实现X*(1/32768)=Y秒的定时,捕获/比较控制寄存器CCR0初值为32768。 TA0CTL = TASSEL_1+ID_0 + MC_1; //时钟源选择为ACLK(32768HZ)、1分频、增计数模式(0-CCR0溢出),32768/1=32768 HZ.// _BIS_SR(LPM0_bits + GIE); //进入低功耗模式LPM0和开中断 __enable_interrupt(); //开总中断}void anjian(){ if(!keyin)//如果有键按下 { delay_ms(10);//延时消抖 if(!keyin)//再次检测按键状态 { delay_ms(300); if(!keyin) { x++; } else { x++; } } while(!keyin);//等待按键被放开 } if(!keyin1)//如果有键按下 { delay_ms(10);//延时消抖 if(!keyin1)//再次检测按键状态 { delay_ms(300); if(!keyin1) { x--; } else { x--; } } while(!keyin1);//等待按键被放开 }}int main(void) { WDTCTL = WDTPW | WDTHOLD;// Stop watchdog timer port_init(); LCD_Init(); LCD_CLS(); IO_init(); //ADC(); while(1) { //chazhi(); xianshi(); anjian(); }//return 0;}//void light()//{ P2OUT |= BIT0; // P2DIR |= BIT0;//}void xianshi(){ ii++; if(ii>50) { LCD_CLS(); ii=0; } LCD_Write_6x8Int(82,3,x);}