📄 iremote_ir.s
字号:
.module iRemote_IR.c
.area text(rom, con, rel)
.dbfile F:\iRemote_IR\iRemote_IR.c
.area vector(rom, abs)
.org 6
rjmp _timer0_ovf_isr
.area text(rom, con, rel)
.dbfile F:\iRemote_IR\iRemote_IR.c
.dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
.even
_timer0_ovf_isr::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 23
; //ICC-AVR application builder : 2008-10-29 9:40:16
; // Target : T13
; // Crystal: 9.6000Mhz
; #include <iot13v.h>
; #define uchar unsigned char
; #define uint unsigned int
; #define ulong unsigned long
; #define WDR() asm("wdr")
; #define SEI() asm("sei")
; #define CLI() asm("cli")
; #define NOP() asm("nop")
; #define SBIT(val, bitn) (val|=(1<<(bitn)))//置位
; #define CBIT(val, bitn) (val&=~(1<<(bitn)))//清位
; #define FBIT(val, bitn) (val^=(1<<bitn)) //位取反
; #define PW_ON SBIT(PORTB,4)
; #define PW_OFF CBIT(PORTB,4)
; #define IR_ON SBIT(PORTB,0)
; #define IR_OFF CBIT(PORTB,0)
; uchar time_10ms;
; uchar User_ID[7],pw_off_ram;
; //===========================================
; #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
; void timer0_ovf_isr(void){
.dbline 24
; TCNT0 = 0xA3; //reload counter value
ldi R24,163
out 0x32,R24
.dbline 25
; time_10ms++;
lds R24,_time_10ms
subi R24,255 ; addi 1
sts _time_10ms,R24
.dbline -2
L1:
.dbline 0 ; func end
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
reti
.dbend
.dbfunc e EEPROM_read _EEPROM_read fc
; Addr -> R16
.even
_EEPROM_read::
.dbline -1
.dbline 27
; }
; uchar EEPROM_read(uchar Addr){
L3:
.dbline 28
; while(EECR & (1<<EEWE));//等待上一次写操作结束
L4:
.dbline 28
sbic 0x1c,1
rjmp L3
X0:
.dbline 29
; EEARL = Addr;//设置地址寄存器
out 0x1e,R16
.dbline 30
; EECR |= (1<<EERE);//设置EERE 以启动读操作
sbi 0x1c,0
.dbline 31
; return EEDR;//自数据寄存器返回数据
in R16,0x1d
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r Addr 16 c
.dbend
.dbfunc e EEPROM_write _EEPROM_write fV
; ucdata -> R18
; Addr -> R16
.even
_EEPROM_write::
.dbline -1
.dbline 33
; }
; void EEPROM_write(uchar Addr,uchar ucdata){
L7:
.dbline 34
; while(EECR & (1<<EEWE));//等待上一次写操作结束
L8:
.dbline 34
sbic 0x1c,1
rjmp L7
X1:
.dbline 35
; EEAR = Addr;//设置地址和数据寄存器
out 0x1e,R16
.dbline 36
; EEDR = ucdata;
out 0x1d,R18
.dbline 37
; EECR=0b00000100;//置位EEMWE
ldi R24,4
out 0x1c,R24
.dbline 38
; EECR=0b00000110;//置位EEWE 以启动写操作
ldi R24,6
out 0x1c,R24
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbsym r ucdata 18 c
.dbsym r Addr 16 c
.dbend
.dbfunc e delay_500us _delay_500us fV
; ii -> R16
.even
_delay_500us::
.dbline -1
.dbline 40
; }
; void delay_500us(void){
.dbline 42
; uchar ii;
; for(ii=0;ii<250;ii++){//500us/0.10417us=4799.88
clr R16
rjmp L14
L11:
.dbline 42
.dbline 43
; WDR();NOP();NOP();NOP();NOP();NOP();NOP();
wdr
.dbline 43
nop
.dbline 43
nop
.dbline 43
nop
.dbline 43
nop
.dbline 43
nop
.dbline 43
nop
.dbline 44
; NOP();NOP();NOP();NOP();NOP();NOP();NOP();
nop
.dbline 44
nop
.dbline 44
nop
.dbline 44
nop
.dbline 44
nop
.dbline 44
nop
.dbline 44
nop
.dbline 45
; NOP();NOP();NOP();NOP();NOP();
nop
.dbline 45
nop
.dbline 45
nop
.dbline 45
nop
.dbline 45
nop
.dbline 46
; }
L12:
.dbline 42
inc R16
L14:
.dbline 42
cpi R16,250
brlo L11
X2:
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbsym r ii 16 c
.dbend
.dbfunc e ir_500us _ir_500us fV
; ii -> R16
; kk -> R18
.even
_ir_500us::
.dbline -1
.dbline 48
; }
; void ir_500us(void){
.dbline 50
; uchar ii,kk;
; ii=0;
clr R16
L16:
.dbline 51
; do{
.dbline 52
; IR_ON; //38Khz=26.3us 占空比=1/3 9.6MHz晶振时=0.10417时钟周期指令
sbi 0x18,0
.dbline 53
; for(kk=0;kk<20;kk++);
clr R18
rjmp L22
L19:
.dbline 53
L20:
.dbline 53
inc R18
L22:
.dbline 53
cpi R18,20
brlo L19
X3:
.dbline 54
; IR_OFF;
cbi 0x18,0
.dbline 55
; for(kk=0;kk<39;kk++);
clr R18
rjmp L26
L23:
.dbline 55
L24:
.dbline 55
inc R18
L26:
.dbline 55
cpi R18,39
brlo L23
X4:
.dbline 56
; ii++;
inc R16
.dbline 57
; }while(ii<16);
L17:
.dbline 57
cpi R16,16
brlo L16
X5:
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbsym r ii 16 c
.dbsym r kk 18 c
.dbend
.dbfunc e send_code _send_code fV
; ii -> R20
; mm -> R22
; nn -> R12
; kk -> R10
.even
_send_code::
rcall push_xgsetF03C
.dbline -1
.dbline 59
; }
; void send_code(void){
.dbline 61
; uchar ii,kk,nn,mm;
; for(ii=0;ii<10;ii++){
clr R20
rjmp L31
L28:
.dbline 61
.dbline 62
; ir_500us();//2.00ms+0.50ms开始码
rcall _ir_500us
.dbline 63
; ir_500us();
rcall _ir_500us
.dbline 64
; ir_500us();
rcall _ir_500us
.dbline 65
; ir_500us();
rcall _ir_500us
.dbline 66
; delay_500us();
rcall _delay_500us
.dbline 67
; for(mm=0;mm<7;mm++){
clr R22
rjmp L35
L32:
.dbline 67
.dbline 68
; kk=User_ID[mm];
ldi R24,<_User_ID
ldi R25,>_User_ID
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R10,z+0
.dbline 69
; for(nn=0;nn<8;nn++){
clr R12
rjmp L39
L36:
.dbline 69
.dbline 70
; if(!(kk&0x80)){
sbrc R10,7
rjmp L40
X6:
.dbline 70
.dbline 71
; ir_500us();//0.50ms+0.50ms逻辑低
rcall _ir_500us
.dbline 72
; delay_500us();
rcall _delay_500us
.dbline 73
; }
rjmp L41
L40:
.dbline 74
; else{
.dbline 75
; ir_500us();//1.00ms+0.50ms逻辑高
rcall _ir_500us
.dbline 76
; ir_500us();
rcall _ir_500us
.dbline 77
; delay_500us();
rcall _delay_500us
.dbline 78
; }
L41:
.dbline 79
; kk<<=1;
lsl R10
.dbline 80
; }
L37:
.dbline 69
inc R12
L39:
.dbline 69
mov R24,R12
cpi R24,8
brlo L36
X7:
.dbline 81
; }
L33:
.dbline 67
inc R22
L35:
.dbline 67
cpi R22,7
brlo L32
X8:
.dbline 82
; }
L29:
.dbline 61
inc R20
L31:
.dbline 61
cpi R20,10
brlo L28
X9:
.dbline 83
; ir_500us();//0.50ms结束码
rcall _ir_500us
.dbline -2
L27:
.dbline 0 ; func end
rjmp pop_xgsetF03C
.dbsym r ii 20 c
.dbsym r mm 22 c
.dbsym r nn 12 c
.dbsym r kk 10 c
.dbend
.dbfunc e main _main fV
; temp4 -> R14,R15
; temp3 -> R12,R13
; temp5 -> R10
; ID -> y+0
; temp2 -> y+5
; temp1 -> y+4
.even
_main::
sbiw R28,6
.dbline -1
.dbline 85
; }
; void main(void){
.dbline 89
; uchar temp1,temp2,temp5;
; uint temp3,temp4;
; ulong ID;
; EECR=0;
clr R2
out 0x1c,R2
rjmp L44
L43:
.dbline 90
; while(pw_off_ram==0xaa){
.dbline 91
; DDRB = 0b11010111;
ldi R24,215
out 0x17,R24
.dbline 92
; PW_OFF;WDR();
cbi 0x18,4
.dbline 92
wdr
.dbline 93
; }
L44:
.dbline 90
lds R24,_pw_off_ram
cpi R24,170
breq L43
X10:
.dbline 94
; MCUSR=0;
clr R2
out 0x34,R2
.dbline 95
; WDTCR=0x1f;
ldi R24,31
out 0x21,R24
.dbline 96
; WDTCR=0x0f;//WD=2Second
ldi R24,15
out 0x21,R24
.dbline 97
; OCR0A = 0x5D;
ldi R24,93
out 0x36,R24
.dbline 98
; OCR0B = 0x5D;
out 0x29,R24
.dbline 99
; TCNT0 = 0xA3; //set count
ldi R24,163
out 0x32,R24
.dbline 100
; TCCR0A = 0x00;
out 0x2f,R2
.dbline 101
; TCCR0B = 0x05; //start timer
ldi R24,5
out 0x33,R24
.dbline 102
; TIMSK0 = 0x02;
ldi R24,2
out 0x39,R24
.dbline 103
; SEI();
sei
.dbline 104
; PORTB = 0b11111000;
ldi R24,248
out 0x18,R24
.dbline 105
; DDRB = 0b11010111;
ldi R24,215
out 0x17,R24
.dbline 106
; time_10ms=0;temp1=0;temp2=0;
sts _time_10ms,R2
.dbline 106
clr R0
std y+4,R0
.dbline 106
std y+5,R0
L46:
.dbline 107
; do{
.dbline 108
; if(temp1!=time_10ms){
lds R2,_time_10ms
ldd R0,y+4
cp R0,R2
breq L49
X11:
.dbline 108
.dbline 109
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -