📄 ir.asm
字号:
//======================================================
// Note: Assembly only
// Date: 2002/6/1
// Input: Index of IR Code
// Output: IR wave from IOB8.低位在前,高位在后
//======================================================
.INCLUDE hardware.inc
.PUBLIC IR_Send
.RAM
.VAR Send_Code;
.PUBLIC IR_Send_Time_Flag
.VAR IR_Send_Time_Flag
.VAR code_shift //移位单元
.VAR send_counter //移位计数器
.VAR func_code //功能码
.EXTERNAL R_InterruptStatus
.TEXT
//==========================================================
IR_Send_Table:
.DW 0
//先发低位,再发高位,低位为资料码,高位为资料反码
.DW 0xEB14; //S1 MUTE
.DW 0xF00F; //S2 AV
.DW 0xEA15; //S3 SLEEP
.DW 0xF40B; //S4 POWER
.DW 0xFF00; //S5 1
.DW 0xFE01; //S6 2
.DW 0xFD02; //S7 3
.DW 0xE11E; //S8 SCAN
.DW 0xFC03; //S9 4
.DW 0xFB04; //S10 5
.DW 0xFA05; //S11 6
.DW 0xD52A; //S12 VOL M
.DW 0xF906; //S13 7
.DW 0xF807; //S14 8
.DW 0xF708; //S15 9
.DW 0xF30C; //S16 SYSTEM
.DW 0xF50A; //S17 -/--/---
.DW 0xF609; //S18 0
.DW 0xE817; //S19 S.MPX
.DW 0xE916; //S20 DISPLAY
.DW 0xEE11; //S21 CH+
.DW 0xE31C; //S22 MENU
.DW 0xEF10; //S23 CH-
.DW 0xED12; //S24 VOL-
.DW 0xEC13; //S25 VOL+
//S26
.CODE
IR_Send:
bp=r2+IR_Send_Table //查表,取按键对应的红外码
r3=[bp]
[func_code]=r3
call F_IR_System_Initial //发送初始化
call F_Send_leading_pulse //发送头脉冲
r1=0x0808 //系统码
[code_shift]=r1
call F_Send_code //发送系统码
r1=[func_code] //资料码及资料反码
[code_shift]=r1
call F_Send_code //发送资料码及资料反码
call F_IR_Send_End //发送结束位
r1=0x0036 //关闭 TimerA 定时器
[P_TimerA_Ctrl]=r1
r1=0x0006 //关闭 TimerB 定时器
[P_TimerB_Ctrl]=r1
r1=0xf7ff //关FIQ_TMB中断
r1&=[R_InterruptStatus]
[R_InterruptStatus]=r1
[P_INT_Ctrl] = r1
retf
//================================================================//
F_IR_System_Initial:
r1=0xFFFF //IOB8输出
[P_IOB_Dir]=r1
r1=0xFFFF
[P_IOB_Attrib]=r1
r1=0x0003
[P_IOB_Data]=r1
r1=0x0000 //fosc=24.576M(fault),CPUclk=fosc
[P_SystemClock]=r1
r1=0x0000 //Set TXPinEN=0
[P_UART_Command2]=r1;
//r1 = 0x0001; //Set b0:IRTXEN=1
//[P_FeedBack] = r1;
r1=0x0036 //Turn off TimerA
[P_TimerA_Ctrl]=r1
r1=0xffec //38.3kHz 0xffec
[P_TimerA_Data]=r1
r1=0x0000 // Clock source =fos/2 =12.288M
[P_TimerB_Ctrl]=r1 //change it ,width change
r1=58606 //62085 //TimerB=0.56ms,即0.56ms产生中断
[P_TimerB_Data]=r1
r1=0
[IR_Send_Time_Flag]=r1
r1=0x0800 //允许 TimerB FIQ 中断
r1|=[R_InterruptStatus]
[R_InterruptStatus]=r1
[P_INT_Ctrl] = r1
FIQ on
retf
//=====================================
F_Send_leading_pulse:
r1=0x01b0 //开APWMO 占空比=6/16
[P_TimerA_Ctrl]=r1 //开 TimerA 定时器(不中断),Clock source =fosc/2=12.288M
r1=0 //清计时器
[IR_Send_Time_Flag]=r1
r1=8; //0.56*8=4.4ms
leading_high_4d4:
cmp r1,[IR_Send_Time_Flag]
ja leading_high_4d4
r1=0x0036 //关闭 APWMO
[P_TimerA_Ctrl]=r1
r1=16; //0.56*8=4.4ms
leading_low_4d4:
cmp r1,[IR_Send_Time_Flag]
ja leading_low_4d4
retf
//========================================
F_Send_code:
r1=16
[send_counter]=r1 //移位16次
send_one_bit:
r1=0
[IR_Send_Time_Flag]=r1
r1=0x1b0 //时钟源A选择FOSC/2,时钟源B选择1,APWMO选择6/16.
[P_TimerA_Ctrl]=r1
IR_Code_High:
r1=[IR_Send_Time_Flag]
jz IR_Code_High
r1=0x0036 //关闭 APWMO
[P_TimerA_Ctrl]=r1
r1=[code_shift]
test r1,0x0001 //判断发送的第一位数据是0还是1;
jz Send_Num_0_Low
Send_Num_1_Low:
r1=4;
jmp IR_Code_Low
Send_Num_0_Low:
r1=2;
IR_Code_Low:
cmp r1,[IR_Send_Time_Flag]
ja IR_Code_Low
send_next_bit:
r1=[code_shift]
r1=r1 lsr 1 //下一位
[code_shift]=r1
r1=[send_counter] //移位次数-1
r1-=1
[send_counter]=r1
cmp r1,0 //移位完成?
jnz send_one_bit
retf
F_IR_Send_End: //发送结束位
r1=0
[IR_Send_Time_Flag]=r1
r1=0x1b0 //时钟源A选择FOSC/2,时钟源B选择1,APWMO选择6/16.
[P_TimerA_Ctrl]=r1
End_High:
r1=[IR_Send_Time_Flag]
jz End_High
r1 = 0x0036; // 关闭TimerA定时器
[P_TimerA_Ctrl] = r1;
retf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -