📄 push.lst
字号:
__text_start:
__start:
0013 E5CF LDI R28,0x5F
0014 E0D4 LDI R29,4
0015 BFCD OUT 0x3D,R28
0016 BFDE OUT 0x3E,R29
0017 51C0 SUBI R28,0x10
0018 40D0 SBCI R29,0
0019 EA0A LDI R16,0xAA
001A 8308 STD Y+0,R16
001B 2400 CLR R0
001C E6E0 LDI R30,0x60
001D E0F0 LDI R31,0
001E E010 LDI R17,0
001F 36E4 CPI R30,0x64
0020 07F1 CPC R31,R17
0021 F011 BEQ 0x0024
0022 9201 ST R0,Z+
0023 CFFB RJMP 0x001F
0024 8300 STD Z+0,R16
0025 E2E6 LDI R30,0x26
0026 E0F0 LDI R31,0
0027 E6A0 LDI R26,0x60
0028 E0B0 LDI R27,0
0029 E010 LDI R17,0
002A 32E6 CPI R30,0x26
002B 07F1 CPC R31,R17
002C F021 BEQ 0x0031
002D 95C8 LPM
002E 9631 ADIW R30,1
002F 920D ST R0,X+
0030 CFF9 RJMP 0x002A
0031 D0B9 RCALL _main
_exit:
0032 CFFF RJMP _exit
FILE: D:\工作\video切换\soft\按键切换\test.c
(0001) //ICC-AVR application builder : 2006-3-22 10:22:28
(0002) // Target : M8
(0003) // Crystal: 11.059Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) //#include <stddef.h>
(0008)
(0009) unsigned char ICP_Flag;
(0010) unsigned int ICP_value_down;
(0011) unsigned char state;
(0012)
(0013) #define LED1_ON() PORTD=0x01;PORTC = 0x00;PORTC=0x01;
(0014) #define LED2_ON() PORTD=0x02;PORTC = 0x00;PORTC=0x02;
(0015) #define LED3_ON() PORTD=0x04;PORTC = 0x00;PORTC=0x04;
(0016) #define LED4_ON() PORTD=0x08;PORTC = 0x00;PORTC=0x08;
(0017)
(0018) void port_init(void)
(0019) {
(0020) PORTB = 0x00;
_port_init:
0033 2422 CLR R2
0034 BA28 OUT 0x18,R2
(0021) DDRB = 0x00;
0035 BA27 OUT 0x17,R2
(0022) PORTC = 0x00; //m103 output only
0036 BA25 OUT 0x15,R2
(0023) DDRC = 0x0F;
0037 E08F LDI R24,0xF
0038 BB84 OUT 0x14,R24
(0024) PORTD = 0x00;
0039 BA22 OUT 0x12,R2
(0025) DDRD = 0x0F;
003A BB81 OUT 0x11,R24
(0026) }
003B 9508 RET
(0027)
(0028) //TIMER1 initialize - prescale:Stop
(0029) // WGM: 0) Normal, TOP=0xFFFF
(0030) // desired value: 1Hz
(0031) // actual value: Out of range
(0032) void timer1_init(void)
(0033) {
(0034) TCCR1B = 0x00; //stop
_timer1_init:
003C 2422 CLR R2
003D BC2E OUT 0x2E,R2
(0035) TCNT1H = 0x00 /*INVALID SETTING*/; //setup
003E BC2D OUT 0x2D,R2
(0036) TCNT1L = 0x00 /*INVALID SETTING*/;
003F BC2C OUT 0x2C,R2
(0037) OCR1AH = 0x00 /*INVALID SETTING*/;
0040 BC2B OUT 0x2B,R2
(0038) OCR1AL = 0x00 /*INVALID SETTING*/;
0041 BC2A OUT 0x2A,R2
(0039) OCR1BH = 0x00 /*INVALID SETTING*/;
0042 BC29 OUT 0x29,R2
(0040) OCR1BL = 0x00 /*INVALID SETTING*/;
0043 BC28 OUT 0x28,R2
(0041) ICR1H = 0x00 /*INVALID SETTING*/;
0044 BC27 OUT 0x27,R2
(0042) ICR1L = 0x00 /*INVALID SETTING*/;
0045 BC26 OUT 0x26,R2
(0043) TCCR1A = 0x00;
0046 BC2F OUT 0x2F,R2
(0044) TCCR1B = 0xC0; //start Timer
0047 EC80 LDI R24,0xC0
0048 BD8E OUT 0x2E,R24
(0045) }
0049 9508 RET
_delay_s:
i --> R20
j --> R22
x --> R16
004A D0C7 RCALL push_gset2
(0046)
(0047) ///////////////////////////////////////延时程序
(0048) void delay_s(char x)
(0049) {
004B C010 RJMP 0x005C
(0050) int i;
(0051) int j;
(0052) while(x--)
(0053) {
(0054) for(i=0;i<500;i++)
004C 2744 CLR R20
004D 2755 CLR R21
(0055) {
(0056) for(j=0;j<1000;j++)
004E 2766 CLR R22
004F 2777 CLR R23
0050 5F6F SUBI R22,0xFF
0051 4F7F SBCI R23,0xFF
0052 3E68 CPI R22,0xE8
0053 E0E3 LDI R30,3
0054 077E CPC R23,R30
0055 F3D4 BLT 0x0050
0056 5F4F SUBI R20,0xFF
0057 4F5F SBCI R21,0xFF
0058 3F44 CPI R20,0xF4
0059 E0E1 LDI R30,1
005A 075E CPC R21,R30
005B F394 BLT 0x004E
005C 2E20 MOV R2,R16
005D 2433 CLR R3
005E 5001 SUBI R16,1
005F 2022 TST R2
0060 F759 BNE 0x004C
(0057) ;
(0058) }
(0059) }
(0060) }
0061 D097 RCALL pop_gset2
0062 9508 RET
_VideoSwitch:
Counter --> R20
0063 D097 RCALL push_gset1
0064 01A8 MOVW R20,R16
(0061) //////////////////////////////////////
(0062)
(0063) void VideoSwitch(unsigned int Counter) //根据捕捉计数值切换视频通道
(0064) {
(0065) if(Counter>0x0D7E)
0065 E78E LDI R24,0x7E
0066 E09D LDI R25,0xD
0067 1784 CP R24,R20
0068 0795 CPC R25,R21
0069 F408 BCC 0x006B
(0066) { //超过2.5ms,可能是漏掉了一个脉宽信号,不做动作
(0067) //LED1_ON();
(0068) return;
006A C02A RJMP 0x0095
(0069) }
(0070)
(0071) if(Counter<0x0818)//状态1: 0.5~1.5ms
006B 3148 CPI R20,0x18
006C E0E8 LDI R30,0x8
006D 075E CPC R21,R30
006E F408 BCC 0x0070
(0072) {
(0073) //LED2_ON();
(0074) }
006F C025 RJMP 0x0095
(0075) else
(0076) { //1.5ms~2.5ms
(0077) if(state > 1)
0070 E081 LDI R24,1
0071 90200060 LDS R2,_state
0073 1582 CP R24,R2
0074 F418 BCC 0x0078
(0078) state = 0;
0075 2422 CLR R2
0076 92200060 STS _state,R2
(0079)
(0080) switch(state)
0078 91400060 LDS R20,_state
007A 2755 CLR R21
007B 3040 CPI R20,0
007C 0745 CPC R20,R21
007D F029 BEQ 0x0083
007E 3041 CPI R20,1
007F E0E0 LDI R30,0
0080 075E CPC R21,R30
0081 F039 BEQ 0x0089
0082 C00B RJMP 0x008E
(0081) {
(0082) case 0:
(0083) LED2_ON();
0083 E082 LDI R24,2
0084 BB82 OUT 0x12,R24
0085 2422 CLR R2
0086 BA25 OUT 0x15,R2
0087 BB85 OUT 0x15,R24
(0084) break;
0088 C005 RJMP 0x008E
(0085) case 1:
(0086) LED4_ON();
0089 E088 LDI R24,0x8
008A BB82 OUT 0x12,R24
008B 2422 CLR R2
008C BA25 OUT 0x15,R2
008D BB85 OUT 0x15,R24
(0087) break;
(0088) }
(0089) state++;
008E 91800060 LDS R24,_state
0090 5F8F SUBI R24,0xFF
0091 93800060 STS _state,R24
(0090) delay_s(4);
0093 E004 LDI R16,4
0094 DFB5 RCALL _delay_s
(0091) return;
(0092) // LED3_ON();
(0093) }
(0094) }
0095 D068 RCALL pop_gset1
0096 9508 RET
_timer1_ovf_isr:
0097 922A ST R2,-Y
0098 938A ST R24,-Y
0099 B62F IN R2,0x3F
009A 922A ST R2,-Y
(0095)
(0096) #pragma interrupt_handler timer1_ovf_isr:9
(0097) void timer1_ovf_isr(void)
(0098) {
(0099) //TIMER1 has overflowed
(0100) TCNT1H = 0x00 /*INVALID SETTING*/; //reload counter high value
009B 2422 CLR R2
009C BC2D OUT 0x2D,R2
(0101) TCNT1L = 0x00 /*INVALID SETTING*/; //reload counter low value
009D BC2C OUT 0x2C,R2
(0102) TCCR1B |= 0xc0; //回到等待上升沿的状态
009E B58E IN R24,0x2E
009F 6C80 ORI R24,0xC0
00A0 BD8E OUT 0x2E,R24
(0103) }
00A1 9029 LD R2,Y+
00A2 BE2F OUT 0x3F,R2
00A3 9189 LD R24,Y+
00A4 9029 LD R2,Y+
00A5 9518 RETI
_timer1_capt_isr:
00A6 D06E RCALL push_lset
00A7 D053 RCALL push_gset1
(0104)
(0105) #pragma interrupt_handler timer1_capt_isr:6
(0106) void timer1_capt_isr(void)
(0107) {
(0108) //timer 1 input capture event, read (int)value in ICR1 using;
(0109) // value=ICR1L; //Read low byte first (important)
(0110) // value|=(int)ICR1H << 8; //Read high byte and shift into top byte
(0111) switch(ICP_Flag)//根据状态值判断捕捉到的是什么跳变信号
00A8 91400063 LDS R20,_ICP_Flag
00AA 2755 CLR R21
00AB 3040 CPI R20,0
00AC 0745 CPC R20,R21
00AD F089 BEQ 0x00BF
00AE 3041 CPI R20,1
00AF E0E0 LDI R30,0
00B0 075E CPC R21,R30
00B1 F009 BEQ 0x00B3
00B2 C02B RJMP 0x00DE
(0112) {
(0113) case 1://0x40://捕捉到上升沿
(0114) TCNT1H = 0x00; //reload counter high value
00B3 2422 CLR R2
00B4 BC2D OUT 0x2D,R2
(0115) TCNT1L = 0x00; //reload counter low value
00B5 BC2C OUT 0x2C,R2
(0116) TCCR1B &= 0xBF; //ICES1->0,转为捕捉下降沿
00B6 B58E IN R24,0x2E
00B7 7B8F ANDI R24,0xBF
00B8 BD8E OUT 0x2E,R24
(0117) TCCR1B |= 0x82; //开捕捉,开启定时器,8分频
00B9 B58E IN R24,0x2E
00BA 6882 ORI R24,0x82
00BB BD8E OUT 0x2E,R24
(0118) ICP_Flag = 0;
00BC 92200063 STS _ICP_Flag,R2
(0119) break;
00BE C01F RJMP 0x00DE
(0120)
(0121) case 0://0x00://捕捉到下降沿
(0122) TCCR1B &= 0xf8; //关闭定时器
00BF B58E IN R24,0x2E
00C0 7F88 ANDI R24,0xF8
00C1 BD8E OUT 0x2E,R24
(0123) ICP_value_down = ICR1L;//Read low byte first (important)
00C2 B426 IN R2,0x26
00C3 2433 CLR R3
00C4 92300062 STS _ICP_value_down+1,R3
00C6 92200061 STS _ICP_value_down,R2
(0124) ICP_value_down |= (int)ICR1H << 8; //Read high byte and shift into top byte
00C8 B427 IN R2,0x27
00C9 2433 CLR R3
00CA 2C32 MOV R3,R2
00CB 2422 CLR R2
00CC 90400061 LDS R4,_ICP_value_down
00CE 90500062 LDS R5,_ICP_value_down+1
00D0 2842 OR R4,R2
00D1 2853 OR R5,R3
00D2 92500062 STS _ICP_value_down+1,R5
00D4 92400061 STS _ICP_value_down,R4
(0125) VideoSwitch(ICP_value_down);
00D6 0182 MOVW R16,R4
00D7 DF8B RCALL _VideoSwitch
(0126) TCCR1B |= 0x40; //ICES1->1完成一个正脉宽捕捉,回到等待上升沿的状态
00D8 B58E IN R24,0x2E
00D9 6480 ORI R24,0x40
00DA BD8E OUT 0x2E,R24
(0127) ICP_Flag = 1;
00DB E081 LDI R24,1
00DC 93800063 STS _ICP_Flag,R24
(0128) break;
(0129) }
(0130) }
00DE D01F RCALL pop_gset1
00DF D04C RCALL pop_lset
00E0 9518 RETI
(0131)
(0132) //call this routine to initialize all peripherals
(0133) void init_devices(void)
(0134) {
(0135) //stop errant interrupts until set up
(0136) CLI(); //disable all interrupts
_init_devices:
00E1 94F8 BCLR 7
(0137) port_init();
00E2 DF50 RCALL _port_init
(0138) timer1_init();
00E3 DF58 RCALL _timer1_init
(0139)
(0140) MCUCR = 0x00;
00E4 2422 CLR R2
00E5 BE25 OUT 0x35,R2
(0141) GICR = 0x00;
00E6 BE2B OUT 0x3B,R2
(0142) TIMSK = 0x24; //timer interrupt sources
00E7 E284 LDI R24,0x24
00E8 BF89 OUT 0x39,R24
(0143) SEI(); //re-enable interrupts
00E9 9478 BSET 7
(0144) //all peripherals are now initialized
(0145) }
00EA 9508 RET
(0146)
(0147) void main()
(0148) {
(0149) init_devices();
_main:
00EB DFF5 RCALL _init_devices
(0150) state = 0;
00EC 2422 CLR R2
00ED 92200060 STS _state,R2
(0151) ICP_value_down = 0;
00EF 2433 CLR R3
00F0 92300062 STS _ICP_value_down+1,R3
00F2 92200061 STS _ICP_value_down,R2
(0152) PORTD = 0x08;
00F4 E088 LDI R24,0x8
00F5 BB82 OUT 0x12,R24
(0153) PORTC = 0x08;
00F6 BB85 OUT 0x15,R24
(0154) while(1)
00F7 CFFF RJMP 0x00F7
(0155) {
(0156) ;
(0157) }
(0158) }
FILE: <library>
00F8 9508 RET
pop_gset2:
00F9 E0E2 LDI R30,2
00FA C004 RJMP pop
push_gset1:
00FB 935A ST R21,-Y
00FC 934A ST R20,-Y
00FD 9508 RET
pop_gset1:
00FE E0E1 LDI R30,1
pop:
00FF 9149 LD R20,Y+
0100 9159 LD R21,Y+
0101 FDE0 SBRC R30,0
0102 9508 RET
0103 9169 LD R22,Y+
0104 9179 LD R23,Y+
0105 FDE1 SBRC R30,1
0106 9508 RET
0107 90A9 LD R10,Y+
0108 90B9 LD R11,Y+
0109 FDE2 SBRC R30,2
010A 9508 RET
010B 90C9 LD R12,Y+
010C 90D9 LD R13,Y+
010D FDE3 SBRC R30,3
010E 9508 RET
010F 90E9 LD R14,Y+
0110 90F9 LD R15,Y+
0111 9508 RET
push_gset2:
0112 937A ST R23,-Y
0113 936A ST R22,-Y
0114 CFE6 RJMP push_gset1
push_lset:
0115 93FA ST R31,-Y
0116 93EA ST R30,-Y
0117 93BA ST R27,-Y
0118 93AA ST R26,-Y
0119 939A ST R25,-Y
011A 938A ST R24,-Y
011B 933A ST R19,-Y
011C 932A ST R18,-Y
011D 931A ST R17,-Y
011E 930A ST R16,-Y
011F 929A ST R9,-Y
0120 928A ST R8,-Y
0121 927A ST R7,-Y
0122 926A ST R6,-Y
0123 925A ST R5,-Y
0124 924A ST R4,-Y
0125 923A ST R3,-Y
0126 922A ST R2,-Y
0127 921A ST R1,-Y
0128 920A ST R0,-Y
0129 B60F IN R0,0x3F
012A 920A ST R0,-Y
012B 9508 RET
pop_lset:
012C 9009 LD R0,Y+
012D BE0F OUT 0x3F,R0
012E 9009 LD R0,Y+
012F 9019 LD R1,Y+
0130 9029 LD R2,Y+
0131 9039 LD R3,Y+
0132 9049 LD R4,Y+
0133 9059 LD R5,Y+
0134 9069 LD R6,Y+
0135 9079 LD R7,Y+
0136 9089 LD R8,Y+
0137 9099 LD R9,Y+
0138 9109 LD R16,Y+
0139 9119 LD R17,Y+
013A 9129 LD R18,Y+
013B 9139 LD R19,Y+
013C 9189 LD R24,Y+
013D 9199 LD R25,Y+
013E 91A9 LD R26,Y+
013F 91B9 LD R27,Y+
0140 91E9 LD R30,Y+
0141 91F9 LD R31,Y+
0142 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -