/********************************************
Title : main.c
McuBody : STC15
Author :
Updata : 2020-12-09
Version : Ver1.00
********************************************
NOTE:
1. P11 PCA采样,红外遥控解码
********************************************/
#include "xtimer[v032].h"
#include "TM1638.h"
#include "PCA.h"
/************************外部变量***************************/
/************************本地全局变量***********************/
#define MAIN_Fosc 12000000UL //定义主时钟
#define Timer0_Reload_1ms (MAIN_Fosc / 1000) //Timer 0 中断频率, 1000次/秒
#define ID_IR_USER 0x00
u8 IR_Rxbuff[4]={0}; //第一字节:地址 第二字节:地址反码 第三字节:按键值(命令) 第四字节:命令反码
u8 IR_RXCnt = 0;
bit Flag_IrStart = 0;
bit Flag_IrHold = 0;
bit Flag_RecvOk = 0;
bit flagAction=0;
u8 Displaybuff[8]={0};
/*******************Private function defines*****************/
xTIMER_TypeDef Task1(void);
xTIMER_TypeDef Task2(void);
/************************************************************
Function : Mcu_IO_Config
Stacks :
Note : Pxn_standard-双向 Pxn_push_pull-推挽 Pxn_pure_input-高阻 Pxn_open_drain-开漏
Updata : 2020-06-18
************************************************************/
void Mcu_IO_Config(void)
{
P1n_pure_input(Pin5);
P5n_pure_input(Pin4);
}
/************************************************
Function : PCA_config
Stacks :
Note : PWM频率= PCA时钟源 / 2^n (n为PCA模式6/7/8)
PWM占空比最小为1/2^n
Updata : 2020-12-08
PCA_P12_P11_P10_P37 0x00 CCP 在[ECI-P1.2,CCP0-P1.1,CCP1-P1.0,CCP2-P3.7]
PCA_P34_P35_P36_P37 0x10 CCP 在[ECI-P3.4,CCP0_2-P3.5,CCP1_2-P3.6,CCP2_2-P3.7]
PCA_P24_P25_P26_P27 0x20 CCP 在[ECI-P2.4,CCP0_3-P2.5,CCP1_3-P2.6,CCP2_2-P2.7]
************************************************/
void PCA_config(void)
{
PCA_InitTypeDef PCA_InitStructure;
PCA_InitStructure.PCA_Clock = PCA_Clock_12T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
PCA_InitStructure.PCA_IoUse = PCA_P12_P11_P10_P37; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //ENABLE, DISABLE
PCA_InitStructure.PCA_Polity = PolityLow; //优先级设置 PolityHigh,PolityLow
PCA_InitStructure.PCA_RUN = DISABLE; //ENABLE, DISABLE
PCA_Init(PCA_Counter,&PCA_InitStructure);
PCA_InitStructure.PCA_Mode = PCA_Mode_Capture; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
PCA_InitStructure.PCA_Interrupt_Mode = PCA_Fall_Active|ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value = 0; //对于PWM,高8位为PWM占空比
PCA_Init(PCA0,&PCA_InitStructure);
// PCA_InitStructure.PCA_Mode = PCA_Mode_PWM; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
// PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
// PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
// PCA_InitStructure.PCA_Value = 128 << 8; //对于PWM,高8位为PWM占空比
// PCA_Init(PCA1,&PCA_InitStructure);
// PCA_InitStructure.PCA_Mode = PCA_Mode_PWM; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
// PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_6bit; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
// PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
// PCA_InitStructure.PCA_Value = 32 << 8; //对于PWM,高8位为PWM占空比
// PCA_Init(PCA2,&PCA_InitStructure);
CR = 1;
}
/************************************************
Function : Mcu_OutIO_Init
Stacks :
Note :
Updata : 2020-09-13
************************************************/
void Mcu_Port_Init(void)
{
P15=0;
P54=0;
}
/************************************************
Function : Timer0_Init
Stacks :
Note : period as 1ms auto load
Updata : 2020-09-13
************************************************/
void Timer0_Init(void)
{
TR0 = 0;
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式16位自动重装
TH0 = (u8)((65536UL - Timer0_Reload_1ms) / 256);
TL0 = (u8)((65536UL - Timer0_Reload_1ms) % 256);
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //允许T0中断
EA = 1;
}
/************************************************
Function : Task1
Stacks :
Note : 红外接收处理
Updata : 2020-09-13
************************************************/
xTIMER_TypeDef Task1(void)
{
_xBEGIN
while(1)
{
if (Flag_RecvOk)
{
if ((IR_Rxbuff[2] == ~IR_Rxbuff[3])&& (IR_Rxbuff[0] == ID_IR_USER))
{
flagAction = 1;
}
Flag_RecvOk = 0;
}
xDelay(10);
}
}
/************************************************
Function : Task2
Stacks :
Note : 显示接收的NEC码
Updata : 2020-09-13
************************************************/
xTIMER_TypeDef Task2(void)
{ static u8 i;
static u8 j;
_xBEGIN
while(1)
{
if(flagAction)
{
i=IR_Rxbuff[0];
Displaybuff[0]= i/16;
Displaybuff[1]= i%16;
i=IR_Rxbuff[1];
Displaybuff[2]= i/16;
Displaybuff[3]= i%16;
i=IR_Rxbuff[2];
Displaybuff[4]= i/16;
Displaybuff[5]= i%16;
i=IR_Rxbuff[3];
Displaybuff[6]= i/16;
Displaybuff[7]= i%16;
flagAction=0;
}
for(j=0;j<8;j++)
{
Write_DATA(j<<1,tab[Displaybuff[j]]);
}
for(j=0;j<10;j++)
{
xDelay(25); //250mS更新一次显示
}
}
}
/************************************************
Function : System_Init
Stacks :
Note :
Updata : 2020-09-13
************************************************/
void System_Init(void)
{
Mcu_IO_Config();
Mcu_Port_Init();
init_TM1638();
PCA_config();
Timer0_Init();
}
/************************************************
Function : xTimerCallback
Stacks :
Note :
Updata : 2020-09-13
************************************************/
void xTimerCallback(void)
{
NOP(1);
}
/**********************************************************************
main program zone
**********************************************************************/
void main(void)
{
System_Init();
xTimerInit(20);
while(1)
{
xTimerProcess(Task1," ", ID_0); //将Task1函数装入0号
xTimerProcess(Task2," ", ID_1); //将Task2函数装入1号
}
}
/**********************************************************************
interrupt program zone
**********************************************************************/
void TM0_Isr(void) interrupt 1 //1ms
{
xTimerUpdata(xTimerCallback);
}
/**********************************************************************
**********************************************************************/
void PCA_()interrupt 7 //PCA中断入口
{
u8 i;
CF=0;
if(CCF0) //捕获中断
{
CCF0=0;
if (CCAP0H> 0x32&& CCAP0H < 0x37) //确认收到起始信号 12.8-14.335mS
{
IR_RXCnt = 0;
Flag_IrStart = 1;
}
else if (!Flag_IrStart )
{
if((CCAP0H > 0x29) && (CCAP0H < 0x2e)) //长按信号 10.496-12.031mS
Flag_IrHold = 1;
}
else
{
if ((CCAP0H < 0x02) || (CCAP0H > 0x0c)) // < 0.767mS 或 > 3.072mS
{
Flag_IrStart = 0;
}
else if(Flag_IrStart )
{
i=IR_RXCnt/8;
IR_Rxbuff[i]>>=1;
if (CCAP0H > 0x06)
{
IR_Rxbuff[i]|= 0x80;
}
else
{
IR_Rxbuff[i] &= ~0x80;
}
IR_RXCnt++;
if (IR_RXCnt >= 32)
{
if (!Flag_RecvOk) Flag_RecvOk = 1;
Flag_IrStart = 0;
}
}
}
}
CCAP0L=CCAP0H=CL=CH=0; //清零PCA计数寄存器和捕获数据寄存器
}
|