⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcu2.lst

📁 单片机为meg88
💻 LST
📖 第 1 页 / 共 2 页
字号:
    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 + -