📄 irr.s
字号:
.dbline 231
cbi 0x1b,7
.dbline 232
ldi R16,200
ldi R17,0
xcall _s_ms
.dbline 233
subi R20,255 ; offset = 1
sbci R21,255
.dbline 234
L41:
.dbline 223
dec R10
L43:
.dbline 223
tst R10
brne L40
X10:
.dbline -2
L37:
.dbline 0 ; func end
xjmp pop_xgsetF03C
.dbsym r t 12 c
.dbsym r i 10 c
.dbsym r pBuffer 20 pc
.dbsym l num 8 i
.dbsym r col 10 c
.dbsym r row 22 c
.dbend
.area vector(rom, abs)
.org 4
jmp _ext_int0_isr
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\1602.h
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\1602.h
_irr_b::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\1602.h
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
.dbsym e irr_b _irr_b c
_s_s::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
.dbsym e s_s _s_s c
_wb::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
.dbsym e wb _wb c
_a::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
.dbsym e a _a c
_ds::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
.dbsym e ds _ds c
_da::
.blkb 4
.area idata
.word 0,0
.area data(ram, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
.dbsym e da _da L
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
.dbfunc e ext_int0_isr _ext_int0_isr fV
.even
_ext_int0_isr::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R26
st -y,R27
in R2,0x3f
st -y,R2
.dbline -1
.dbline 17
; //Atmega16的红外遥控器接收试验
; //使用1602液晶进行显示,
; #include<iom16v.h>
; #include"1602.h"
; #pragma interrupt_handler ext_int0_isr:2 //指定外部中断函数
; #define uchar unsigned char
; #define uint unsigned int
;
; uchar irr_b=0,s_s=0;
; uchar wb=0,a=0,ds=0;
; long da=0;
; uchar d1,d2,d3,d4;
; uchar ten_1,ten_2,ten_3,ten_4,i;
;
; //中断接收
; void ext_int0_isr(void)
; {
.dbline 18
; if(irr_b==0) //第一个中断
lds R2,_irr_b
tst R2
brne L45
X11:
.dbline 19
; {
.dbline 20
; irr_b=1; //状态为:开始接收
ldi R24,1
sts _irr_b,R24
.dbline 21
; TCNT1L=0x00; //定时器清零
clr R2
out 0x2c,R2
.dbline 22
; }
xjmp L46
L45:
.dbline 23
; else if(irr_b==1) //第二个以后的中断
lds R24,_irr_b
cpi R24,1
breq X20
xjmp L47
X20:
X12:
.dbline 24
; {
.dbline 25
; a=TCNT1L; //读取定时器的值
in R2,0x2c
sts _a,R2
.dbline 27
; //判断是引导,还是数据
; if((170<a)&&(a<235)) //引导
mov R4,R2
clr R3
ldi R24,170
ldi R25,0
cp R24,R2
cpc R25,R3
brge L49
X13:
mov R24,R2
cpi R24,235
brsh L49
X14:
.dbline 28
; {
.dbline 29
; wb=0; //数据计数清零
clr R2
sts _wb,R2
.dbline 30
; da=0; //数据清零
ldi R24,0
ldi R25,0
ldi R26,0
ldi R27,0
sts _da+1,R25
sts _da,R24
sts _da+2+1,R27
sts _da+2,R26
.dbline 31
; TCNT1L=0x00; //定时器清零
out 0x2c,R2
.dbline 32
; }
xjmp L50
L49:
.dbline 33
; else if((8<a)&&(a<25)) //数据0
lds R2,_a
ldi R24,8
cp R24,R2
brsh L51
X15:
mov R24,R2
cpi R24,25
brsh L51
X16:
.dbline 34
; {
.dbline 35
; wb++;
lds R24,_wb
subi R24,255 ; addi 1
sts _wb,R24
.dbline 36
; da=(da<<1);
lds R4,_da+2
lds R5,_da+2+1
lds R2,_da
lds R3,_da+1
lsl R2
rol R3
rol R4
rol R5
sts _da+1,R3
sts _da,R2
sts _da+2+1,R5
sts _da+2,R4
.dbline 37
; TCNT1L=0x00;
clr R2
out 0x2c,R2
.dbline 38
; }
xjmp L52
L51:
.dbline 39
; else if((25<a)&&(a<45)) //数据1
lds R16,_a
ldi R24,25
cp R24,R16
brsh L53
X17:
cpi R16,45
brsh L53
X18:
.dbline 40
; {
.dbline 41
; wb++;
lds R24,_wb
subi R24,255 ; addi 1
sts _wb,R24
.dbline 42
; da=(da<<1)+1;
ldi R24,1
ldi R25,0
ldi R26,0
ldi R27,0
lds R4,_da+2
lds R5,_da+2+1
lds R2,_da
lds R3,_da+1
lsl R2
rol R3
rol R4
rol R5
add R2,R24
adc R3,R25
adc R4,R26
adc R5,R27
sts _da+1,R3
sts _da,R2
sts _da+2+1,R5
sts _da+2,R4
.dbline 43
; TCNT1L=0x00;
clr R2
out 0x2c,R2
.dbline 44
; }
L53:
L52:
L50:
.dbline 45
; }
L47:
L46:
.dbline 46
; if(wb==32) //数据长度够32位
lds R24,_wb
cpi R24,32
brne L55
X19:
.dbline 47
; {
.dbline 48
; irr_b=0; //状态为停止接收
clr R2
sts _irr_b,R2
.dbline 49
; wb=0; //数据计数清零
sts _wb,R2
.dbline 50
; s_s=1; //打开显示许可
ldi R24,1
sts _s_s,R24
.dbline 51
; }
L55:
.dbline -2
L44:
.dbline 0 ; func end
ld R2,y+
out 0x3f,R2
ld R27,y+
ld R26,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
reti
.dbend
.dbfunc e t1_init _t1_init fV
.even
_t1_init::
.dbline -1
.dbline 56
; }
;
; //定时器T1初始化
; void t1_init()
; {
.dbline 57
; TCCR1B=0x00; //关闭定时器
clr R2
out 0x2e,R2
.dbline 58
; TCNT1H=0x00; //定时器初值
out 0x2d,R2
.dbline 59
; TCNT1L=0x00;
out 0x2c,R2
.dbline 60
; TCCR1A=0x00; //普通模式
out 0x2f,R2
.dbline 61
; TCCR1B=0x05; //1024分频
ldi R24,5
out 0x2e,R24
.dbline -2
L57:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fI
.even
_main::
sbiw R28,2
.dbline -1
.dbline 66
; }
;
; //主函数
; main()
; {
.dbline 68
; //初始化端口
; DDRA=0xff;
ldi R24,255
out 0x1a,R24
.dbline 69
; PORTA=0x00;
clr R2
out 0x1b,R2
.dbline 70
; DDRB=0xff;
out 0x17,R24
.dbline 71
; DDRD=0x00; //中断输入
out 0x11,R2
.dbline 72
; PORTD=0xff; //内部上拉
out 0x12,R24
.dbline 74
;
; t1_init(); //定时器t1初始化
xcall _t1_init
.dbline 76
;
; MCUCR = 0x02; //下降沿中断
ldi R24,2
out 0x35,R24
.dbline 77
; GICR = 0x40; //开外部中断int_0
ldi R24,64
out 0x3b,R24
.dbline 78
; TIMSK = 0x00;
clr R2
out 0x39,R2
.dbline 79
; SREG=0x80; //开全局中断
ldi R24,128
out 0x3f,R24
.dbline 80
; s_s=1; //开机进行一次显示
ldi R24,1
sts _s_s,R24
xjmp L60
L59:
.dbline 82
; while(1)
; {
.dbline 83
; ds=TCNT1L;
in R2,0x2c
sts _ds,R2
.dbline 84
; if(ds>250) //定时器超时,接收复位
ldi R24,250
cp R24,R2
brsh L62
X21:
.dbline 85
; {
.dbline 86
; TCNT1L=0;
clr R2
out 0x2c,R2
.dbline 87
; irr_b=0;
sts _irr_b,R2
.dbline 88
; da=0;
ldi R24,0
ldi R25,0
ldi R26,0
ldi R27,0
sts _da+1,R25
sts _da,R24
sts _da+2+1,R27
sts _da+2,R26
.dbline 89
; wb=0;
sts _wb,R2
.dbline 90
; s_s=0;
sts _s_s,R2
.dbline 91
; }
L62:
.dbline 92
; if(s_s==1) //显示开关打开,开始显示
lds R24,_s_s
cpi R24,1
breq X24
xjmp L64
X24:
X22:
.dbline 93
; {
.dbline 94
; SREG=0x00; //关闭全局中断
clr R2
out 0x3f,R2
.dbline 95
; LcdInit(); //1602初始化
xcall _LcdInit
.dbline 97
; //显示设备码
; d1=da>>24;
ldi R24,24
ldi R25,0
lds R18,_da+2
lds R19,_da+2+1
lds R16,_da
lds R17,_da+1
st -y,R24
xcall asr32
sts _d1,R16
.dbline 98
; ten_1=d1/100;
ldi R17,100
xcall div8u
sts _ten_1,R16
.dbline 99
; ten_2=(d1-(100*ten_1))/10;
mov R2,R16
ldi R24,100
mul R24,R2
lds R16,_d1
sub R16,R0
ldi R17,10
xcall div8u
sts _ten_2,R16
.dbline 100
; ten_3=d1-(100*ten_1)-ten_2*10;
lds R2,_ten_1
ldi R24,100
mul R24,R2
lds R2,_d1
sub R2,R0
mov R3,R16
ldi R24,10
mul R24,R3
sub R2,R0
sts _ten_3,R2
.dbline 101
; WriteNum(1,0,ten_1);
lds R2,_ten_1
clr R3
std y+1,R3
std y+0,R2
clr R18
clr R19
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 102
; WriteNum(1,1,ten_2);
lds R2,_ten_2
clr R3
std y+1,R3
std y+0,R2
ldi R18,1
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 103
; WriteNum(1,2,ten_3);
lds R2,_ten_3
clr R3
std y+1,R3
std y+0,R2
ldi R18,2
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 105
; //显示设备码反码
; d1=da>>16;
lds R2,_da+2
lds R3,_da+3
sts _d1,R2
.dbline 106
; ten_1=d1/100;
ldi R17,100
mov R16,R2
xcall div8u
sts _ten_1,R16
.dbline 107
; ten_2=(d1-(100*ten_1))/10;
mov R2,R16
ldi R24,100
mul R24,R2
lds R16,_d1
sub R16,R0
ldi R17,10
xcall div8u
sts _ten_2,R16
.dbline 108
; ten_3=d1-(100*ten_1)-ten_2*10;
lds R2,_ten_1
ldi R24,100
mul R24,R2
lds R2,_d1
sub R2,R0
mov R3,R16
ldi R24,10
mul R24,R3
sub R2,R0
sts _ten_3,R2
.dbline 109
; WriteNum(1,4,ten_1);
lds R2,_ten_1
clr R3
std y+1,R3
std y+0,R2
ldi R18,4
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 110
; WriteNum(1,5,ten_2);
lds R2,_ten_2
clr R3
std y+1,R3
std y+0,R2
ldi R18,5
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 111
; WriteNum(1,6,ten_3);
lds R2,_ten_3
clr R3
std y+1,R3
std y+0,R2
ldi R18,6
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 113
; //显示键码
; d1=da>>8;
ldi R24,8
ldi R25,0
lds R18,_da+2
lds R19,_da+2+1
lds R16,_da
lds R17,_da+1
st -y,R24
xcall asr32
sts _d1,R16
.dbline 114
; ten_1=d1/100;
ldi R17,100
xcall div8u
sts _ten_1,R16
.dbline 115
; ten_2=(d1-(100*ten_1))/10;
mov R2,R16
ldi R24,100
mul R24,R2
lds R16,_d1
sub R16,R0
ldi R17,10
xcall div8u
sts _ten_2,R16
.dbline 116
; ten_3=d1-(100*ten_1)-ten_2*10;
lds R2,_ten_1
ldi R24,100
mul R24,R2
lds R2,_d1
sub R2,R0
mov R3,R16
ldi R24,10
mul R24,R3
sub R2,R0
sts _ten_3,R2
.dbline 117
; WriteNum(1,8,ten_1);
lds R2,_ten_1
clr R3
std y+1,R3
std y+0,R2
ldi R18,8
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 118
; WriteNum(1,9,ten_2);
lds R2,_ten_2
clr R3
std y+1,R3
std y+0,R2
ldi R18,9
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 119
; WriteNum(1,10,ten_3);
lds R2,_ten_3
clr R3
std y+1,R3
std y+0,R2
ldi R18,10
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 121
; //显示键码反码
; d1=da;
lds R2,_da
lds R3,_da+1
sts _d1,R2
.dbline 122
; ten_1=d1/100;
ldi R17,100
mov R16,R2
xcall div8u
sts _ten_1,R16
.dbline 123
; ten_2=(d1-(100*ten_1))/10;
mov R2,R16
ldi R24,100
mul R24,R2
lds R16,_d1
sub R16,R0
ldi R17,10
xcall div8u
sts _ten_2,R16
.dbline 124
; ten_3=d1-(100*ten_1)-ten_2*10;
lds R2,_ten_1
ldi R24,100
mul R24,R2
lds R2,_d1
sub R2,R0
mov R3,R16
ldi R24,10
mul R24,R3
sub R2,R0
sts _ten_3,R2
.dbline 125
; WriteNum(1,12,ten_1);
lds R2,_ten_1
clr R3
std y+1,R3
std y+0,R2
ldi R18,12
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 126
; WriteNum(1,13,ten_2);
lds R2,_ten_2
clr R3
std y+1,R3
std y+0,R2
ldi R18,13
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 127
; WriteNum(1,14,ten_3);
lds R2,_ten_3
clr R3
std y+1,R3
std y+0,R2
ldi R18,14
ldi R19,0
ldi R16,1
ldi R17,0
xcall _WriteNum
.dbline 129
; //复位D端口
; DDRD=0x00; //中断输入
clr R2
out 0x11,R2
.dbline 130
; PORTD=0xff; //内部上拉
ldi R24,255
out 0x12,R24
.dbline 131
; s_s=0; //关闭显示开关
sts _s_s,R2
.dbline 132
; SREG=0x80; //开全局中断
ldi R24,128
out 0x3f,R24
.dbline 133
; }
L64:
.dbline 134
; }
L60:
.dbline 81
xjmp L59
X23:
.dbline -2
L58:
.dbline 0 ; func end
adiw R28,2
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
_i::
.blkb 1
.dbsym e i _i c
_ten_4::
.blkb 1
.dbsym e ten_4 _ten_4 c
_ten_3::
.blkb 1
.dbsym e ten_3 _ten_3 c
_ten_2::
.blkb 1
.dbsym e ten_2 _ten_2 c
_ten_1::
.blkb 1
.dbsym e ten_1 _ten_1 c
_d4::
.blkb 1
.dbsym e d4 _d4 c
_d3::
.blkb 1
.dbsym e d3 _d3 c
_d2::
.blkb 1
.dbsym e d2 _d2 c
_d1::
.blkb 1
.dbsym e d1 _d1 c
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -