📄 mcu.lst
字号:
00FB F448 BCC 0x0105
(0038) {
(0039) s_unLoopTimeCnt = 0;
00FC 2422 CLR R2
00FD 2433 CLR R3
00FE 92300113 STS s_unLoopTimeCnt+1,R3
0100 92200112 STS s_unLoopTimeCnt,R2
(0040) g_ucLoopTimeFlag = true;
0102 EF8F LDI R24,0xFF
0103 93800103 STS g_ucLoopTimeFlag,R24
(0041) }
0105 9029 LD R2,Y+
0106 BE2F OUT 0x3F,R2
0107 9199 LD R25,Y+
0108 9189 LD R24,Y+
0109 9039 LD R3,Y+
010A 9029 LD R2,Y+
010B 9518 RETI
(0042)
(0043) }
(0044)
(0045) void KeyScanTask(void)
(0046) {
(0047) static uchar s_ucKeyDitheringCnt = 0; //avoid dithering
(0048) static uchar s_ucKeyPressCnt = 0; //count the sequence of the pressed key
(0049)
(0050) if(PINB & 0x01) //if the input voltage is high
_KeyScanTask:
010C 9B18 SBIS 0x03,0
010D C013 RJMP 0x0121
(0051) {
(0052) s_ucKeyDitheringCnt++;
010E 91800114 LDS R24,s_ucKeyDitheringCnt
0110 5F8F SUBI R24,0xFF
0111 93800114 STS s_ucKeyDitheringCnt,R24
(0053) if(s_ucKeyDitheringCnt > 5) //delay time 5x2=10ms;avoid dithering
0113 E085 LDI R24,5
0114 90200114 LDS R2,s_ucKeyDitheringCnt
0116 1582 CP R24,R2
0117 F500 BCC 0x0138
(0054) {
(0055) s_ucKeyDitheringCnt = 0;
0118 2422 CLR R2
0119 92200114 STS s_ucKeyDitheringCnt,R2
(0056) if(PINB & 0x01)
011B 9B18 SBIS 0x03,0
011C C01B RJMP 0x0138
(0057) g_ucKeyPressed = true;
011D EF8F LDI R24,0xFF
011E 93800104 STS g_ucKeyPressed,R24
(0058) }
(0059) }
0120 C017 RJMP 0x0138
(0060) else
(0061) {
(0062) s_ucKeyDitheringCnt = 0;
0121 2422 CLR R2
0122 92200114 STS s_ucKeyDitheringCnt,R2
(0063) if(g_ucKeyPressed)
0124 90200104 LDS R2,g_ucKeyPressed
0126 2022 TST R2
0127 F081 BEQ 0x0138
(0064) {
(0065) s_ucKeyPressCnt++;
0128 91800115 LDS R24,s_ucKeyPressCnt
012A 5F8F SUBI R24,0xFF
012B 93800115 STS s_ucKeyPressCnt,R24
(0066) if(s_ucKeyPressCnt > 3)
012D E083 LDI R24,3
012E 90200115 LDS R2,s_ucKeyPressCnt
0130 1582 CP R24,R2
0131 F418 BCC 0x0135
(0067) s_ucKeyPressCnt = 1;
0132 E081 LDI R24,1
0133 93800115 STS s_ucKeyPressCnt,R24
(0068) g_ucKeyPressed = false;
0135 2422 CLR R2
0136 92200104 STS g_ucKeyPressed,R2
(0069) }
(0070) }
(0071) g_ucKeyPressedCnt = s_ucKeyPressCnt;
0138 90200115 LDS R2,s_ucKeyPressCnt
013A 92200105 STS g_ucKeyPressedCnt,R2
013C 9508 RET
_KeyPressedTask:
013D 9721 SBIW R28,1
(0072) }
(0073)
(0074) void KeyPressedTask(void)
(0075) {
(0076) static uint s_unLedFlashTimeDly = 0;
(0077) static uchar s_ucLedFlashCnt = 4;
(0078) if(g_ucKeyPressedCnt == 1) //press the first
013E 91800105 LDS R24,g_ucKeyPressedCnt
0140 3081 CPI R24,1
0141 F439 BNE 0x0149
(0079) IICSendStr(0x60,g_ucTorchIICData,2);
0142 E082 LDI R24,2
0143 8388 STD Y+0,R24
0144 E026 LDI R18,6
0145 E031 LDI R19,1
0146 E600 LDI R16,0x60
0147 DF6C RCALL _IICSendStr
0148 C064 RJMP 0x01AD
(0080) else if(g_ucKeyPressedCnt == 2)
0149 91800105 LDS R24,g_ucKeyPressedCnt
014B 3082 CPI R24,2
014C F439 BNE 0x0154
(0081) IICSendStr(0x60,g_ucLightOFFData,2);
014D E082 LDI R24,2
014E 8388 STD Y+0,R24
014F E02C LDI R18,0xC
0150 E031 LDI R19,1
0151 E600 LDI R16,0x60
0152 DF61 RCALL _IICSendStr
0153 C059 RJMP 0x01AD
(0082) else if(g_ucKeyPressedCnt == 3) //press the second
0154 91800105 LDS R24,g_ucKeyPressedCnt
0156 3083 CPI R24,3
0157 F009 BEQ 0x0159
0158 C047 RJMP 0x01A0
(0083) {
(0084) if(s_ucLedFlashCnt > 0)
0159 2422 CLR R2
015A 90300118 LDS R3,s_ucLedFlashCnt
015C 1423 CP R2,R3
015D F578 BCC 0x018D
(0085) {
(0086) s_unLedFlashTimeDly++;
015E 91800116 LDS R24,s_unLedFlashTimeDly
0160 91900117 LDS R25,s_unLedFlashTimeDly+1
0162 9601 ADIW R24,1
0163 93900117 STS s_unLedFlashTimeDly+1,R25
0165 93800116 STS s_unLedFlashTimeDly,R24
(0087) if(s_unLedFlashTimeDly < 50)
0167 3382 CPI R24,0x32
0168 E0E0 LDI R30,0
0169 079E CPC R25,R30
016A F438 BCC 0x0172
(0088) IICSendStr(0x60,g_ucIledIICData,2); //led is on
016B E082 LDI R24,2
016C 8388 STD Y+0,R24
016D E028 LDI R18,0x8
016E E031 LDI R19,1
016F E600 LDI R16,0x60
0170 DF43 RCALL _IICSendStr
0171 C03B RJMP 0x01AD
(0089) else if(s_unLedFlashTimeDly < 100)
0172 91800116 LDS R24,s_unLedFlashTimeDly
0174 91900117 LDS R25,s_unLedFlashTimeDly+1
0176 3684 CPI R24,0x64
0177 E0E0 LDI R30,0
0178 079E CPC R25,R30
0179 F438 BCC 0x0181
(0090) IICSendStr(0x60,g_ucLightOFFData,2); //led is off
017A E082 LDI R24,2
017B 8388 STD Y+0,R24
017C E02C LDI R18,0xC
017D E031 LDI R19,1
017E E600 LDI R16,0x60
017F DF34 RCALL _IICSendStr
0180 C02C RJMP 0x01AD
(0091) else
(0092) {
(0093) s_unLedFlashTimeDly = 0;
0181 2422 CLR R2
0182 2433 CLR R3
0183 92300117 STS s_unLedFlashTimeDly+1,R3
0185 92200116 STS s_unLedFlashTimeDly,R2
(0094) s_ucLedFlashCnt--;
0187 91800118 LDS R24,s_ucLedFlashCnt
0189 5081 SUBI R24,1
018A 93800118 STS s_ucLedFlashCnt,R24
(0095) }
(0096) }
018C C020 RJMP 0x01AD
(0097) else
(0098) {
(0099) IICSendStr(0x60,g_ucFlashEnIICData,2); //enalble flash
018D E082 LDI R24,2
018E 8388 STD Y+0,R24
018F E02E LDI R18,0xE
0190 E031 LDI R19,1
0191 E600 LDI R16,0x60
0192 DF21 RCALL _IICSendStr
(0100) IICSendStr(0x60,g_ucFlashTimerIICData,2);
0193 E082 LDI R24,2
0194 8388 STD Y+0,R24
0195 E120 LDI R18,0x10
0196 E031 LDI R19,1
0197 E600 LDI R16,0x60
0198 DF1B RCALL _IICSendStr
(0101) IICSendStr(0x60,g_ucFlashIICData,2); //flash is on
0199 E082 LDI R24,2
019A 8388 STD Y+0,R24
019B E02A LDI R18,0xA
019C E031 LDI R19,1
019D E600 LDI R16,0x60
019E DF15 RCALL _IICSendStr
(0102) }
(0103) }
019F C00D RJMP 0x01AD
(0104) else if(g_ucKeyPressedCnt == 4) //press the third
01A0 91800105 LDS R24,g_ucKeyPressedCnt
01A2 3084 CPI R24,4
01A3 F449 BNE 0x01AD
(0105) {
(0106) IICSendStr(0x60,g_ucLightOFFData,2); //led is off
01A4 E082 LDI R24,2
01A5 8388 STD Y+0,R24
01A6 E02C LDI R18,0xC
01A7 E031 LDI R19,1
01A8 E600 LDI R16,0x60
01A9 DF0A RCALL _IICSendStr
(0107) s_ucLedFlashCnt = 4;
01AA E084 LDI R24,4
01AB 93800118 STS s_ucLedFlashCnt,R24
(0108) }
01AD 9621 ADIW R28,1
01AE 9508 RET
(0109) }
(0110)
(0111)
(0112)
(0113)
(0114) //call this routine to initialize all peripherals
(0115) void init_devices(void)
(0116) {
(0117) //stop errant interrupts until set up
(0118) CLI(); //disable all interrupts
_init_devices:
01AF 94F8 BCLR 7
(0119) port_init();
01B0 DF1F RCALL _port_init
(0120) twi_init();
01B1 DE95 RCALL _twi_init
(0121) timer0_init();
01B2 DF27 RCALL _timer0_init
(0122)
(0123) MCUCR = 0x00;
01B3 2422 CLR R2
01B4 BE25 OUT 0x35,R2
(0124) EICRA = 0x0A; //extended ext ints
01B5 E08A LDI R24,0xA
01B6 93800069 STS 0x69,R24
(0125) EIMSK = 0x03;
01B8 E083 LDI R24,3
01B9 BB8D OUT 0x1D,R24
(0126)
(0127) TIMSK0 = 0x01; //timer 0 interrupt sources
01BA E081 LDI R24,1
01BB 9380006E STS 0x6E,R24
(0128) TIMSK1 = 0x21; //timer 1 interrupt sources
01BD E281 LDI R24,0x21
01BE 9380006F STS 0x6F,R24
(0129) TIMSK2 = 0x01; //timer 2 interrupt sources
01C0 E081 LDI R24,1
01C1 93800070 STS 0x70,R24
(0130)
(0131) PCMSK0 = 0x02; //pin change mask 0 //允许外部电平中断
01C3 E082 LDI R24,2
01C4 9380006B STS 0x6B,R24
(0132) PCMSK1 = 0x02; //pin change mask 1
01C6 9380006C STS 0x6C,R24
(0133) PCMSK2 = 0x00; //pin change mask
01C8 9220006D STS 0x6D,R2
(0134) PCICR = 0x03; //pin change enable
01CA E083 LDI R24,3
01CB 93800068 STS 0x68,R24
(0135) PRR = 0x00; //power controller
01CD 92200064 STS 0x64,R2
(0136) SEI(); //re-enable interrupts
01CF 9478 BSET 7
01D0 9508 RET
(0137) //all peripherals are now initialized
(0138) }
(0139)
(0140) void main(void)
(0141) {
(0142) init_devices();
_main:
01D1 DFDD RCALL _init_devices
01D2 C009 RJMP 0x01DC
(0143)
(0144) while(1)
(0145) {
(0146) if(g_ucLoopTimeFlag)
01D3 90200103 LDS R2,g_ucLoopTimeFlag
01D5 2022 TST R2
01D6 F029 BEQ 0x01DC
(0147) {
(0148) g_ucLoopTimeFlag = false;
01D7 2422 CLR R2
01D8 92200103 STS g_ucLoopTimeFlag,R2
(0149) KeyScanTask(); //key scan
01DA DF31 RCALL _KeyScanTask
(0150) KeyPressedTask(); //key process
FILE: <library>
01DB DF61 RCALL _KeyPressedTask
01DC CFF6 RJMP 0x01D3
01DD 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -