#include typedef unsigned int uint; typedef unsigned char uchar; #define KEY0_DOWN() (RB4==0)//定义按键按下 __CONFIG(0X1014);//内部时钟 uchar KEY0_FLAG=0; /*************************/ //OSC SET; INTER 4MHZ PERIOD 1US /*************************/ void OSC_INIT() { OSCCON=0X67;//设置内部时钟4MHZ } /*************************/ //DELAY FUNCtiON(); /*************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /*************************/ //GPIO SET; /*************************/ void GPIO_INIT() { TRISC5=0;//RC5 SET PWM OUT; TRISD2=0;//RD2 SET PWM OUT; RC5=RD2=0; TRISB4=1; IOCB4=1;//使能RB4电平变化中断 WPUB=0X10;//使能上拉 RBIE=1; RBIF=0; PEIE=1; GIE=1; } /*************************/ //PWM MODEL INIT; /*************************/ void PWM_INIT() { CCP1CON=0B00001100;//PWM 模式 CCP2CON=0B00001100;//PWM 模式 T2CKPS1=1; PR2=155;//PWM周期=【PR2+1】*4*TOSC*T2预分频值 故PWM频率=1/周期=400HZ TMR2ON=1; CCPR1L=0;//占空比=CCPR1L:CCP1CON<5:4>/4(PR2+1); CCPR2L=0;//占空比=CCPR2L:CCP2CON<5:4>/4(PR2+1); } void main() { GPIO_INIT(); PWM_INIT(); while(1);//初始化完毕等中断响应就OK } //中断响应入口 void interrupt ALL_ISR()//输出10%-100%占空比的PWM波形 { if(RBIF) { delay(5); if(KEY0_DOWN()) { KEY0_FLAG++; if(KEY0_FLAG==11)KEY0_FLAG=0; } switch(KEY0_FLAG) { case 0:CCPR1L=CCPR2L=0;break; case 1:CCPR1L=CCPR2L=16;break; case 2:CCPR1L=CCPR2L=32;break; case 3:CCPR1L=CCPR2L=47;break; case 4:CCPR1L=CCPR2L=62;break; case 5:CCPR1L=CCPR2L=78;break; case 6:CCPR1L=CCPR2L=94;break; case 7:CCPR1L=CCPR2L=109;break; case 8:CCPR1L=CCPR2L=125;break; case 9:CCPR1L=CCPR2L=141;break; case 10:CCPR1L=CCPR2L=156;break; default:break; } RBIF=0; } } |
更多回帖