B、把发射函数置于中断中,发射编码的时间不需要做进一步调整,而且时间很准。
EIR_SYNC equ 22+1 //23*13=300us EIR_SYNCL equ 92+1 //92*13=1200us EIR_38k_H equ 22+1 //300us EIR_Low_1 equ 44+1 //600us EIR_Low_0 equ 22+1 //300us EIR_DataLng equ 25 //发送数据总长度(位)最后一为同步尾 EIR_SendLng equ EIR_DataLng*2+2 DIR_38kCnt reg 0x18 DIR_SdBitCnt reg 0x19 DIR_Data0 reg 0x1A DIR_Data1 reg 0x1B DIR_Data2 reg 0x1C DSendTmCnt reg 0x1D /*------------ 中断服务 --------------*/ org 08h PUSH //保护现场 bcr INTFLAG,T0IF_B //清中断标志 TM_RELOAD E_25us btrss FIR_Enb lgoto LB_int_cnt TM_RELOAD E_12_5us MIR_Int //IR_TX btrss DIR_38kCnt,0 //12.5us时要两次才算一次 lgoto LB_Int_Out LB_int_cnt: incr DSysClkCntms,1 // ............ // you other code LB_Int_Out: POP //恢复现场 Retie //================================================== //函数名称:MInt_IR //输入参数:无 //输出参数:无 //函数功能:红外信号发送 //用 法: 将此宏置于13us的中断中,启动发送后将自动完成,当前只能完成24位发送, //若需要更多,需要修改EIR_DataLng,添加 DIR_Data3..., 在RLR处添加,同时注意上面的 //Goto $+x要相应地改变 //================================================== MIR_Int macro decrsz DIR_38kCnt,1 lgoto $+20// 20 Int_01 bcr PIROut //IO_IR movia EIR_Low_0 btrsc DIR_Data0,7 movia EIR_Low_1 btrsc DIR_SdBitCnt,0 movia EIR_38k_H btrss FIR_Sync movia EIR_SYNCL movar DIR_38kCnt bsr FIR_Sync btrss DIR_SdBitCnt,0 lgoto $+4 RLR DIR_Data2,1 //带C左移 RLR DIR_Data1,1 RLR DIR_Data0,1 decrsz DIR_SdBitCnt,1 lgoto $+7 bcr FIR_Enb lgoto $+5 //Int_01: btrsc DIR_SdBitCnt,0 lgoto $+3 TurnB PTA,0X02 //有2字节 endm