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

📄 mcu.lst

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