⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iremote_ir.s

📁 一个用ICCAVR7.0开发的红外线发射程序.单片机是AVR的ATtiny13V.
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -