📄 exp1.lst
字号:
\ 000000C0 9100.... LDS R16, time_left
\ 000000C4 2300 TST R16
\ 000000C6 F031 BREQ ??Do_States_10
85 {
86 --time_left;
\ 000000C8 .... LDI R30, time_left
\ 000000CA E0F0 LDI R31, 0
\ 000000CC 8100 LD R16, Z
\ 000000CE 950A DEC R16
\ 000000D0 8300 ST Z, R16
87 return; //return to main
\ 000000D2 9508 RET
88 } //time expired, so..
89 time_left=5; //give 5 seconds to WARNING
\ ??Do_States_10:
\ 000000D4 E005 LDI R16, 5
\ 000000D6 9300.... STS time_left, R16
90 current_state=NS_WARNING; //time expired, move
\ 000000DA E003 LDI R16, 3
\ 000000DC E010 LDI R17, 0
\ 000000DE .... LDI R30, current_state
\ 000000E0 E0F0 LDI R31, 0
\ 000000E2 8300 ST Z, R16
\ 000000E4 8311 STD Z+1, R17
\ 000000E6 9508 RET
91 break; //to the next state
92
93 case NS_WARNING:
94 EW_GRN_LITE=0;
\ ??Do_States_11:
\ 000000E8 98C2 CBI 0x18, 0x02
95 NS_GRN_LITE=0;
\ 000000EA 98C5 CBI 0x18, 0x05
96 NS_RED_LITE=0; //north-south has the yellow..
\ 000000EC 98C3 CBI 0x18, 0x03
97 EW_RED_LITE=1;
\ 000000EE 9AC0 SBI 0x18, 0x00
98 EW_YEL_LITE=0; //and east-west has the red..
\ 000000F0 98C1 CBI 0x18, 0x01
99 NS_YEL_LITE=1;
\ 000000F2 9AC4 SBI 0x18, 0x04
100
101 if(time_left!=0) //count down the time
\ 000000F4 9100.... LDS R16, time_left
\ 000000F8 2300 TST R16
\ 000000FA F031 BREQ ??Do_States_12
102 {
103 --time_left;
\ 000000FC .... LDI R30, time_left
\ 000000FE E0F0 LDI R31, 0
\ 00000100 8100 LD R16, Z
\ 00000102 950A DEC R16
\ 00000104 8300 ST Z, R16
104 return; //return to main
\ 00000106 9508 RET
105 } //time expired, so..
106 if(FOUR_WAY_STOP) //if 4-way requested then start
\ ??Do_States_12:
\ 00000108 9BCB SBIS 0x19, 0x03
\ 0000010A C007 RJMP ??Do_States_13
107 current_state=FLASHER; //the flasher
\ 0000010C E004 LDI R16, 4
\ 0000010E E010 LDI R17, 0
\ 00000110 .... LDI R30, current_state
\ 00000112 E0F0 LDI R31, 0
\ 00000114 8300 ST Z, R16
\ 00000116 8311 STD Z+1, R17
\ 00000118 9508 RET
108 else //otherwise..
109 {
110 time_left=30; //give 30 seconds to MOVING
\ ??Do_States_13:
\ 0000011A E10E LDI R16, 30
\ 0000011C 9300.... STS time_left, R16
111 current_state=EW_MOVING;
\ 00000120 E000 LDI R16, 0
\ 00000122 E010 LDI R17, 0
\ 00000124 .... LDI R30, current_state
\ 00000126 E0F0 LDI R31, 0
\ 00000128 8300 ST Z, R16
\ 0000012A 8311 STD Z+1, R17
\ 0000012C 9508 RET
112 } //time expired, move
113 break; //to the next state
114
115 case FLASHER:
116 EW_GRN_LITE=0; //all yellow and
\ ??Do_States_14:
\ 0000012E 98C2 CBI 0x18, 0x02
117 NS_GRN_LITE=0; //green lites off
\ 00000130 98C5 CBI 0x18, 0x05
118 EW_YEL_LITE=0;
\ 00000132 98C1 CBI 0x18, 0x01
119 NS_YEL_LITE=0;
\ 00000134 98C4 CBI 0x18, 0x04
120
121 flash_toggle^=1; //toggle LSB..
\ 00000136 E001 LDI R16, 1
\ 00000138 .... LDI R30, flash_toggle
\ 0000013A E0F0 LDI R31, 0
\ 0000013C 8110 LD R17, Z
\ 0000013E 2710 EOR R17, R16
\ 00000140 8310 ST Z, R17
122 if(flash_toggle&1)
\ 00000142 .... LDI R30, flash_toggle
\ 00000144 E0F0 LDI R31, 0
\ 00000146 8100 LD R16, Z
\ 00000148 FF00 SBRS R16, 0
\ 0000014A C003 RJMP ??Do_States_15
123 {
124 NS_RED_LITE=1; //blink red lights
\ 0000014C 9AC3 SBI 0x18, 0x03
125 EW_RED_LITE=0;
\ 0000014E 98C0 CBI 0x18, 0x00
\ 00000150 C002 RJMP ??Do_States_16
126 }
127 else
128 {
129 NS_RED_LITE=0; //alternately
\ ??Do_States_15:
\ 00000152 98C3 CBI 0x18, 0x03
130 EW_RED_LITE=1;
\ 00000154 9AC0 SBI 0x18, 0x00
131 }
132 if(!FOUR_WAY_STOP) //if no longer a 4-way stop
\ ??Do_States_16:
\ 00000156 99CB SBIC 0x19, 0x03
\ 00000158 C00D RJMP ??Do_States_17
133 current_state=EW_WARNING;
\ 0000015A E001 LDI R16, 1
\ 0000015C E010 LDI R17, 0
\ 0000015E .... LDI R30, current_state
\ 00000160 E0F0 LDI R31, 0
\ 00000162 8300 ST Z, R16
\ 00000164 8311 STD Z+1, R17
\ 00000166 9508 RET
134 break; //then return to normal
135 default:
136 current_state=NS_WARNING;
\ ??Do_States_18:
\ 00000168 E003 LDI R16, 3
\ 0000016A E010 LDI R17, 0
\ 0000016C .... LDI R30, current_state
\ 0000016E E0F0 LDI R31, 0
\ 00000170 8300 ST Z, R16
\ 00000172 8311 STD Z+1, R17
\ ??Do_States_17:
\ 00000174 9508 RET
137 break; //set any unknown state to a good one!!
138 }
139 }
140
\ In segment CODE, align 2, keep-with-next
141 void main(void)
\ main:
142 {
143 DDRB=0xFF; //portb all out
\ 00000000 EF0F LDI R16, 255
\ 00000002 BB07 OUT 0x17, R16
144 DDRA=0x00; //porta all in
\ 00000004 E000 LDI R16, 0
\ 00000006 BB0A OUT 0x1A, R16
145
146 current_state=NS_WARNING; //initialize to a good starting
\ 00000008 E003 LDI R16, 3
\ 0000000A E010 LDI R17, 0
\ 0000000C .... LDI R30, current_state
\ 0000000E E0F0 LDI R31, 0
\ 00000010 8300 ST Z, R16
\ 00000012 8311 STD Z+1, R17
147 //state (as safe as possible)
148 while(1)
149 {
150 __delay_cycles(100000); //1 second delay.., this time could
\ ??main_0:
\ 00000014 EA07 LDI R16, 167
\ 00000016 E611 LDI R17, 97
\ 00000018 5001 SUBI R16, 1
\ 0000001A 4010 SBCI R17, 0
\ 0000001C F7E9 BRNE $-4
\ 0000001E C000 RJMP $+2
\ 00000020 0000 NOP
151 //be used for other needed processes
152 Do_States(); //call the state machine, it knows
\ 00000022 .... RCALL Do_States
\ 00000024 CFF7 RJMP ??main_0
153 //where it is and what to do next
154 }
155 }
\ In segment SWITCH, align 2, keep-with-next
\ `?<Jumptable for Do_States>_0`:
\ 00000000 0000 DW 0
\ 00000002 00 DB 0
\ 00000003 .... DW (??Do_States_18) /2
\ 00000005 0005 DW 5
\ 00000007 .... DW (??Do_States_0) /2
\ 00000009 .... DW (??Do_States_4) /2
\ 0000000B .... DW (??Do_States_7) /2
\ 0000000D .... DW (??Do_States_11) /2
\ 0000000F .... DW (??Do_States_14) /2
\ 00000011 00 DB 0
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
Do_States 0 2
main 0 2
-> Do_States 0 2
Segment part sizes:
Function/Label Bytes
-------------- -----
_A_DDRB 1
_A_PORTB 1
_A_PINA 1
_A_DDRA 1
time_left 1
current_state 2
flash_toggle 1
Do_States 374
main 38
?<Jumptable for Do_States>_0 18
Others 6
4 bytes in segment ABSOLUTE
412 bytes in segment CODE
6 bytes in segment INITTAB
18 bytes in segment SWITCH
4 bytes in segment TINY_Z
430 bytes of CODE memory (+ 6 bytes shared)
4 bytes of DATA memory (+ 4 bytes shared)
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -