#include<pic.h>
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;
}
}
|