📄 uncode.s
字号:
.module uncode.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\Microsoft\桌面\解码器\uncode.c
.dbfunc e HowLong _HowLong fi
; a -> R16,R17
.even
_HowLong::
.dbline -1
.dbline 30
; //ICC-AVR application builder : 2006-2-7 20:37:19
; // Target : 2313
; // Crystal: 8.0000Mhz
;
; #include <io2313v.h>
; #include <macros.h>
; #include <stdio.h>
; #define Uchar unsigned char
; #define Uint unsigned int
; #define PB PORTB
; #define PD PORTD
; #define nop() asm("nop")
; #define _nop_() asm("nop")
; #define INPUT (PIND&0x40)
; #define TimerStart(); TCCR1B = 0x82;
; //信号下降沿触发
;
;
; #define WaitHigh(); while(!INPUT){nop();};
; //只要高电平一出现就向下继续运行
; #define WaitLow(); while(INPUT){nop();};
; //只要高电平一出现就向下继续运行
; #define RESET_TIME 2900
; #define MID_TIME 1200
; #define TOV1F TIFR&0x80
; #define TOV1L TIFR|=0x80
;
;
; Uint HowLong (void)
; {Uint a=0;
.dbline 30
clr R16
clr R17
.dbline 31
; TCCR1B = 0x00; //stop timer
clr R2
out 0x2e,R2
.dbline 32
; TCNT1=0;
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 33
; return(ICR1);
in R16,0x24
in R17,0x25
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r a 16 i
.dbend
.dbfunc e WaitReset _WaitReset fV
.even
_WaitReset::
.dbline -1
.dbline 37
; }
;
; void WaitReset (void)
; {
rjmp L4
X0:
.dbline 39
; while(1)
; {
.dbline 40
L6:
.dbline 40
.dbline 40
nop
.dbline 40
L7:
.dbline 40
; WaitLow ();
sbic 0x10,6
rjmp L6
.dbline 40
.dbline 40
.dbline 41
rjmp L10
L9:
.dbline 41
.dbline 41
nop
.dbline 41
L10:
.dbline 41
; WaitHigh ();
sbis 0x10,6
rjmp L9
.dbline 41
.dbline 41
.dbline 42
; TimerStart();
.dbline 42
ldi R24,130
out 0x2e,R24
.dbline 42
.dbline 43
rjmp L13
L12:
.dbline 43
.dbline 43
nop
.dbline 43
L13:
.dbline 43
; WaitLow ();
sbic 0x10,6
rjmp L12
.dbline 43
.dbline 43
.dbline 44
; if(HowLong()>RESET_TIME)break;
rcall _HowLong
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L15
.dbline 44
rjmp L5
L15:
.dbline 45
L4:
.dbline 38
rjmp L7
L5:
.dbline 45
; };
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e watchdog_init _watchdog_init fV
.even
_watchdog_init::
.dbline -1
.dbline 49
; }
;
; void watchdog_init(void)
; {
.dbline 50
; WDR(); //this prevents a timout on enabling
wdr
.dbline 51
; WDTCR = 0x0A; //WATCHDOG ENABLED - dont forget to issue WDRs
ldi R24,10
out 0x21,R24
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 55
; }
;
; void timer1_init(void)
; {
.dbline 56
; TCCR1B = 0x00; //stop timer
clr R2
out 0x2e,R2
.dbline 57
; TCNT1H = 0x00 /*INVALID SETTING*/; //set count value
out 0x2d,R2
.dbline 58
; TCNT1L = 0x00 /*INVALID SETTING*/;
out 0x2c,R2
.dbline 59
; OCR1H = 0x00; //set compare value
out 0x2b,R2
.dbline 60
; OCR1L = 0x00;
out 0x2a,R2
.dbline 61
; TCCR1A = 0x00;
out 0x2f,R2
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 66
; }
;
;
; void port_init(void)
; {
.dbline 67
; PORTB = 0x00;
clr R2
out 0x18,R2
.dbline 68
; DDRB = 0xFF;
ldi R24,255
out 0x17,R24
.dbline 69
; PORTD = 0x00;
out 0x12,R2
.dbline 70
; DDRD = 0x3F;
ldi R24,63
out 0x11,R24
.dbline -2
L19:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 75
; }
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 77
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 78
; port_init();
rcall _port_init
.dbline 79
; timer1_init();
rcall _timer1_init
.dbline 80
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 81
; GIMSK = 0x00;
out 0x3b,R2
.dbline 82
; TIMSK = 0x00;
out 0x39,R2
.dbline 83
; SEI(); //re-enable interrupts
sei
.dbline -2
L20:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fI
; sw_estate -> R12
; sw_reset -> R20
; sw_counter -> R22
; error -> R10
; temp -> R14,R15
.even
_main::
.dbline -1
.dbline 88
; //all peripherals are now initialized
; }
;
; main()
; {
.dbline 89
; Uchar sw_counter=10;//数据在开关通道的位号码//10的作用:刚开机开关信号不稳定,这时的数据是未知的,等待一个复位信号后方可使用
ldi R22,10
.dbline 91
; Uchar sw_estate;//开关通道数据的位状态
; Uchar error=0;//是否存在错误帧
clr R10
.dbline 94
; //说明:如果是错误帧造成的break,那么接下来的开关数据也是未知的,必须等待一个复位信号
; Uint temp;//定时器缓寸
; Uchar sw_reset=0;
clr R20
.dbline 95
; watchdog_init();//打开狗
rcall _watchdog_init
.dbline 96
; WaitReset ();
rcall _WaitReset
.dbline 97
; WDR();//喂狗
wdr
rjmp L23
L22:
.dbline 99
; while(1)//1
; {
.dbline 100
; if(error)sw_counter=10;//错误处理,防止产生一连串错误开关信号输出
tst R10
brne X9
rjmp L28
X9:
.dbline 100
ldi R22,10
rjmp L28
X1:
.dbline 102
; while(1)//2
; { //通道1
.dbline 103
L30:
.dbline 103
.dbline 103
nop
.dbline 103
L31:
.dbline 103
; WaitHigh ();
sbis 0x10,6
rjmp L30
.dbline 103
.dbline 103
.dbline 104
; TimerStart();
.dbline 104
ldi R24,130
out 0x2e,R24
.dbline 104
.dbline 105
; PD|=0x01;
sbi 0x12,0
.dbline 106
rjmp L34
L33:
.dbline 106
.dbline 106
nop
.dbline 106
L34:
.dbline 106
; WaitLow ();
sbic 0x10,6
rjmp L33
.dbline 106
.dbline 106
.dbline 107
; PD&=(~0x01);
cbi 0x12,0
.dbline 108
; if(HowLong()>RESET_TIME){error=1;break;}
rcall _HowLong
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L39
.dbline 108
.dbline 108
clr R10
inc R10
.dbline 108
rjmp L29
X2:
.dbline 111
L38:
.dbline 111
.dbline 111
nop
.dbline 111
L39:
.dbline 111
;
; //通道2
; WaitHigh ();
sbis 0x10,6
rjmp L38
.dbline 111
.dbline 111
.dbline 112
; TimerStart();
.dbline 112
ldi R24,130
out 0x2e,R24
.dbline 112
.dbline 113
; PD|=0x02;
sbi 0x12,1
.dbline 114
rjmp L42
L41:
.dbline 114
.dbline 114
nop
.dbline 114
L42:
.dbline 114
; WaitLow ();
sbic 0x10,6
rjmp L41
.dbline 114
.dbline 114
.dbline 115
; PD&=(~0x02);
cbi 0x12,1
.dbline 116
; if(HowLong()>RESET_TIME){error=1;break;}
rcall _HowLong
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L47
.dbline 116
.dbline 116
clr R10
inc R10
.dbline 116
rjmp L29
X3:
.dbline 119
L46:
.dbline 119
.dbline 119
nop
.dbline 119
L47:
.dbline 119
;
; //通道3
; WaitHigh ();
sbis 0x10,6
rjmp L46
.dbline 119
.dbline 119
.dbline 120
; TimerStart();
.dbline 120
ldi R24,130
out 0x2e,R24
.dbline 120
.dbline 121
; PD|=0x04;
sbi 0x12,2
.dbline 122
rjmp L50
L49:
.dbline 122
.dbline 122
nop
.dbline 122
L50:
.dbline 122
; WaitLow ();
sbic 0x10,6
rjmp L49
.dbline 122
.dbline 122
.dbline 123
; PD&=(~0x04);
cbi 0x12,2
.dbline 124
; if(HowLong()>RESET_TIME){error=1;break;}
rcall _HowLong
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L55
.dbline 124
.dbline 124
clr R10
inc R10
.dbline 124
rjmp L29
X4:
.dbline 127
L54:
.dbline 127
.dbline 127
nop
.dbline 127
L55:
.dbline 127
;
; //通道4
; WaitHigh ();
sbis 0x10,6
rjmp L54
.dbline 127
.dbline 127
.dbline 128
; TimerStart();
.dbline 128
ldi R24,130
out 0x2e,R24
.dbline 128
.dbline 129
; PD|=0x08;
sbi 0x12,3
.dbline 130
rjmp L58
L57:
.dbline 130
.dbline 130
nop
.dbline 130
L58:
.dbline 130
; WaitLow ();
sbic 0x10,6
rjmp L57
.dbline 130
.dbline 130
.dbline 131
; PD&=(~0x08);
cbi 0x12,3
.dbline 132
; if(HowLong()>RESET_TIME){error=1;break;}
rcall _HowLong
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L63
.dbline 132
.dbline 132
clr R10
inc R10
.dbline 132
rjmp L29
X5:
.dbline 135
L62:
.dbline 135
.dbline 135
nop
.dbline 135
L63:
.dbline 135
;
; //通道5
; WaitHigh ();
sbis 0x10,6
rjmp L62
.dbline 135
.dbline 135
.dbline 136
; TimerStart();
.dbline 136
ldi R24,130
out 0x2e,R24
.dbline 136
.dbline 137
; PD|=0x10;
sbi 0x12,4
.dbline 138
rjmp L66
L65:
.dbline 138
.dbline 138
nop
.dbline 138
L66:
.dbline 138
; WaitLow ();
sbic 0x10,6
rjmp L65
.dbline 138
.dbline 138
.dbline 139
; PD&=(~0x10);
cbi 0x12,4
.dbline 140
; if(HowLong()>RESET_TIME){error=1;break;}
rcall _HowLong
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L71
.dbline 140
.dbline 140
clr R10
inc R10
.dbline 140
rjmp L29
X6:
.dbline 143
L70:
.dbline 143
.dbline 143
nop
.dbline 143
L71:
.dbline 143
;
; //通道6
; WaitHigh ();
sbis 0x10,6
rjmp L70
.dbline 143
.dbline 143
.dbline 144
; TimerStart();
.dbline 144
ldi R24,130
out 0x2e,R24
.dbline 144
.dbline 145
; PD|=0x10;
sbi 0x12,4
.dbline 146
rjmp L74
L73:
.dbline 146
.dbline 146
nop
.dbline 146
L74:
.dbline 146
; WaitLow ();
sbic 0x10,6
rjmp L73
.dbline 146
.dbline 146
.dbline 147
; PD&=(~0x10);
cbi 0x12,4
.dbline 148
; if(HowLong()>RESET_TIME){error=1;break;}
rcall _HowLong
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L79
.dbline 148
.dbline 148
clr R10
inc R10
.dbline 148
rjmp L29
X7:
.dbline 151
L78:
.dbline 151
.dbline 151
nop
.dbline 151
L79:
.dbline 151
;
; //开关数据通道
; WaitHigh ();
sbis 0x10,6
rjmp L78
.dbline 151
.dbline 151
.dbline 152
; TimerStart();
.dbline 152
ldi R24,130
out 0x2e,R24
.dbline 152
.dbline 153
rjmp L82
L81:
.dbline 153
.dbline 153
nop
.dbline 153
L82:
.dbline 153
; WaitLow ();
sbic 0x10,6
rjmp L81
.dbline 153
.dbline 153
.dbline 154
; temp=HowLong();
rcall _HowLong
mov R14,R16
mov R15,R17
.dbline 155
; if(temp>RESET_TIME){error=1;break;}
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L84
.dbline 155
.dbline 155
clr R10
inc R10
.dbline 155
rjmp L29
L84:
.dbline 156
ldi R24,1200
ldi R25,4
cp R24,R14
cpc R25,R15
brsh L86
.dbline 156
clr R12
inc R12
rjmp L89
L86:
.dbline 156
; if(temp>MID_TIME)sw_estate=1;else sw_estate=0;
clr R12
.dbline 159
rjmp L89
L88:
.dbline 159
.dbline 159
nop
.dbline 159
L89:
.dbline 159
;
; //开关复位信号通道
; WaitHigh ();
sbis 0x10,6
rjmp L88
.dbline 159
.dbline 159
.dbline 160
; TimerStart();
.dbline 160
ldi R24,130
out 0x2e,R24
.dbline 160
.dbline 161
rjmp L92
L91:
.dbline 161
.dbline 161
nop
.dbline 161
L92:
.dbline 161
; WaitLow ();
sbic 0x10,6
rjmp L91
.dbline 161
.dbline 161
.dbline 162
; temp=HowLong();
rcall _HowLong
mov R14,R16
mov R15,R17
.dbline 163
; if(temp>RESET_TIME){error=1;break;}
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L94
.dbline 163
.dbline 163
clr R10
inc R10
.dbline 163
rjmp L29
L94:
.dbline 164
ldi R24,1200
ldi R25,4
cp R24,R14
cpc R25,R15
brsh L96
.dbline 164
ldi R20,1
rjmp L97
L96:
.dbline 164
; if(temp>MID_TIME)sw_reset=1;else sw_reset=0;
clr R20
L97:
.dbline 165
; sw_counter++;
inc R22
.dbline 168
rjmp L99
L98:
.dbline 168
.dbline 168
nop
.dbline 168
L99:
.dbline 168
;
;
; WaitHigh ();
sbis 0x10,6
rjmp L98
.dbline 168
.dbline 168
.dbline 169
; TimerStart();//利用复位时间长,输出开关信号
.dbline 169
ldi R24,130
out 0x2e,R24
.dbline 169
.dbline 170
; if(sw_counter<8)
cpi R22,8
brsh L101
.dbline 171
tst R12
breq L103
.dbline 171
ldi R16,1
mov R17,R22
rcall lsl8
in R2,0x18
or R2,R16
out 0x18,R2
rjmp L104
L103:
.dbline 171
; if(sw_estate)PB|=(1<<sw_counter);else PB&=(~(1<<sw_counter));
ldi R16,1
mov R17,R22
rcall lsl8
mov R2,R16
com R2
in R3,0x18
and R3,R2
out 0x18,R3
L104:
L101:
.dbline 172
; if(sw_reset)
tst R20
breq L105
.dbline 173
; sw_counter=255;
ldi R22,255
L105:
.dbline 174
; WDR();
wdr
.dbline 175
rjmp L108
L107:
.dbline 175
.dbline 175
nop
.dbline 175
L108:
.dbline 175
; WaitLow ();
sbic 0x10,6
rjmp L107
.dbline 175
.dbline 175
.dbline 176
; if(HowLong()>RESET_TIME)break;
rcall _HowLong
ldi R24,2900
ldi R25,11
cp R24,R16
cpc R25,R17
brsh L110
.dbline 176
rjmp L29
L110:
.dbline 178
L28:
.dbline 101
rjmp L31
L29:
.dbline 179
L23:
.dbline 98
rjmp L22
X8:
.dbline -2
L21:
.dbline 0 ; func end
ret
.dbsym r sw_estate 12 c
.dbsym r sw_reset 20 c
.dbsym r sw_counter 22 c
.dbsym r error 10 c
.dbsym r temp 14 i
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -