// // // // CCAP0L
CCAP0L
CCAP0L
}
return;
PCAx->PCA_Interrupt_Mode &= (3<<4) + 1; if(PCAx->PCA_Mode >= PCA_Mode_SoftTimer)
PCAx->PCA_Interrupt_Mode &= ~(3<<4);
if(PCA_id == PCA0) { CCAPM0 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; //工作模式, 中断模式 PCA_PWM0 = (PCA_PWM0 & ~(3<<6)) | PCAx->PCA_PWM_Wide; //PWM宽度 if( PCAx->PWMCFG==1) //自己设置的有待验证 PWMCFG=PWMCFG | 0x20; else PWMCFG=PWMCFG & 0xDF; PCA_Timer0 = PCAx->PCA_Value; B_Capture0 = 0; PCA0_mode = PCAx->PCA_Mode; CCAP0_tmp = PCA_Timer0; CCAP0L = (u8)CCAP0_tmp; //将影射寄存器写入捕获寄存器,先写 CCAP0H = (u8)(CCAP0_tmp >> 8); //后写CCAP0H }
if(PCA_id == PCA1) { CCAPM1 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; PCA_PWM1 = (PCA_PWM1 & ~(3<<6)) | PCAx->PCA_PWM_Wide; PCA_Timer1 = PCAx->PCA_Value; B_Capture1 = 0; PCA1_mode = PCAx->PCA_Mode; CCAP1_tmp = PCA_Timer1; CCAP1L = (u8)CCAP1_tmp; //将影射寄存器写入捕获寄存器,先写 CCAP1H = (u8)(CCAP1_tmp >> 8); //后写CCAP0H }
if(PCA_id == PCA2) { CCAPM2 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; PCA_PWM2 = (PCA_PWM2 & ~(3<<6)) | PCAx->PCA_PWM_Wide; }
PCA_Timer2 = PCAx->PCA_Value; B_Capture2 = 0;
PCA2_mode = PCAx->PCA_Mode; CCAP2_tmp = PCA_Timer2; CCAP2L = (u8)CCAP2_tmp;
//将影射寄存器写入捕获寄存器,先写
CCAP2H = (u8)(CCAP2_tmp >> 8); //后写CCAP0H
}
//======================================================================== // 函数: void PCA_Handler (void) interrupt PCA_VECTOR // 描述: PCA中断处理程序. // 参数: None // 返回: none.
// 版本: V1.0, 2012-11-22
//======================================================================== void PCA_Handler (void) interrupt PCA_VECTOR { if(CCF0) //PCA模块0中断 { CCF0 = 0; //清PCA模块0中断标志 if(P25) CCAP0_tmp += PCA_Timer0; //输出为高电平,则给影射寄存器装载高电平时间长度
else CCAP0_tmp += PWM0_low; //输出为低电平,则给影射寄存器装载低电平时间长度 CCAP0L = (u8)CCAP0_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
CCAP0H = (u8)(CCAP0_tmp >> 8); //后写CCAP0H } if(CCF1) //PCA模块1中断 { CCF1 = 0; //清PCA模块1中断标志 if(P26) CCAP1_tmp += PCA_Timer1; //输出为高电平,则给影射寄存器装载高电平时间长度
else CCAP1_tmp += PWM1_low; //输出为低电平,则给影射寄存器装载低电平时间长度 CCAP1L = (u8)CCAP1_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
CCAP1H = (u8)(CCAP1_tmp >> 8); //后写CCAP0H } if(CCF2) //PCA模块2中断 { CCF2 = 0; //清PCA模块1中断标志 if(P27) CCAP2_tmp += PCA_Timer2; //输出为高电平,则给影射寄存器装载高电平时间长度
else CCAP2_tmp += PWM2_low; //输出为低电平,则给影射寄存器装载低电平时间长度 CCAP2L = (u8)CCAP2_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
CCAP2H = (u8)(CCAP2_tmp >> 8); //后写CCAP0H }
/* if(CF) //PCA溢出中断 { CF = 0; //清PCA溢出中断标志 } */ }
7.2.4 GPIO程序
/*------------------------------------------------------------------*/ /* --- STC MCU International Limited -------------------------------*/ /* --- STC 1T Series MCU RC Demo -----------------------------------*/ /* --- Mobile: (86)13922805190 -------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/ /* --- Web: www.GXWMCU.com -----------------------------------------*/ /* --- QQ: 800003751 ----------------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*------------------------------------------------------------------*/
/************* 功能说明 **************
本文件为STC15xxx系列的端口初始化程序,用户几乎可以不修改这个程序.
******************************************/
#include \
//======================================================================== // 函数: u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx) // 描述: 初始化IO口.
// 参数: GPIOx: 结构参数,请参考timer.h里的定义. // 返回: 成功返回0, 空操作返回1,错误返回2. // 版本: V1.0, 2012-10-22
//======================================================================== u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx) { if(GPIO > GPIO_P5) return 1; //空操作 if(GPIOx->Mode > GPIO_OUT_PP) return 2; //错误 if(GPIO == GPIO_P0) { if(GPIOx->Mode == GPIO_PullUp) P0M1 &= ~GPIOx->Pin, P0M0 &= ~GPIOx->Pin; //上拉准双向口 if(GPIOx->Mode == GPIO_HighZ) P0M1 |= GPIOx->Pin, P0M0 &= ~GPIOx->Pin; //浮空输入 if(GPIOx->Mode == GPIO_OUT_OD) P0M1 |= GPIOx->Pin, P0M0 |= GPIOx->Pin; //开漏输出 if(GPIOx->Mode == GPIO_OUT_PP) P0M1 &= ~GPIOx->Pin, P0M0 |= GPIOx->Pin; //推挽输出 } if(GPIO == GPIO_P1) { if(GPIOx->Mode == GPIO_PullUp) P1M1 &= ~GPIOx->Pin, P1M0 &= ~GPIOx->Pin; //上拉准双向口 if(GPIOx->Mode == GPIO_HighZ) P1M1 |= GPIOx->Pin, P1M0 &= ~GPIOx->Pin; //浮空输入 if(GPIOx->Mode == GPIO_OUT_OD) P1M1 |= GPIOx->Pin, P1M0 |= GPIOx->Pin; //开漏输出
if(GPIOx->Mode == GPIO_OUT_PP) >Pin;
//推挽输出 }
if(GPIO == GPIO_P2) { if(GPIOx->Mode == GPIO_PullUp) >Pin;
//上拉准双向口 if(GPIOx->Mode == GPIO_HighZ) >Pin;
//浮空输入 if(GPIOx->Mode == GPIO_OUT_OD) >Pin;
//开漏输出 if(GPIOx->Mode == GPIO_OUT_PP)
>Pin;
//推挽输出 }
if(GPIO == GPIO_P3) { if(GPIOx->Mode == GPIO_PullUp) >Pin;
//上拉准双向口 if(GPIOx->Mode == GPIO_HighZ) >Pin;
//浮空输入 if(GPIOx->Mode == GPIO_OUT_OD) >Pin;
//开漏输出 if(GPIOx->Mode == GPIO_OUT_PP)
>Pin;
//推挽输出 }
if(GPIO == GPIO_P4) { if(GPIOx->Mode == GPIO_PullUp) >Pin;
//上拉准双向口 if(GPIOx->Mode == GPIO_HighZ) >Pin;
//浮空输入 if(GPIOx->Mode == GPIO_OUT_OD) >Pin;
//开漏输出 if(GPIOx->Mode == GPIO_OUT_PP)
>Pin;
//推挽输出 }
if(GPIO == GPIO_P5) { if(GPIOx->Mode == GPIO_PullUp) >Pin;
//上拉准双向口 if(GPIOx->Mode == GPIO_HighZ) >Pin;
//浮空输入 if(GPIOx->Mode == GPIO_OUT_OD) >Pin;
//开漏输出 if(GPIOx->Mode == GPIO_OUT_PP)
>Pin;
//推挽输出 }
return 0; //成功
}
P1M1 &= ~GPIOx->Pin, P2M1 &= ~GPIOx->Pin, P2M1 |= GPIOx->Pin, P2M1 |= GPIOx->Pin, P2M1 &= ~GPIOx->Pin,
P3M1 &= ~GPIOx->Pin, P3M1 |= GPIOx->Pin, P3M1 |= GPIOx->Pin, P3M1 &= ~GPIOx->Pin,
P4M1 &= ~GPIOx->Pin, P4M1 |= GPIOx->Pin, P4M1 |= GPIOx->Pin, P4M1 &= ~GPIOx->Pin,
P5M1 &= ~GPIOx->Pin, P5M1 |= GPIOx->Pin, P5M1 |= GPIOx->Pin, P5M1 &= ~GPIOx->Pin,
P1M0 |= GPIOx-
P2M0 &= ~GPIOx-P2M0 &= ~GPIOx-P2M0 |= GPIOx-P2M0 |= GPIOx-
P3M0 &= ~GPIOx-P3M0 &= ~GPIOx-P3M0 |= GPIOx-P3M0 |= GPIOx-
P4M0 &= ~GPIOx-P4M0 &= ~GPIOx-P4M0 |= GPIOx-P4M0 |= GPIOx-
P5M0 &= ~GPIOx-P5M0 &= ~GPIOx-P5M0 |= GPIOx-P5M0 |= GPIOx-
7.2.5延时程序
/*------------------------------------------------------------------*/ /* --- STC MCU International Limited -------------------------------*/ /* --- STC 1T Series MCU RC Demo -----------------------------------*/ /* --- Mobile: (86)13922805190 -------------------------------------*/ /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/ /* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/ /* --- Web: www.GXWMCU.com -----------------------------------------*/ /* --- QQ: 800003751 ----------------------------------------------*/ /* If you want to use the program or the program referenced in the */ /* article, please specify in which data and procedures from STC */ /*------------------------------------------------------------------*/
/************* 功能说明 **************
本文件为STC15xxx系列的延时程序,用户几乎可以不修改这个程序.
******************************************/
#include \
//======================================================================== // 函数: void delay_ms(unsigned char ms) // 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注:
//======================================================================== void delay_ms(unsigned int ms) {
unsigned int i; do{ i = MAIN_Fosc / 13000; while(--i) ; //14T per loop }while(--ms); }
void delay_us(unsigned int us) {
unsigned int i; do{ i = MAIN_Fosc / 13; while(--i) ; //14T per loop }while(--us); }