📄 uncode.lst
字号:
__text_start:
__start:
000B EDCF LDI R28,0xDF
000C E0D0 LDI R29,0
000D BFCD OUT 0x3D,R28
000E BFDE OUT 0x3E,R29
000F 51C4 SUBI R28,0x14
0010 40D0 SBCI R29,0
0011 EA0A LDI R16,0xAA
0012 8308 STD Y+0,R16
0013 2400 CLR R0
0014 E6E0 LDI R30,0x60
0015 E0F0 LDI R31,0
0016 E010 LDI R17,0
0017 36E0 CPI R30,0x60
0018 07F1 CPC R31,R17
0019 F011 BEQ 0x001C
001A 9201 ST R0,Z+
001B CFFB RJMP 0x0017
001C 8300 STD Z+0,R16
001D E1E6 LDI R30,0x16
001E E0F0 LDI R31,0
001F E6A0 LDI R26,0x60
0020 E0B0 LDI R27,0
0021 E010 LDI R17,0
0022 31E6 CPI R30,0x16
0023 07F1 CPC R31,R17
0024 F021 BEQ 0x0029
0025 95C8 LPM
0026 9631 ADIW R30,1
0027 920D ST R0,X+
0028 CFF9 RJMP 0x0022
0029 D03F RCALL _main
_exit:
002A CFFF RJMP _exit
FILE: C:\DOCUME~1\Microsoft\桌面\解码器\uncode.c
(0001) //ICC-AVR application builder : 2006-2-7 20:37:19
(0002) // Target : 2313
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <io2313v.h>
(0006) #include <macros.h>
(0007) #include <stdio.h>
(0008) #define Uchar unsigned char
(0009) #define Uint unsigned int
(0010) #define PB PORTB
(0011) #define PD PORTD
(0012) #define nop() asm("nop")
(0013) #define _nop_() asm("nop")
(0014) #define INPUT (PIND&0x40)
(0015) #define TimerStart(); TCCR1B = 0x82;
(0016) //信号下降沿触发
(0017)
(0018)
(0019) #define WaitHigh(); while(!INPUT){nop();};
(0020) //只要高电平一出现就向下继续运行
(0021) #define WaitLow(); while(INPUT){nop();};
(0022) //只要高电平一出现就向下继续运行
(0023) #define RESET_TIME 2900
(0024) #define MID_TIME 1200
(0025) #define TOV1F TIFR&0x80
(0026) #define TOV1L TIFR|=0x80
(0027)
(0028)
(0029) Uint HowLong (void)
(0030) {Uint a=0;
_HowLong:
a --> R16
002B 2700 CLR R16
002C 2711 CLR R17
(0031) TCCR1B = 0x00; //stop timer
002D 2422 CLR R2
002E BC2E OUT 0x2E,R2
(0032) TCNT1=0;
002F 2433 CLR R3
0030 BC3D OUT 0x2D,R3
0031 BC2C OUT 0x2C,R2
(0033) return(ICR1);
0032 B504 IN R16,0x24
0033 B515 IN R17,0x25
0034 9508 RET
(0034) }
(0035)
(0036) void WaitReset (void)
(0037) {
_WaitReset:
0035 C014 RJMP 0x004A
(0038) while(1)
(0039) {
(0040) WaitLow ();
0036 0000 NOP
0037 9986 SBIC 0x10,6
0038 CFFD RJMP 0x0036
(0041) WaitHigh ();
0039 C001 RJMP 0x003B
003A 0000 NOP
003B 9B86 SBIS 0x10,6
003C CFFD RJMP 0x003A
(0042) TimerStart();
003D E882 LDI R24,0x82
003E BD8E OUT 0x2E,R24
(0043) WaitLow ();
003F C001 RJMP 0x0041
0040 0000 NOP
0041 9986 SBIC 0x10,6
0042 CFFD RJMP 0x0040
(0044) if(HowLong()>RESET_TIME)break;
0043 DFE7 RCALL _HowLong
0044 E584 LDI R24,0x54
0045 E09B LDI R25,0xB
0046 1780 CP R24,R16
0047 0791 CPC R25,R17
0048 F408 BCC 0x004A
0049 C001 RJMP 0x004B
004A CFEC RJMP 0x0037
(0045) };
004B 9508 RET
(0046) }
(0047)
(0048) void watchdog_init(void)
(0049) {
(0050) WDR(); //this prevents a timout on enabling
_watchdog_init:
004C 95A8 WDR
(0051) WDTCR = 0x0A; //WATCHDOG ENABLED - dont forget to issue WDRs
004D E08A LDI R24,0xA
004E BD81 OUT 0x21,R24
004F 9508 RET
(0052) }
(0053)
(0054) void timer1_init(void)
(0055) {
(0056) TCCR1B = 0x00; //stop timer
_timer1_init:
0050 2422 CLR R2
0051 BC2E OUT 0x2E,R2
(0057) TCNT1H = 0x00 /*INVALID SETTING*/; //set count value
0052 BC2D OUT 0x2D,R2
(0058) TCNT1L = 0x00 /*INVALID SETTING*/;
0053 BC2C OUT 0x2C,R2
(0059) OCR1H = 0x00; //set compare value
0054 BC2B OUT 0x2B,R2
(0060) OCR1L = 0x00;
0055 BC2A OUT 0x2A,R2
(0061) TCCR1A = 0x00;
0056 BC2F OUT 0x2F,R2
0057 9508 RET
(0062) }
(0063)
(0064)
(0065) void port_init(void)
(0066) {
(0067) PORTB = 0x00;
_port_init:
0058 2422 CLR R2
0059 BA28 OUT 0x18,R2
(0068) DDRB = 0xFF;
005A EF8F LDI R24,0xFF
005B BB87 OUT 0x17,R24
(0069) PORTD = 0x00;
005C BA22 OUT 0x12,R2
(0070) DDRD = 0x3F;
005D E38F LDI R24,0x3F
005E BB81 OUT 0x11,R24
005F 9508 RET
(0071) }
(0072)
(0073) //call this routine to initialize all peripherals
(0074) void init_devices(void)
(0075) {
(0076) //stop errant interrupts until set up
(0077) CLI(); //disable all interrupts
_init_devices:
0060 94F8 BCLR 7
(0078) port_init();
0061 DFF6 RCALL _port_init
(0079) timer1_init();
0062 DFED RCALL _timer1_init
(0080) MCUCR = 0x00;
0063 2422 CLR R2
0064 BE25 OUT 0x35,R2
(0081) GIMSK = 0x00;
0065 BE2B OUT 0x3B,R2
(0082) TIMSK = 0x00;
0066 BE29 OUT 0x39,R2
(0083) SEI(); //re-enable interrupts
0067 9478 BSET 7
0068 9508 RET
(0084) //all peripherals are now initialized
(0085) }
(0086)
(0087) main()
(0088) {
(0089) Uchar sw_counter=10;//数据在开关通道的位号码//10的作用:刚开机开关信号不稳定,这时的数据是未知的,等待一个复位信号后方可使用
_main:
sw_estate --> R12
sw_reset --> R20
sw_counter --> R22
error --> R10
temp --> R14
0069 E06A LDI R22,0xA
(0090) Uchar sw_estate;//开关通道数据的位状态
(0091) Uchar error=0;//是否存在错误帧
006A 24AA CLR R10
(0092) //说明:如果是错误帧造成的break,那么接下来的开关数据也是未知的,必须等待一个复位信号
(0093) Uint temp;//定时器缓寸
(0094) Uchar sw_reset=0;
006B 2744 CLR R20
(0095) watchdog_init();//打开狗
006C DFDF RCALL _watchdog_init
(0096) WaitReset ();
006D DFC7 RCALL _WaitReset
(0097) WDR();//喂狗
006E 95A8 WDR
006F C0E1 RJMP 0x0151
(0098) while(1)//1
(0099) {
(0100) if(error)sw_counter=10;//错误处理,防止产生一连串错误开关信号输出
0070 20AA TST R10
0071 F409 BNE 0x0073
0072 C0DD RJMP 0x0150
0073 E06A LDI R22,0xA
0074 C0DB RJMP 0x0150
(0101) while(1)//2
(0102) { //通道1
(0103) WaitHigh ();
0075 0000 NOP
0076 9B86 SBIS 0x10,6
0077 CFFD RJMP 0x0075
(0104) TimerStart();
0078 E882 LDI R24,0x82
0079 BD8E OUT 0x2E,R24
(0105) PD|=0x01;
007A 9A90 SBI 0x12,0
(0106) WaitLow ();
007B C001 RJMP 0x007D
007C 0000 NOP
007D 9986 SBIC 0x10,6
007E CFFD RJMP 0x007C
(0107) PD&=(~0x01);
007F 9890 CBI 0x12,0
(0108) if(HowLong()>RESET_TIME){error=1;break;}
0080 DFAA RCALL _HowLong
0081 E584 LDI R24,0x54
0082 E09B LDI R25,0xB
0083 1780 CP R24,R16
0084 0791 CPC R25,R17
0085 F420 BCC 0x008A
0086 24AA CLR R10
0087 94A3 INC R10
0088 C0C8 RJMP 0x0151
(0109)
(0110) //通道2
(0111) WaitHigh ();
0089 0000 NOP
008A 9B86 SBIS 0x10,6
008B CFFD RJMP 0x0089
(0112) TimerStart();
008C E882 LDI R24,0x82
008D BD8E OUT 0x2E,R24
(0113) PD|=0x02;
008E 9A91 SBI 0x12,1
(0114) WaitLow ();
008F C001 RJMP 0x0091
0090 0000 NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -