$$: clr _DplDuty ; call __readbut push R0 ;如果只有 C 语言调用此子程序,进栈和退栈部分可以抹掉 push R1 ; push R2 ; push R3 push R4 push R5 ; LD DigPos,#00000001B CPX _DigCtr,#05 JR ULT,NX_DIG LDX _DigCtr,#0 NX_DIG ADDX _DigCtr,#1 LDX R0,_DigCtr $$: RR DigPos djnz R0,$B LDX SegBuf,_Volume cpx _DigCtr,#03 jr ult,$F LDX SegBuf,_ChNr $$: TMX _DigCtr,#1 JR NZ,LSD SWAP SegBuf ;若是偶数,左右四比特对换 LSD AND SegBuf,#0FH ;淹没左四比特 LD R0, #high(seg_ptr) ;画段指针 LD R1, #low(seg_ptr) ; ADD R1,SegBuf ;加上错位 ADC R0,#0 LDC SegBuf,@RR0 ;从画段表获取数据 cpx _FuncNr,#0 jr ne,$F cpx _DigCtr,#3 ;显示音量时第三位数空白 jr eq,blank $$: cpx _DigCtr,#05 jr ult,$F blank clr SegBuf ;灭显示 $$: LD R3,SegBuf ;输出画段 COM R3 ;低电平驱动 CALL OUT_BYTE LD R3,DigPos ;输出位数 CALL OUT_BYTE ORX stb1,#stb1_1 ;转移数据 NOP NOP NOP ANDX stb1,#stb1_0 ANDX data1,#data1_0 andx _DplFlag,#%FE ;标记处理完毕 pop R5 ;如果只有 C 语言调用此子程序,进栈和退栈部分可以抹掉 pop R4 pop R3 pop R2 pop R1 pop R0 RET OUT_BYTE ;串移数据 LD R2,#08 ;8 比特 SFT_LP ANDX data1,#data1_0 RL R3 JR NC,CLKING ORX data1,#data1_1 CLKING ;输出一个时钟脉冲 NOP NOP NOP ORX clk1,#clk1_1 NOP NOP NOP ANDX clk1,#clk1_0 DJNZ R2,SFT_LP RET ;-------------------------------------------- 刚完成了采用 NEC 波形的读码部分,改天再写飞利浦波形的。 ; 汇编部分,中断子程序 vector C3=_isr_C3; 红外线, 下降沿, _isr_C3: tmx PCIN,#%08 ; 只取下降沿 jr nz,c3_x ldx _width,T1H ; 一次 = 92.23uS (责任编辑:admin) |