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

📄 mcu2.lst

📁 单片机为meg88
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0029 EFCF      LDI	R28,0xFF
    002A E0D4      LDI	R29,4
    002B BFCD      OUT	0x3D,R28
    002C BFDE      OUT	0x3E,R29
    002D 51C0      SUBI	R28,0x10
    002E 40D0      SBCI	R29,0
    002F EA0A      LDI	R16,0xAA
    0030 8308      STD	Y+0,R16
    0031 2400      CLR	R0
    0032 E1EE      LDI	R30,0x1E
    0033 E0F1      LDI	R31,1
    0034 E011      LDI	R17,1
    0035 32E1      CPI	R30,0x21
    0036 07F1      CPC	R31,R17
    0037 F011      BEQ	0x003A
    0038 9201      ST	R0,Z+
    0039 CFFB      RJMP	0x0035
    003A 8300      STD	Z+0,R16
    003B E3E4      LDI	R30,0x34
    003C E0F0      LDI	R31,0
    003D E0A0      LDI	R26,0
    003E E0B1      LDI	R27,1
    003F E010      LDI	R17,0
    0040 35E2      CPI	R30,0x52
    0041 07F1      CPC	R31,R17
    0042 F021      BEQ	0x0047
    0043 95C8      LPM
    0044 9631      ADIW	R30,1
    0045 920D      ST	R0,X+
    0046 CFF9      RJMP	0x0040
    0047 D1AF      RCALL	_main
_exit:
    0048 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\fengzm.POWERMAXTECH\桌面\MCU2\iic.c
(0001) 
(0002) #include "IIC.h"
(0003) #include "common.h"
(0004) 
(0005) 
(0006) // TWI initialize
(0007) // bit rate:32,prescal:1,rate:100Khz;
(0008) //SCL frequency = CPU Clock frequence / (16 + 2(TWBR)(PrescalerValue))
(0009) void twi_init(void)
(0010) {
(0011) 	TWCR = 0x00;		//disable twi
_twi_init:
    0049 2422      CLR	R2
    004A 922000BC  STS	0xBC,R2
(0012) 	TWBR = 0x20;		//set bit rate equal 32
    004C E280      LDI	R24,0x20
    004D 938000B8  STS	0xB8,R24
(0013) 	TWSR = 0x00;		//set prescale  clock/1
    004F 922000B9  STS	0xB9,R2
(0014) 	TWAR = 0x00;		//set slave address
    0051 922000BA  STS	0xBA,R2
(0015) 	TWCR = 0x85;		//enable twi
    0053 E885      LDI	R24,0x85
    0054 938000BC  STS	0xBC,R24
    0056 9508      RET
_twi_isr:
  ucIIC_TWSR           --> R16
    0057 922A      ST	R2,-Y
    0058 923A      ST	R3,-Y
    0059 930A      ST	R16,-Y
    005A 938A      ST	R24,-Y
    005B 939A      ST	R25,-Y
    005C 93EA      ST	R30,-Y
    005D 93FA      ST	R31,-Y
    005E B62F      IN	R2,0x3F
    005F 922A      ST	R2,-Y
(0016) }
(0017) 
(0018) #pragma interrupt_handler twi_isr:25
(0019) void twi_isr(void)
(0020) {
(0021) 	uchar ucIIC_TWSR;
(0022) 
(0023) 	ucIIC_TWSR = TWSR & 0xF8;
    0060 910000B9  LDS	R16,0xB9
    0062 7F08      ANDI	R16,0xF8
(0024) 	if(ucIIC_TWSR == 0x08)
    0063 3008      CPI	R16,0x8
    0064 F441      BNE	0x006D
(0025) 	{
(0026) 		TWDR = g_ucIICAdress;
    0065 90200120  LDS	R2,g_ucIICAdress
    0067 922000BB  STS	0xBB,R2
(0027) 		ZHONGTU_START_IIC();
    0069 E885      LDI	R24,0x85
    006A 938000BC  STS	0xBC,R24
(0028) 	}
    006C C042      RJMP	0x00AF
(0029) 	else if((ucIIC_TWSR == 0x18) || (ucIIC_TWSR == 0x20))
    006D 3108      CPI	R16,0x18
    006E F011      BEQ	0x0071
    006F 3200      CPI	R16,0x20
    0070 F481      BNE	0x0081
(0030) 	{
(0031) 		TWDR = *g_ucIICDataBuf;
    0071 91E0011E  LDS	R30,g_ucIICDataBuf
    0073 91F0011F  LDS	R31,g_ucIICDataBuf+1
    0075 8020      LDD	R2,Z+0
    0076 922000BB  STS	0xBB,R2
(0032) 		g_ucIICDataNum--;
    0078 91800102  LDS	R24,g_ucIICDataNum
    007A 5081      SUBI	R24,1
    007B 93800102  STS	g_ucIICDataNum,R24
(0033) 		ZHONGTU_START_IIC();
    007D E885      LDI	R24,0x85
    007E 938000BC  STS	0xBC,R24
(0034) 	}
    0080 C02E      RJMP	0x00AF
(0035) 	else if((ucIIC_TWSR == 0x28) || (ucIIC_TWSR == 0x30))
    0081 3208      CPI	R16,0x28
    0082 F011      BEQ	0x0085
    0083 3300      CPI	R16,0x30
    0084 F509      BNE	0x00A6
(0036) 	{
(0037) 		if(g_ucIICDataNum > 0)
    0085 2422      CLR	R2
    0086 90300102  LDS	R3,g_ucIICDataNum
    0088 1423      CP	R2,R3
    0089 F4A8      BCC	0x009F
(0038) 		{
(0039)  			TWDR = *(++g_ucIICDataBuf);
    008A 9180011E  LDS	R24,g_ucIICDataBuf
    008C 9190011F  LDS	R25,g_ucIICDataBuf+1
    008E 9601      ADIW	R24,1
    008F 9390011F  STS	g_ucIICDataBuf+1,R25
    0091 9380011E  STS	g_ucIICDataBuf,R24
    0093 01FC      MOVW	R30,R24
    0094 8020      LDD	R2,Z+0
    0095 922000BB  STS	0xBB,R2
(0040)  			g_ucIICDataNum--;
    0097 2D83      MOV	R24,R3
    0098 5081      SUBI	R24,1
    0099 93800102  STS	g_ucIICDataNum,R24
(0041) 			ZHONGTU_START_IIC();
    009B E885      LDI	R24,0x85
    009C 938000BC  STS	0xBC,R24
(0042) 		}
    009E C010      RJMP	0x00AF
(0043) 		else
(0044) 		{
(0045) 			g_ucIICEnd = 1;
    009F E081      LDI	R24,1
    00A0 93800101  STS	g_ucIICEnd,R24
(0046) 			STOP_IIC();
    00A2 E985      LDI	R24,0x95
    00A3 938000BC  STS	0xBC,R24
(0047) 		}
(0048) 	}
    00A5 C009      RJMP	0x00AF
(0049) 	else
(0050) 	{
(0051) 		STOP_IIC();
    00A6 E985      LDI	R24,0x95
    00A7 938000BC  STS	0xBC,R24
(0052)         g_ucIICState = IIC_BUSY;
    00A9 E180      LDI	R24,0x10
    00AA 93800100  STS	g_ucIICState,R24
(0053) 		g_ucIICEnd = 1;
    00AC E081      LDI	R24,1
    00AD 93800101  STS	g_ucIICEnd,R24
(0054) 	}
    00AF 9029      LD	R2,Y+
    00B0 BE2F      OUT	0x3F,R2
    00B1 91F9      LD	R31,Y+
    00B2 91E9      LD	R30,Y+
    00B3 9199      LD	R25,Y+
    00B4 9189      LD	R24,Y+
    00B5 9109      LD	R16,Y+
    00B6 9039      LD	R3,Y+
    00B7 9029      LD	R2,Y+
    00B8 9518      RETI
(0055) }
(0056) 
(0057) //ucIICAdress为子地址;*s为要传送的数据组,ucIICDataNum为要传送数据的个数
(0058) uint IICSendStr(uchar ucIICAdress, uchar *s, uchar ucIICDataNum)
(0059) {
(0060) 	g_ucIICAdress = ucIICAdress;
_IICSendStr:
  ucIICDataNum         --> Y+0
  s                    --> R18
  ucIICAdress          --> R16
    00B9 93000120  STS	g_ucIICAdress,R16
(0061) 	g_ucIICDataBuf = s;
    00BB 9330011F  STS	g_ucIICDataBuf+1,R19
    00BD 9320011E  STS	g_ucIICDataBuf,R18
(0062) 	g_ucIICDataNum = ucIICDataNum;
    00BF 8008      LDD	R0,Y+0
    00C0 92000102  STS	g_ucIICDataNum,R0
(0063) 	g_ucIICEnd = 0;
    00C2 2422      CLR	R2
    00C3 92200101  STS	g_ucIICEnd,R2
(0064) 	START_IIC();
    00C5 EA85      LDI	R24,0xA5
    00C6 938000BC  STS	0xBC,R24
(0065) 	while(g_ucIICEnd == 0)
    00C8 90200101  LDS	R2,g_ucIICEnd
    00CA 2022      TST	R2
    00CB F3E1      BEQ	0x00C8
(0066) 	{}
(0067) 
(0068) 	if(g_ucIICEnd == 1)
    00CC 2D82      MOV	R24,R2
    00CD 3081      CPI	R24,1
    00CE F419      BNE	0x00D2
(0069) 		return(1);
    00CF E001      LDI	R16,1
    00D0 E010      LDI	R17,0
    00D1 C002      RJMP	0x00D4
(0070) 	else
(0071) 		return(0);
    00D2 2700      CLR	R16
    00D3 2711      CLR	R17
    00D4 9508      RET
FILE: C:\DOCUME~1\fengzm.POWERMAXTECH\桌面\MCU2\iic_test.c
(0001) //ICC-AVR application builder : 2006-10-16 下午 09:35:42
(0002) // Target : M88
(0003) // Crystal: 20.0000Mhz
(0004) 
(0005) #include "common.h"
(0006) 
(0007) 
(0008) void KeyScanTask1(void);
(0009) void KeyScanTask2(void);
(0010) void KeyPressedTask1(void);
(0011) void KeyPressedTask2(void);
(0012) 
(0013) void port_init(void)
(0014) {
(0015) 	PORTB = 0x01;	   //只用PB0口,并且是输入口
_port_init:
    00D5 E081      LDI	R24,1
    00D6 B985      OUT	0x05,R24
(0016) 	DDRB  = 0xFE;	   //0是输入
    00D7 EF8E      LDI	R24,0xFE
    00D8 B984      OUT	0x04,R24
(0017) 	PORTC = 0x08;	   //0000 1000//   PORTC |= 0x08; PORTC &= ~0x08;
    00D9 E088      LDI	R24,0x8
    00DA B988      OUT	0x08,R24
(0018) 	DDRC  = 0x08;	   //1是输出 0000 1000
    00DB B987      OUT	0x07,R24
(0019) 	PORTD = 0x00;
    00DC 2422      CLR	R2
    00DD B82B      OUT	0x0B,R2
(0020) 	DDRD  = 0x00;
    00DE B82A      OUT	0x0A,R2
    00DF 9508      RET
(0021) }
(0022) 
(0023) //TIMER0 initialize - prescale:64
(0024) // WGM: Normal
(0025) // desired value: 1mSec
(0026) // actual value:  1.000mSec (0.0%)
(0027) void timer0_init(void)
(0028) {
(0029) 	TCCR0B = 0x00; //stop
_timer0_init:
    00E0 2422      CLR	R2
    00E1 BC25      OUT	0x25,R2
(0030) 	TCNT0  = 0x83; //set count
    00E2 E883      LDI	R24,0x83
    00E3 BD86      OUT	0x26,R24
(0031) 	TCCR0A = 0x00;
    00E4 BC24      OUT	0x24,R2
(0032) 	TCCR0B = 0x03; //start timer
    00E5 E083      LDI	R24,3
    00E6 BD85      OUT	0x25,R24
    00E7 9508      RET
_timer0_ovf_isr:
    00E8 922A      ST	R2,-Y
    00E9 923A      ST	R3,-Y
    00EA 938A      ST	R24,-Y
    00EB 939A      ST	R25,-Y
    00EC B62F      IN	R2,0x3F
    00ED 922A      ST	R2,-Y
(0033) }
(0034) 
(0035) 
(0036) #pragma interrupt_handler timer0_ovf_isr:17		//TIMER0 has overflowed
(0037) void timer0_ovf_isr(void)
(0038) {
(0039) 	static uint s_unLoopTimeCnt = 0;
(0040) 
(0041) 	TCNT0  = 0x83; 								//set count
    00EE E883      LDI	R24,0x83
    00EF BD86      OUT	0x26,R24
(0042) 	s_unLoopTimeCnt++;
    00F0 91800115  LDS	R24,s_unLoopTimeCnt
    00F2 91900116  LDS	R25,s_unLoopTimeCnt+1
    00F4 9601      ADIW	R24,1
    00F5 93900116  STS	s_unLoopTimeCnt+1,R25
    00F7 93800115  STS	s_unLoopTimeCnt,R24
(0043) 	if(s_unLoopTimeCnt > 2)
    00F9 E082      LDI	R24,2
    00FA E090      LDI	R25,0
    00FB 90200115  LDS	R2,s_unLoopTimeCnt
    00FD 90300116  LDS	R3,s_unLoopTimeCnt+1
    00FF 1582      CP	R24,R2
    0100 0593      CPC	R25,R3
    0101 F448      BCC	0x010B
(0044) 	{
(0045) 		s_unLoopTimeCnt = 0;
    0102 2422      CLR	R2
    0103 2433      CLR	R3
    0104 92300116  STS	s_unLoopTimeCnt+1,R3
    0106 92200115  STS	s_unLoopTimeCnt,R2
(0046) 		g_ucLoopTimeFlag = true;
    0108 EF8F      LDI	R24,0xFF
    0109 93800103  STS	g_ucLoopTimeFlag,R24
(0047) 	}
    010B 9029      LD	R2,Y+
    010C BE2F      OUT	0x3F,R2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -