📄 irremote.s
字号:
.module irremote.c
.area text(rom, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\irremote/delay.h
.dbfunc e delay_1us _delay_1us fV
.even
_delay_1us::
.dbline -1
.dbline 10
; /*
; Title: icc-avr irremote
; Author: dushibiao
; Date: 2007 10 19
; Purpose: control your pc use a ir remoter
; Frequency: internal 8M
; needed
; Software: icc-avr to compile
; needed
; Hardware: AVR mega16 BOARD
.dbline 11
; Connect: dushibiao@126.com
nop
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_nus _delay_nus fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 15
; */
; #include <iom16v.h>
; #include <macros.h>
; #include "shumaguan.h"
.dbline 16
;
clr R20
clr R21
.dbline 17
; #define IR 2 //PB2,irfrade receive line
xjmp L6
L3:
.dbline 18
xcall _delay_1us
L4:
.dbline 17
subi R20,255 ; offset = 1
sbci R21,255
L6:
.dbline 17
cp R20,R22
cpc R21,R23
brlo L3
.dbline -2
L2:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 22
; #define PIN_RXD 0 //PD0 RXD
; #define PIN_TXD 1 //PD1 TXD
; #define BAUDRATE 9600 //baudrate
; #define F_CPU 8000000 //the frequency of the global clock
;
.dbline 24
clr R16
clr R17
xjmp L11
L8:
.dbline 24
L9:
.dbline 24
subi R16,255 ; offset = 1
sbci R17,255
L11:
.dbline 24
;
; volatile unsigned char flag,code;
cpi R16,116
ldi R30,4
cpc R17,R30
brlo L8
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay_nms _delay_nms fV
; i -> R20,R21
; n -> R22,R23
.even
_delay_nms::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 28
;
;
; void delay0_9ms(void)
; {
.dbline 29
; delay_nus(510);
clr R20
clr R21
.dbline 30
; }
xjmp L16
L13:
.dbline 31
xcall _delay_1ms
L14:
.dbline 30
subi R20,255 ; offset = 1
sbci R21,255
L16:
.dbline 30
cp R20,R22
cpc R21,R23
brlo L13
.dbline -2
L12:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.area lit(rom, con, rel)
_discode::
.byte 192,249
.byte 164,176
.byte 153,146
.byte 130,248
.byte 128,144
.byte 136,131
.byte 198,161
.byte 134,142
.byte 191
.dbfile D:\M16开发板实验教程\icc-avr\irremote/shumaguan.h
.dbsym e discode _discode A[17:17]kc
.area text(rom, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\irremote/shumaguan.h
.dbfunc e display _display fV
; num -> R20
.even
_display::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 21
.dbline 22
cbi 0x18,0
.dbline 24
ldi R24,<_discode
ldi R25,>_discode
mov R30,R20
clr R31
asr R31
ror R30
asr R31
ror R30
asr R31
ror R30
asr R31
ror R30
add R30,R24
adc R31,R25
lpm R30,Z
out 0x1b,R30
.dbline 25
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline 26
sbi 0x18,0
.dbline 28
cbi 0x18,1
.dbline 29
ldi R18,16
ldi R19,0
mov R16,R20
clr R17
xcall mod16s
movw R30,R16
ldi R24,<_discode
ldi R25,>_discode
add R30,R24
adc R31,R25
lpm R30,Z
out 0x1b,R30
.dbline 30
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline 31
;
sbi 0x18,1
.dbline -2
L17:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r num 20 c
.dbend
.dbfunc e displayerror _displayerror fV
.even
_displayerror::
.dbline -1
.dbline 38
; //4.5ms
; void delay4_5ms(void)
; {
; delay_nms(4);
; delay_nus(320);
; }
; /*---------------------------------------------------------------------------
.dbline 39
; function send an unsigned char to the uart
cbi 0x18,0
.dbline 41
; ----------------------------------------------------------------------------*/
; void put_c(unsigned char c) //发送采用查询方式
ldi R30,<_discode+16
ldi R31,>_discode+16
lpm R30,Z
out 0x1b,R30
.dbline 42
; {
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline 43
; while( !(UCSRA & (1<<UDRE)) ); //wait until the uart is empty
sbi 0x18,0
.dbline 45
; UDR=c; //write data to uart
; }
cbi 0x18,1
.dbline 46
; /*---------------------------------------------------------------------------
ldi R30,<_discode+16
ldi R31,>_discode+16
lpm R30,Z
out 0x1b,R30
.dbline 47
; fuction initialize the uart unit
ldi R16,5
ldi R17,0
xcall _delay_nms
.dbline 48
; ----------------------------------------------------------------------------*/
sbi 0x18,1
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.dbfile D:\M16开发板实验教程\icc-avr\irremote\irremote.c
.dbfunc e delay0_9ms _delay0_9ms fV
.even
_delay0_9ms::
.dbline -1
.dbline 28
.dbline 29
ldi R16,510
ldi R17,1
xcall _delay_nus
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay4_5ms _delay4_5ms fV
.even
_delay4_5ms::
.dbline -1
.dbline 34
.dbline 35
ldi R16,4
ldi R17,0
xcall _delay_nms
.dbline 36
ldi R16,320
ldi R17,1
xcall _delay_nus
.dbline -2
L22:
.dbline 0 ; func end
ret
.dbend
.dbfunc e put_c _put_c fV
; c -> R16
.even
_put_c::
.dbline -1
.dbline 42
L24:
.dbline 43
L25:
.dbline 43
sbis 0xb,5
rjmp L24
.dbline 44
out 0xc,R16
.dbline -2
L23:
.dbline 0 ; func end
ret
.dbsym r c 16 c
.dbend
.dbfunc e init_USART _init_USART fV
.even
_init_USART::
.dbline -1
.dbline 50
; void init_USART(void)//USART 初始化
; {
.dbline 53
;
; //USART 9600 8, n,1 PC上位机软件(超级终端等)也要设成同样的设置才能通讯
; UCSRC = (1<<URSEL) | 0x06;
ldi R24,134
out 0x20,R24
.dbline 69
; //异步,8位数据,无奇偶校验,一个停止位,无倍速
; /*
; UBRRH与UCSRC共用I/O 地址。因此访问该地址时需注意以下问题。
; 写访问
; 当在该地址执行写访问时, USART 寄存器选择位(URSEL)控制被写入的寄存器。
; 若URSEL为0,对UBRRH值更新;若URSEL为1,对UCSRC设置更新
;
; 读访问
; 对UBRRH 或UCSRC 寄存器的读访问则较为复杂。但在大多数应用中,基本不需要读这些寄存器
;
;
; 没有UBRR这个16位寄存器,因为UBRRL(0x09)/UBRRH(0x20)的地址不连续,而且UBRRH跟UCSRC共用地址
; */
;
; //U2X=0时的公式计算
; UBRRL= (F_CPU/BAUDRATE/16-1)%256;
ldi R24,51
out 0x9,R24
.dbline 70
; UBRRH= (F_CPU/BAUDRATE/16-1)/256;
clr R2
out 0x20,R2
.dbline 77
; //U2X=1时的公式计算
; //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
; //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
; //也可根据数据手册的[波特率设置的例子]查得
; //UBRRL = 0x2F; //set baud rate lo
; //UBRRH = 0x00; //set baud rate hi
; UCSRA = 0x00; //无倍速
out 0xb,R2
.dbline 78
; UCSRB = (1<<RXEN)|(1<<TXEN);
ldi R24,24
out 0xa,R24
.dbline -2
L27:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 83
; //使能接收,使能发送
; }
;
; void main(void)
; {
.dbline 84
; PORTA=0XFF;
ldi R24,255
out 0x1b,R24
.dbline 85
; DDRA=0XFF; //OUT
out 0x1a,R24
.dbline 86
; PORTB=0XFF;
out 0x18,R24
.dbline 87
; DDRB=0X03; //PB0,PB1 OUT
ldi R24,3
out 0x17,R24
.dbline 88
; PORTC=0XFF;
ldi R24,255
out 0x15,R24
.dbline 89
; DDRD =(1<<PIN_TXD); //TXD为输出
ldi R24,2
out 0x11,R24
.dbline 90
; init_USART();
xcall _init_USART
.dbline 91
; MCUCSR &=~(1<<ISC2); //falling edge interrupt
in R24,0x34
andi R24,191
out 0x34,R24
.dbline 92
; GIFR=(1<<INTF2); //写1清除标志位,在使能中断前最好先把对应的标志位清除,以免误触发
ldi R24,32
out 0x3a,R24
.dbline 93
; GICR=(1<<INT2); //使能INT2外部中断
out 0x3b,R24
.dbline 94
; SEI(); //使能全局中断
sei
.dbline 95
; flag=0;
clr R2
sts _flag,R2
xjmp L30
L29:
.dbline 97
; while(1)
; {
.dbline 98
; if(flag==1)
lds R24,_flag
cpi R24,1
brne L32
.dbline 99
; {
.dbline 100
; display(code);
lds R16,_code
xcall _display
.dbline 101
; }
xjmp L33
L32:
.dbline 103
; else
; {
.dbline 104
; displayerror();
xcall _displayerror
.dbline 105
; }
L33:
.dbline 107
L30:
.dbline 96
xjmp L29
X0:
.dbline -2
L28:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 72
jmp _int2pro
.area text(rom, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\irremote\irremote.c
.dbfunc e int2pro _int2pro fV
; k -> R20
; aa -> y+0
; i -> R10
; dm -> R22
; j -> R12
.even
_int2pro::
xcall push_lset
xcall push_gset4
sbiw R28,2
.dbline -1
.dbline 115
;
; }
; }
;
; /**********************************************************************
; function: ext2 interrupt service function
; **********************************************************************/
; #pragma interrupt_handler int2pro: iv_INT2
; void int2pro(void) //INT2中断服务程序
; {
.dbline 116
; unsigned char i,j,k,dm=0,aa[2];
clr R22
.dbline 117
; for(k=0;k<10;k++) //重复10次,目的是检测在9毫秒内如果出现高电平就退出解码程序
clr R20
xjmp L38
L35:
.dbline 118
; { //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
.dbline 120
;
; delay0_9ms(); //延时0.9毫秒
xcall _delay0_9ms
.dbline 121
; if ((PINB&(1<<IR))==(1<<IR))
in R24,0x16
andi R24,4
cpi R24,4
brne L39
.dbline 122
; {k=10;break;} //延时0.9毫秒后判断PB2脚是否出现高电平如果有就退出解码程序
.dbline 122
ldi R20,10
.dbline 122
xjmp L37
L39:
.dbline 123
; else if(k==9) //重复10次?
cpi R20,9
breq X3
xjmp L41
X3:
.dbline 124
; { //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
L43:
.dbline 125
L44:
.dbline 125
; while((PINB&(1<<IR))==0); //等待高电平避开9毫秒低电平引导脉冲
sbis 0x16,2
rjmp L43
.dbline 126
; delay4_5ms(); //延时4.5毫秒避开4.5毫秒的结果码
xcall _delay4_5ms
.dbline 132
;
;
; /********************************************
; //26位的用户码,前13位数据码,后13位数据反码
; *********************************************/
; for(j=1;j<=26;j++)//每组数据为26位
clr R12
inc R12
xjmp L49
X1:
.dbline 133
; {
L50:
.dbline 134
L51:
.dbline 134
; while((PINB&(1<<IR))==0); //
sbis 0x16,2
rjmp L50
.dbline 135
; delay0_9ms();
xcall _delay0_9ms
.dbline 136
; if((PINB&(1<<IR))==(1<<IR))
in R24,0x16
andi R24,4
cpi R24,4
brne L53
.dbline 137
; {
.dbline 138
; delay_nms(1);
ldi R16,1
ldi R17,0
xcall _delay_nms
.dbline 139
; }
L53:
.dbline 140
L47:
.dbline 132
inc R12
L49:
.dbline 132
ldi R24,26
cp R24,R12
brsh L51
.dbline 147
; }
;
;
; /***************************************************
; //16位的用户码,前8位数据码,后8位数据反码
; ****************************************************/
;
; for(i=0;i<2;i++)
clr R10
xjmp L58
L55:
.dbline 148
; {
.dbline 149
; for(j=1;j<=8;j++)//每组数据为8位
clr R12
inc R12
xjmp L62
X2:
.dbline 150
; {
L63:
.dbline 151
L64:
.dbline 151
; while((PINB&(1<<IR))==0); //
sbis 0x16,2
rjmp L63
.dbline 152
; delay0_9ms();
xcall _delay0_9ms
.dbline 153
; if((PINB&(1<<IR))==(1<<IR))
in R24,0x16
andi R24,4
cpi R24,4
brne L66
.dbline 154
; {
.dbline 155
; delay_nms(1);
ldi R16,1
ldi R17,0
xcall _delay_nms
.dbline 156
; dm=dm|0x80;
ori R22,128
.dbline 157
; if(j<8) dm=dm>>1; //数据"1",右移一个"1",一共7次
mov R24,R12
cpi R24,8
brsh L67
.dbline 157
lsr R22
.dbline 158
; }
xjmp L67
L66:
.dbline 159
; else if(j<8) dm=dm>>1; //数据"0",一共7次
mov R24,R12
cpi R24,8
brsh L70
.dbline 159
lsr R22
L70:
L67:
.dbline 160
L60:
.dbline 149
inc R12
L62:
.dbline 149
ldi R24,8
cp R24,R12
brsh L64
.dbline 161
movw R24,R28
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R22
.dbline 162
clr R22
.dbline 163
L56:
.dbline 147
inc R10
L58:
.dbline 147
mov R24,R10
cpi R24,2
brlo L55
.dbline 164
; }
; aa[i]=dm;
; dm=0;
; }
; if(aa[0]=~aa[1])
ldd R2,y+1
com R2
std y+0,R2
tst R2
breq L72
.dbline 165
; {
.dbline 166
; code=aa[0];
sts _code,R2
.dbline 167
; flag=1;
ldi R24,1
sts _flag,R24
.dbline 168
; put_c(code);
lds R16,_code
xcall _put_c
.dbline 169
; }
L72:
.dbline 171
;
; }
L41:
.dbline 172
L36:
.dbline 117
inc R20
L38:
.dbline 117
cpi R20,10
brsh X4
xjmp L35
X4:
L37:
.dbline -2
L34:
adiw R28,2
xcall pop_gset4
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r k 20 c
.dbsym l aa 0 A[2:2]c
.dbsym r i 10 c
.dbsym r dm 22 c
.dbsym r j 12 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\M16开发板实验教程\icc-avr\irremote\irremote.c
_code::
.blkb 1
.dbsym e code _code c
_flag::
.blkb 1
.dbsym e flag _flag c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -