📄 mcu2.lst
字号:
010D 9199 LD R25,Y+
010E 9189 LD R24,Y+
010F 9039 LD R3,Y+
0110 9029 LD R2,Y+
0111 9518 RETI
(0048)
(0049) }
(0050)
(0051) void KeyScanTask(void)
(0052) {
(0053) static uchar s_ucKeyDitheringCnt = 0; //avoid dithering
(0054) static uchar s_ucKeyPressCnt = 0; //count the sequence of the pressed key
(0055) static uint s_undisabletime = 0;
(0056)
(0057) if(PINB & 0x01) //if the input voltage is high
_KeyScanTask:
0112 9B18 SBIS 0x03,0
0113 C01A RJMP 0x012E
(0058) {
(0059) s_ucKeyDitheringCnt++;
0114 91800117 LDS R24,s_ucKeyDitheringCnt
0116 5F8F SUBI R24,0xFF
0117 93800117 STS s_ucKeyDitheringCnt,R24
(0060) if(s_ucKeyDitheringCnt > 5) //delay time 5x2=10ms;avoid dithering
0119 E085 LDI R24,5
011A 90200117 LDS R2,s_ucKeyDitheringCnt
011C 1582 CP R24,R2
011D F440 BCC 0x0126
(0061) {
(0062) s_ucKeyDitheringCnt = 0;
011E 2422 CLR R2
011F 92200117 STS s_ucKeyDitheringCnt,R2
(0063) if(PINB & 0x01)
0121 9B18 SBIS 0x03,0
0122 C003 RJMP 0x0126
(0064) g_ucKeyPressed = true;
0123 EF8F LDI R24,0xFF
0124 93800104 STS g_ucKeyPressed,R24
(0065) }
(0066) s_undisabletime = 0;
0126 2422 CLR R2
0127 2433 CLR R3
0128 9230011A STS s_undisabletime+1,R3
012A 92200119 STS s_undisabletime,R2
(0067) PORTC |= 0x08;
012C 9A43 SBI 0x08,3
(0068) }
012D C033 RJMP 0x0161
(0069) else
(0070) {
(0071) s_ucKeyDitheringCnt = 0;
012E 2422 CLR R2
012F 92200117 STS s_ucKeyDitheringCnt,R2
(0072) s_undisabletime++;
0131 91800119 LDS R24,s_undisabletime
0133 9190011A LDS R25,s_undisabletime+1
0135 9601 ADIW R24,1
0136 9390011A STS s_undisabletime+1,R25
0138 93800119 STS s_undisabletime,R24
(0073) if(s_undisabletime > 30000)
013A E380 LDI R24,0x30
013B E795 LDI R25,0x75
013C 90200119 LDS R2,s_undisabletime
013E 9030011A LDS R3,s_undisabletime+1
0140 1582 CP R24,R2
0141 0593 CPC R25,R3
0142 F438 BCC 0x014A
(0074) {
(0075) s_undisabletime = 0;
0143 2422 CLR R2
0144 2433 CLR R3
0145 9230011A STS s_undisabletime+1,R3
0147 92200119 STS s_undisabletime,R2
(0076) PORTC &= ~0x08;
0149 9843 CBI 0x08,3
(0077) }
(0078)
(0079) if(g_ucKeyPressed)
014A 90200104 LDS R2,g_ucKeyPressed
014C 2022 TST R2
014D F099 BEQ 0x0161
(0080) {
(0081) s_ucKeyPressCnt++;
014E 91800118 LDS R24,s_ucKeyPressCnt
0150 5F8F SUBI R24,0xFF
0151 93800118 STS s_ucKeyPressCnt,R24
(0082) if(s_ucKeyPressCnt > 3)
0153 E083 LDI R24,3
0154 90200118 LDS R2,s_ucKeyPressCnt
0156 1582 CP R24,R2
0157 F430 BCC 0x015E
(0083) {
(0084) s_ucKeyPressCnt = 1;
0158 E081 LDI R24,1
0159 93800118 STS s_ucKeyPressCnt,R24
(0085) g_ucFlashEnd = false;
015B 2422 CLR R2
015C 92200106 STS g_ucFlashEnd,R2
(0086) }
(0087) g_ucKeyPressed = false;
015E 2422 CLR R2
015F 92200104 STS g_ucKeyPressed,R2
(0088) }
(0089) }
(0090) g_ucKeyPressedCnt = s_ucKeyPressCnt;
0161 90200118 LDS R2,s_ucKeyPressCnt
0163 92200105 STS g_ucKeyPressedCnt,R2
0165 9508 RET
_KeyPressedTask:
0166 9721 SBIW R28,1
(0091) }
(0092)
(0093) void KeyPressedTask(void)
(0094) {
(0095) static uint s_unLedFlashTimeDly = 0;
(0096) static uchar s_ucLedFlashCnt = 4;
(0097) if(g_ucKeyPressedCnt == 1) //press the first
0167 91800105 LDS R24,g_ucKeyPressedCnt
0169 3081 CPI R24,1
016A F439 BNE 0x0172
(0098) IICSendStr(0x60,g_ucTorchIICData,2);
016B E082 LDI R24,2
016C 8388 STD Y+0,R24
016D E027 LDI R18,7
016E E031 LDI R19,1
016F E600 LDI R16,0x60
0170 DF48 RCALL _IICSendStr
0171 C061 RJMP 0x01D3
(0099) else if(g_ucKeyPressedCnt == 2)
0172 91800105 LDS R24,g_ucKeyPressedCnt
0174 3082 CPI R24,2
0175 F439 BNE 0x017D
(0100) IICSendStr(0x60,g_ucLightOFFData,2);
0176 E082 LDI R24,2
0177 8388 STD Y+0,R24
0178 E02D LDI R18,0xD
0179 E031 LDI R19,1
017A E600 LDI R16,0x60
017B DF3D RCALL _IICSendStr
017C C056 RJMP 0x01D3
(0101) else if((g_ucKeyPressedCnt == 3) && (!g_ucFlashEnd)) //press the second
017D 91800105 LDS R24,g_ucKeyPressedCnt
017F 3083 CPI R24,3
0180 F009 BEQ 0x0182
0181 C051 RJMP 0x01D3
0182 90200106 LDS R2,g_ucFlashEnd
0184 2022 TST R2
0185 F009 BEQ 0x0187
0186 C04C RJMP 0x01D3
(0102) {
(0103) if(s_ucLedFlashCnt > 0)
0187 2422 CLR R2
0188 9030011D LDS R3,s_ucLedFlashCnt
018A 1423 CP R2,R3
018B F578 BCC 0x01BB
(0104) {
(0105) s_unLedFlashTimeDly++;
018C 9180011B LDS R24,s_unLedFlashTimeDly
018E 9190011C LDS R25,s_unLedFlashTimeDly+1
0190 9601 ADIW R24,1
0191 9390011C STS s_unLedFlashTimeDly+1,R25
0193 9380011B STS s_unLedFlashTimeDly,R24
(0106) if(s_unLedFlashTimeDly < 50)
0195 3382 CPI R24,0x32
0196 E0E0 LDI R30,0
0197 079E CPC R25,R30
0198 F438 BCC 0x01A0
(0107) IICSendStr(0x60,g_ucIledIICData,2); //led is on
0199 E082 LDI R24,2
019A 8388 STD Y+0,R24
019B E029 LDI R18,0x9
019C E031 LDI R19,1
019D E600 LDI R16,0x60
019E DF1A RCALL _IICSendStr
019F C033 RJMP 0x01D3
(0108) else if(s_unLedFlashTimeDly < 100)
01A0 9180011B LDS R24,s_unLedFlashTimeDly
01A2 9190011C LDS R25,s_unLedFlashTimeDly+1
01A4 3684 CPI R24,0x64
01A5 E0E0 LDI R30,0
01A6 079E CPC R25,R30
01A7 F438 BCC 0x01AF
(0109) IICSendStr(0x60,g_ucLightOFFData,2); //led is off
01A8 E082 LDI R24,2
01A9 8388 STD Y+0,R24
01AA E02D LDI R18,0xD
01AB E031 LDI R19,1
01AC E600 LDI R16,0x60
01AD DF0B RCALL _IICSendStr
01AE C024 RJMP 0x01D3
(0110) else
(0111) {
(0112) s_unLedFlashTimeDly = 0;
01AF 2422 CLR R2
01B0 2433 CLR R3
01B1 9230011C STS s_unLedFlashTimeDly+1,R3
01B3 9220011B STS s_unLedFlashTimeDly,R2
(0113) s_ucLedFlashCnt--;
01B5 9180011D LDS R24,s_ucLedFlashCnt
01B7 5081 SUBI R24,1
01B8 9380011D STS s_ucLedFlashCnt,R24
(0114) }
(0115) }
01BA C018 RJMP 0x01D3
(0116) else
(0117) {
(0118) s_ucLedFlashCnt = 4;
01BB E084 LDI R24,4
01BC 9380011D STS s_ucLedFlashCnt,R24
(0119) g_ucFlashEnd = true;
01BE EF8F LDI R24,0xFF
01BF 93800106 STS g_ucFlashEnd,R24
(0120) IICSendStr(0x60,g_ucFlashEnIICData,2); //enalble flash
01C1 E082 LDI R24,2
01C2 8388 STD Y+0,R24
01C3 E02F LDI R18,0xF
01C4 E031 LDI R19,1
01C5 E600 LDI R16,0x60
01C6 DEF2 RCALL _IICSendStr
(0121) IICSendStr(0x60,g_ucFlashTimerIICData,2);
01C7 E082 LDI R24,2
01C8 8388 STD Y+0,R24
01C9 E121 LDI R18,0x11
01CA E031 LDI R19,1
01CB E600 LDI R16,0x60
01CC DEEC RCALL _IICSendStr
(0122) IICSendStr(0x60,g_ucFlashIICData,2); //flash is on
01CD E082 LDI R24,2
01CE 8388 STD Y+0,R24
01CF E02B LDI R18,0xB
01D0 E031 LDI R19,1
01D1 E600 LDI R16,0x60
01D2 DEE6 RCALL _IICSendStr
(0123) }
(0124) }
01D3 9621 ADIW R28,1
01D4 9508 RET
(0125) }
(0126)
(0127) //call this routine to initialize all peripherals
(0128) void init_devices(void)
(0129) {
(0130) //stop errant interrupts until set up
(0131) CLI(); //disable all interrupts
_init_devices:
01D5 94F8 BCLR 7
(0132) port_init();
01D6 DEFE RCALL _port_init
(0133) twi_init();
01D7 DE71 RCALL _twi_init
(0134) timer0_init();
01D8 DF07 RCALL _timer0_init
(0135)
(0136) MCUCR = 0x00;
01D9 2422 CLR R2
01DA BE25 OUT 0x35,R2
(0137) EICRA = 0x0A; //extended ext ints
01DB E08A LDI R24,0xA
01DC 93800069 STS 0x69,R24
(0138) EIMSK = 0x03;
01DE E083 LDI R24,3
01DF BB8D OUT 0x1D,R24
(0139)
(0140) TIMSK0 = 0x01; //timer 0 interrupt sources
01E0 E081 LDI R24,1
01E1 9380006E STS 0x6E,R24
(0141) TIMSK1 = 0x21; //timer 1 interrupt sources
01E3 E281 LDI R24,0x21
01E4 9380006F STS 0x6F,R24
(0142) TIMSK2 = 0x01; //timer 2 interrupt sources
01E6 E081 LDI R24,1
01E7 93800070 STS 0x70,R24
(0143)
(0144) PCMSK0 = 0x02; //pin change mask 0 //允许外部电平中断
01E9 E082 LDI R24,2
01EA 9380006B STS 0x6B,R24
(0145) PCMSK1 = 0x02; //pin change mask 1
01EC 9380006C STS 0x6C,R24
(0146) PCMSK2 = 0x00; //pin change mask
01EE 9220006D STS 0x6D,R2
(0147) PCICR = 0x03; //pin change enable
01F0 E083 LDI R24,3
01F1 93800068 STS 0x68,R24
(0148) PRR = 0x00; //power controller
01F3 92200064 STS 0x64,R2
(0149) SEI(); //re-enable interrupts
01F5 9478 BSET 7
01F6 9508 RET
(0150) //all peripherals are now initialized
(0151) }
(0152)
(0153) void main(void)
(0154) {
(0155) init_devices();
_main:
01F7 DFDD RCALL _init_devices
01F8 C009 RJMP 0x0202
(0156)
(0157) while(1)
(0158) {
(0159) if(g_ucLoopTimeFlag)
01F9 90200103 LDS R2,g_ucLoopTimeFlag
01FB 2022 TST R2
01FC F029 BEQ 0x0202
(0160) {
(0161) g_ucLoopTimeFlag = false;
01FD 2422 CLR R2
01FE 92200103 STS g_ucLoopTimeFlag,R2
(0162) // disablechip();
(0163) KeyScanTask(); //key scan
0200 DF11 RCALL _KeyScanTask
(0164) KeyPressedTask(); //key process
FILE: <library>
0201 DF64 RCALL _KeyPressedTask
0202 CFF6 RJMP 0x01F9
0203 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -