📄 nec_ir.s
字号:
.module nec_ir.c
.area bss(ram, con, rel)
L2:
.blkb 2
.area text(rom, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
.dbfunc s ir_get_timer _ir_get_timer fI
.dbsym s old_ir_timer L2 i
; t2 -> R20,R21
; t1 -> R22,R23
.even
_ir_get_timer::
xcall push_gset2
.dbline -1
.dbline 45
; /***********************************************************************/
; /* File: */
; /* Copyright (c) 2000 ZORAN Corporation, All Rights Reserved */
; /* THIS IS PROPRIETARY SOURCE CODE OF ZORAN CORPORATION */
; /* */
; /* =========== */
;
; #include "iom163.h"
; #define ir_rising() TCCR1B |= 0x40
; #define ir_falling() TCCR1B &= 0xBF
; //the time increment for gen_time is 1.00us
; #define IR_MARGIN 300 //150
; #define time_9000_us 9000/75
; #define time_9000_ush 9900/75
; #define time_9000_usl 8100/75
;
; #define time_4500_us 4500/75
; #define time_4500_ush 5100/75
; #define time_4500_usl 3900/75
;
; #define time_2250_us 2250/75
; #define time_2250_ush 2550/75
; #define time_2250_usl 1950/75
;
; #define time_1125_us 1125/75
; #define time_1125_ush 1275/75
; #define time_1125_usl 975/75
; #define G_IR_SYSTEM_CODE 0x00ff
;
; // State of the remote key decoder
; #define IDLE 0
; #define LEADER_ON 1
; #define LEADER_OFF 2
; #define CUSTOM 3
; #define DATA1 4
; #define DATA2 5
;
; // Hoe many repeat message will ignire before send it to the FSM's
; #define REPEAT_DELAY 3
; extern unsigned int key_buff,dvd_key;
;
;
; /* TP0713, timer optimization */
; unsigned char ir_get_timer(void)
; {
.dbline 48
; static unsigned int old_ir_timer;
; unsigned int t1,t2;
; t1 = ICR1L;
in R22,0x26
clr R23
.dbline 49
; t1 |= (unsigned int)ICR1H<<8;
in R2,0x27
clr R3
mov R3,R2
clr R2
or R22,R2
or R23,R3
.dbline 50
; if(t1>old_ir_timer)
lds R3,L2+1
lds R2,L2
cp R2,R22
cpc R3,R23
brsh L3
.dbline 51
; t2 = t1-old_ir_timer;
movw R20,R22
sub R20,R2
sbc R21,R3
xjmp L4
L3:
.dbline 53
; else
; t2 =(65535-old_ir_timer)+t1+1;
lds R3,L2+1
lds R2,L2
ldi R20,-1
ldi R21,-1
sub R20,R2
sbc R21,R3
add R20,R22
adc R21,R23
subi R20,255 ; offset = 1
sbci R21,255
L4:
.dbline 55
;
; old_ir_timer = t1;
sts L2+1,R23
sts L2,R22
.dbline 56
; return (unsigned char)(t2/75);
ldi R18,75
ldi R19,0
movw R16,R20
xcall div16u
clr R17
.dbline -2
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r t2 20 i
.dbsym r t1 22 i
.area vector(rom, abs)
.org 20
jmp _timer1_capt_isr
.area text(rom, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
.area bss(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
L6:
.blkb 1
.area data(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
L7:
.blkb 1
.area idata
.byte 3
.area data(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
.area bss(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
L8:
.blkb 2
.area data(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
L9:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
.area bss(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
L10:
.blkb 1
L11:
.blkb 1
L12:
.blkb 1
.area data(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
L13:
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
.area text(rom, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
.dbfunc s timer1_capt_isr _timer1_capt_isr fI
.area func_lit(rom, con, rel)
L57:
.word `L17
.word `L18
.word `L21
.word `L32
.word `L41
.word `L48
.area text(rom, con, rel)
.dbfile D:\avrmcu\AT980\nec_ir.c
.dbsym s valid_repeat L13 c
.dbsym s data2 L12 c
.dbsym s data1 L11 c
.dbsym s count L10 c
.dbsym s state L9 c
.dbsym s custom L8 i
.dbsym s repeat_delay L7 c
.dbsym s key L6 c
; t0 -> R20
.even
_timer1_capt_isr::
xcall push_lset
xcall push_gset2
.dbline -1
.dbline 61
; }
;
; #pragma interrupt_handler timer1_capt_isr:6
; void timer1_capt_isr(void) //IR_IST
; {
.dbline 72
; static unsigned char key; // Hold the key code
; static unsigned char repeat_delay = REPEAT_DELAY; // Repeat code counter
; static unsigned int custom; // Hold the custom (remote ID) code
; static unsigned char state = 0; // State holder
; static unsigned char count; // bits counter
; static unsigned char data1, data2; // Temporary for holding the decoded data
; static unsigned char valid_repeat = 0;
;
;
; unsigned char t0; // Hold the last timer value
; t0 = ir_get_timer();
xcall _ir_get_timer
movw R2,R16
mov R20,R2
.dbline 74
lds R22,L9
clr R23
cpi R22,0
ldi R30,0
cpc R23,R30
brge X1
xjmp L14
X1:
ldi R24,5
ldi R25,0
cp R24,R22
cpc R25,R23
brge X2
xjmp L14
X2:
ldi R24,<L57
ldi R25,>L57
movw R30,R22
lsl R30
rol R31
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
ijmp
X0:
.dbline 74
;
; switch (state) {
L17:
.dbline 76
; case IDLE:
; ir_rising(); //ir_interrupt_set_edge(RISING_EDGE);
in R24,0x2e
ori R24,64
out 0x2e,R24
.dbline 77
; state = LEADER_ON;
ldi R24,1
sts L9,R24
.dbline 78
; break;
xjmp L15
L18:
.dbline 82
; case LEADER_ON:
; /* TP0713, timer optimization */
;
; ir_falling();//ir_interrupt_set_edge(FALLING_EDGE);
in R24,0x2e
andi R24,191
out 0x2e,R24
.dbline 83
; state = ((t0>time_9000_usl) &&( t0<time_9000_ush)) ? LEADER_OFF:IDLE;
ldi R24,108
cp R24,R20
brsh L19
cpi R20,132
brsh L19
ldi R22,2
ldi R23,0
xjmp L20
L19:
clr R22
clr R23
L20:
sts L9,R22
.dbline 84
; break;
xjmp L15
L21:
.dbline 86
; case LEADER_OFF:
; if (t0 > time_4500_usl && t0 < time_4500_ush) {
ldi R24,52
cp R24,R20
brsh L22
cpi R20,68
brsh L22
.dbline 86
.dbline 87
; state = CUSTOM;
ldi R24,3
sts L9,R24
.dbline 88
; custom = 0;
clr R2
clr R3
sts L8+1,R3
sts L8,R2
.dbline 89
; count = 0;
sts L10,R2
.dbline 90
; repeat_delay = REPEAT_DELAY;
sts L7,R24
.dbline 91
; }
xjmp L15
L22:
.dbline 93
; else
; {
.dbline 94
; if (t0 > time_2250_usl && t0 < time_2250_ush)
ldi R24,26
cp R24,R20
brsh L24
cpi R20,34
brsh L24
.dbline 95
; {
.dbline 96
; if (repeat_delay)
lds R2,L7
tst R2
breq L26
.dbline 97
; {
.dbline 99
; // Delay before sendnig the first repeat
; repeat_delay--;
mov R24,R2
subi R24,1
sts L7,R24
.dbline 100
; }
xjmp L27
L26:
.dbline 102
; else
; { // repeat last key
.dbline 103
; if (valid_repeat)
lds R2,L13
tst R2
breq L28
.dbline 104
; {
.dbline 105
; if(is_repeat_ui_key(key))
lds R16,L6
clr R17
xcall _is_repeat_ui_key
movw R2,R16
tst R2
brne X3
tst R3
breq L30
X3:
.dbline 106
; {
.dbline 108
; //dvd_key = key;//|0X8000
; key_buff = key;
lds R2,L6
clr R3
sts _key_buff+1,R3
sts _key_buff,R2
.dbline 109
; repeat_delay = REPEAT_DELAY;
ldi R24,3
sts L7,R24
.dbline 110
; }
L30:
.dbline 111
; }
L28:
.dbline 112
; }
L27:
.dbline 113
; }
L24:
.dbline 117
; //else
; // valid_repeat = 0;
; //set_falling();//ir_interrupt_set_edge(FALLING_EDGE);
; state = IDLE;
clr R2
sts L9,R2
.dbline 118
; }
.dbline 119
; break;
xjmp L15
L32:
.dbline 122
; case CUSTOM:
; /* TP0713, timer optimization */
; if (t0 > time_1125_usl && t0 < time_1125_ush) {
ldi R24,13
cp R24,R20
brsh L33
cpi R20,17
brsh L33
.dbline 122
.dbline 123
; custom <<= 1; /* a zero bit */
lds R3,L8+1
lds R2,L8
lsl R2
rol R3
sts L8+1,R3
sts L8,R2
.dbline 124
; }
xjmp L34
L33:
.dbline 126
; else
; {
.dbline 127
; if (t0 > time_2250_usl && t0 < time_2250_ush) {
ldi R24,26
cp R24,R20
brsh L35
cpi R20,34
brsh L35
.dbline 127
.dbline 128
; custom = (custom << 1) | 1; /* a one bit */
lds R25,L8+1
lds R24,L8
lsl R24
rol R25
ori R24,1
sts L8+1,R25
sts L8,R24
.dbline 129
; }
xjmp L36
L35:
.dbline 130
; else {
.dbline 133
; // Garbage ... ignored
; //ir_interrupt_set_edge(FALLING_EDGE);
; state = IDLE;
clr R2
sts L9,R2
.dbline 134
; valid_repeat = 0;
sts L13,R2
.dbline 135
; break;
xjmp L15
L36:
.dbline 137
; }
; }
L34:
.dbline 140
;
; /* count 16 'custom' bits */
; if (++count == 16) {
lds R24,L10
subi R24,255 ; addi 1
mov R2,R24
sts L10,R2
cpi R24,16
breq X4
xjmp L15
X4:
.dbline 140
.dbline 141
; if (custom != G_IR_SYSTEM_CODE)
lds R25,L8+1
lds R24,L8
cpi R24,255
ldi R30,0
cpc R25,R30
breq L39
.dbline 142
; {
.dbline 151
; // Noise from other remote ... ignore
; //#ifdef TEST_IR_CODE //CT add for test ir key code in release version 1-3-6 10:18
; //printf("custom code = ");
; //debug_out_dwx(custom);
; //printf("\n");
; //#endif
; //key_buff = custom;
; //ir_interrupt_set_edge(FALLING_EDGE);
; state = IDLE;
clr R2
sts L9,R2
.dbline 152
; valid_repeat = 0;
sts L13,R2
.dbline 153
; break;
xjmp L15
L39:
.dbline 155
; }
; state = DATA1;
ldi R24,4
sts L9,R24
.dbline 157
; /* TP0713, timer optimization */
; count = 0;
clr R2
sts L10,R2
.dbline 158
; data1 = 0;
sts L11,R2
.dbline 159
; }
.dbline 160
; break;
xjmp L15
L41:
.dbline 163
; case DATA1:
; /* TP0713, timer optimization */
; count++;
lds R24,L10
subi R24,255 ; addi 1
sts L10,R24
.dbline 164
; if (t0 > time_1125_usl&& t0 < time_1125_ush)
ldi R24,13
cp R24,R20
brsh L42
cpi R20,17
brsh L42
.dbline 165
; {
.dbline 166
; data1 <<= 1; /* a zero bit */
lds R2,L11
lsl R2
sts L11,R2
.dbline 167
; }
xjmp L43
L42:
.dbline 169
; else
; {
.dbline 170
; if (t0 > time_2250_usl && t0 < time_2250_ush)
ldi R24,26
cp R24,R20
brsh L44
cpi R20,34
brsh L44
.dbline 171
; {
.dbline 172
; data1 = (data1 << 1) ;
lds R2,L11
lsl R2
sts L11,R2
.dbline 173
; data1++; //| 1; /* a one bit */
mov R24,R2
subi R24,255 ; addi 1
sts L11,R24
.dbline 174
; }
xjmp L45
L44:
.dbline 176
; else
; {
.dbline 178
; //ir_interrupt_set_edge(FALLING_EDGE);
; state = IDLE;
clr R2
sts L9,R2
.dbline 179
; valid_repeat = 0;
sts L13,R2
.dbline 180
; break;
xjmp L15
L45:
.dbline 182
; }
; }
L43:
.dbline 183
; if (count == 8) {
lds R24,L10
cpi R24,8
breq X5
xjmp L15
X5:
.dbline 183
.dbline 184
; state = DATA2;
ldi R24,5
sts L9,R24
.dbline 185
; count = 0;
clr R2
sts L10,R2
.dbline 186
; data2 = 0;
sts L12,R2
.dbline 187
; }
.dbline 188
; break;
xjmp L15
L48:
.dbline 191
; case DATA2:
; /* TP0713, timer optimization */
; count++;
lds R24,L10
subi R24,255 ; addi 1
sts L10,R24
.dbline 192
; if (t0 > time_1125_usl && t0 < time_1125_ush)
ldi R24,13
cp R24,R20
brsh L49
cpi R20,17
brsh L49
.dbline 193
; {
.dbline 194
; data2 <<= 1; /* a zero bit */
lds R2,L12
lsl R2
sts L12,R2
.dbline 195
; }
xjmp L50
L49:
.dbline 197
; else
; {
.dbline 198
; if (t0 > time_2250_usl && t0 < time_2250_ush)
ldi R24,26
cp R24,R20
brsh L51
cpi R20,34
brsh L51
.dbline 199
; {
.dbline 200
; data2 = (data2 << 1);
lds R2,L12
lsl R2
sts L12,R2
.dbline 201
; data2++;// | 1; /* a one bit */
mov R24,R2
subi R24,255 ; addi 1
sts L12,R24
.dbline 202
; }
xjmp L52
L51:
.dbline 204
; else
; {
.dbline 206
; //ir_interrupt_set_edge(FALLING_EDGE);
; state = IDLE;
clr R2
sts L9,R2
.dbline 207
; valid_repeat = 0;
sts L13,R2
.dbline 208
; break;
xjmp L15
L52:
.dbline 210
; }
; }
L50:
.dbline 211
; if (count == 8)
lds R24,L10
cpi R24,8
brne L15
.dbline 212
; {
.dbline 214
; //ir_interrupt_set_edge(FALLING_EDGE);
; state = IDLE;
clr R2
sts L9,R2
.dbline 215
; if (data1 == (~data2 ))
lds R2,L12
com R2
lds R3,L11
cp R3,R2
brne L15
.dbline 216
; { // Check if data is valid
.dbline 217
; key = data1;
mov R2,R3
sts L6,R2
.dbline 219
; //dvd_key = data1;
; key_buff = data1;
clr R3
sts _key_buff+1,R3
sts _key_buff,R2
.dbline 220
; valid_repeat = 1;
ldi R24,1
sts L13,R24
.dbline 222
;
; }
.dbline 223
; }
.dbline 224
; break;
L14:
L15:
.dbline -2
.dbline 226
; }
; }
L5:
xcall pop_gset2
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r t0 20 c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -