📄 pcalvd.c
字号:
#include "config.h"
#define IN_PCALVD
#if PCALVD_USING
sbit EPCA = IE^6; // PCA中断屏蔽位
sfr CH = 0xf9; // PCA计数器高8位
sfr CL = 0xe9; // PCA计数器低8位
sfr CCON = 0xd8; // PCA控制寄存器
sbit CCF0 = CCON^0; // PCA模块0中断标志
sbit CCF1 = CCON^1; // PCA模块1中断标志
sbit CR = CCON^6; // PCA计数器容许标志
sbit CF = CCON^7; // PCA计数器溢出标志
sfr CMOD =0xd9; // PCA工作模式寄存器
//sbit CIDL = CMOD^7;
//sbit CPS1 = CMOD^2;
//sbit CPS0 = CMOD^1;
//sbit ECF = CMOD^0;
sfr CCAP0H = 0xfa; // PCA捕捉模块比较寄存器
sfr CCAP1H = 0xfb;
sfr CCAP0L = 0xea;
sfr CCAP1L = 0xeb;
//------------------------
sfr PCA_PWM0 = 0xf2; // PCA模块pwm寄存器
sfr PCA_PWM1 = 0xf3;
sfr CCAPM0 = 0xda; // PCA 模块0的工作模式寄存器
sfr CCAPM1 = 0xdb; // PCA 模块1的工作模式寄存器
unsigned char idata timer_100ms=0x00; //秒钟的定时标志
//unsigned char idata timer_ff_fb_flag=0x00; //快进快退的标志,当快进快退的的按键松开后一段时间要切换到play
// 本系统外部晶振为22.1184M ,时钟源实际为22.1184M/12=1843200
// 则: TIMER_100uS= 1843200 * 0.0001 = 184 = 0X00B8
// TIMER_500uS= 1843200 * 0.0005 = 921 = 0X0399
// TIMER_1mS= 1843200 * 0.001 = 1843 = 0X0733
void pcalvd_initialize(void)
{
// 开放低压中断
AUXR |= 0X00; //开放低压中断 BIT2 ELVDI -> 0:禁止低压中断 1:开放低压中断
// 将pca设定为定时器
//C P S 1 C P S 0 选择P C A 时钟源输入
//0 0 0 , 内部时钟, F o s c / 1 2
//0 1 1 , 内部时钟, F o s c / 2
//1 0 2 , 定时器0 溢出, 由于定时器0 可以工作在1 T 方式, 所以可以
// 达到计一个时钟就溢出, 频率反而是最高的, 可达到F o s c
//1 1 3 , E C I / P 3 . 4 脚的外部时钟输入( 最大速率= F o s c / 2 )
CMOD = 0x01; // 选择时钟为内部时钟的1/12,开启定时
CCAPM0 = 0x48; // 16bit软件定时,容许中断
// CCAPM1 = 0x48; // 16bit软件定时,容许中断
CH = 0xF8; // 定时时间
CL = 0xCC; //
// CCAP0H = 0xFC;
// CCAP0L = 0x66;
// CCAP1H = 0xFC;
// CCAP1L = 0x66;
CCON = 0x40; // 清除中断标志,启动PCA模式
EPCA = 0x01; // 开放PCA中断
}
// PCA/LVD 中断向量为 033H 中断查询次序 6
// 中断优先级设置 PPCA_LVDH,PPCA_LVD
// 中断请求标志: CF + CCF0 + CCF1 +LVDF
bit timersecond_flag=0x00; // 秒的标志
bit timer500ms_flag=0x00; // 500ms的标志
#define TIMER_SECOND_COUNT 1000
#define TIMER_500MS_COUNT 400 //主要是为了错开ESS的500MS的发送
void pcalvd_isr(void) interrupt 6
{ unsigned char idata i=0x00;
static unsigned int idata timer_count=0x00; //秒的计算
if(CF==0x01)
{// ---------利用定时器来发送通讯波形------------------------------------------------------------
// ---- 每次进入此定时需要1ms,则每隔1.96ms需要进入4次
// ---------处理1ms事件--------------------
timer_count++;
if(timer_count==TIMER_500MS_COUNT)
{timer500ms_flag=0x01;
}
if(timer_count>=TIMER_SECOND_COUNT)
{timer_count=0x00;
timersecond_flag=0x01; // 1S的标志
timer500ms_flag=0x01; // 每500ms的整数倍
// -----------------------------------------------------------------------
// ---- 1S的定时 -------
}
CH =0xF8;
CL =0xCC;
CCON = 0x40;
}
else // if((CCF0==0x01)||(CCF1==0x01))
{CCON = 0x40;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -