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

📄 mcu.lst

📁 单片机为meg88
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0027 EFCF      LDI	R28,0xFF
    0028 E0D4      LDI	R29,4
    0029 BFCD      OUT	0x3D,R28
    002A BFDE      OUT	0x3E,R29
    002B 51C0      SUBI	R28,0x10
    002C 40D0      SBCI	R29,0
    002D EA0A      LDI	R16,0xAA
    002E 8308      STD	Y+0,R16
    002F 2400      CLR	R0
    0030 E1E9      LDI	R30,0x19
    0031 E0F1      LDI	R31,1
    0032 E011      LDI	R17,1
    0033 31EC      CPI	R30,0x1C
    0034 07F1      CPC	R31,R17
    0035 F011      BEQ	0x0038
    0036 9201      ST	R0,Z+
    0037 CFFB      RJMP	0x0033
    0038 8300      STD	Z+0,R16
    0039 E3E4      LDI	R30,0x34
    003A E0F0      LDI	R31,0
    003B E0A0      LDI	R26,0
    003C E0B1      LDI	R27,1
    003D E010      LDI	R17,0
    003E 34ED      CPI	R30,0x4D
    003F 07F1      CPC	R31,R17
    0040 F021      BEQ	0x0045
    0041 95C8      LPM
    0042 9631      ADIW	R30,1
    0043 920D      ST	R0,X+
    0044 CFF9      RJMP	0x003E
    0045 D18B      RCALL	_main
_exit:
    0046 CFFF      RJMP	_exit
FILE: D:\application\ADP1653\MCU\iic.c
(0001) /***********************************************************************
(0002) * 文件名:		IIC.c
(0003) * 版本号:
(0004) * 创作日期:	2006.10.16
(0005) * 作者:		fengzm
(0006) * 功能说明:	IIC数据传输
(0007) * 其它说明:	使用AVR单片机Atmega88, 晶振:20Mhz
(0008) 注意:发送START信号之后软件不要清零TWCR的"TWSTA"位。
(0009) ***********************************************************************/
(0010) #include "IIC.h"
(0011) #include "common.h"
(0012) 
(0013) 
(0014) // TWI initialize
(0015) // bit rate:32,prescal:1,rate:100Khz;
(0016) //SCL frequency = CPU Clock frequence / (16 + 2(TWBR)(PrescalerValue))
(0017) void twi_init(void)
(0018) {
(0019) 	TWCR = 0x00;		//disable twi
_twi_init:
    0047 2422      CLR	R2
    0048 922000BC  STS	0xBC,R2
(0020) 	TWBR = 0x20;		//set bit rate equal 32
    004A E280      LDI	R24,0x20
    004B 938000B8  STS	0xB8,R24
(0021) 	TWSR = 0x00;		//set prescale  clock/1
    004D 922000B9  STS	0xB9,R2
(0022) 	TWAR = 0x00;		//set slave address
    004F 922000BA  STS	0xBA,R2
(0023) 	TWCR = 0x85;		//enable twi
    0051 E885      LDI	R24,0x85
    0052 938000BC  STS	0xBC,R24
    0054 9508      RET
_twi_isr:
  ucIIC_TWSR           --> R16
    0055 922A      ST	R2,-Y
    0056 923A      ST	R3,-Y
    0057 930A      ST	R16,-Y
    0058 938A      ST	R24,-Y
    0059 939A      ST	R25,-Y
    005A 93EA      ST	R30,-Y
    005B 93FA      ST	R31,-Y
    005C B62F      IN	R2,0x3F
    005D 922A      ST	R2,-Y
(0024) }
(0025) 
(0026) #pragma interrupt_handler twi_isr:25
(0027) void twi_isr(void)
(0028) {
(0029) 	uchar ucIIC_TWSR;
(0030) 
(0031) 	ucIIC_TWSR = TWSR & 0xF8;
    005E 910000B9  LDS	R16,0xB9
    0060 7F08      ANDI	R16,0xF8
(0032) 	if(ucIIC_TWSR == 0x08)
    0061 3008      CPI	R16,0x8
    0062 F441      BNE	0x006B
(0033) 	{
(0034) 		TWDR = g_ucIICAdress;
    0063 9020011B  LDS	R2,g_ucIICAdress
    0065 922000BB  STS	0xBB,R2
(0035) 		ZHONGTU_START_IIC();
    0067 E885      LDI	R24,0x85
    0068 938000BC  STS	0xBC,R24
(0036) 	}
    006A C03F      RJMP	0x00AA
(0037) 	else if((ucIIC_TWSR == 0x18) || (ucIIC_TWSR == 0x20))
    006B 3108      CPI	R16,0x18
    006C F011      BEQ	0x006F
    006D 3200      CPI	R16,0x20
    006E F481      BNE	0x007F
(0038) 	{
(0039) 		TWDR = *g_ucIICDataBuf;
    006F 91E00119  LDS	R30,g_ucIICDataBuf
    0071 91F0011A  LDS	R31,g_ucIICDataBuf+1
    0073 8020      LDD	R2,Z+0
    0074 922000BB  STS	0xBB,R2
(0040) 		g_ucIICDataNum--;
    0076 91800102  LDS	R24,g_ucIICDataNum
    0078 5081      SUBI	R24,1
    0079 93800102  STS	g_ucIICDataNum,R24
(0041) 		ZHONGTU_START_IIC();
    007B E885      LDI	R24,0x85
    007C 938000BC  STS	0xBC,R24
(0042) 	}
    007E C02B      RJMP	0x00AA
(0043) 	else if((ucIIC_TWSR == 0x28) || (ucIIC_TWSR == 0x30))
    007F 3208      CPI	R16,0x28
    0080 F011      BEQ	0x0083
    0081 3300      CPI	R16,0x30
    0082 F509      BNE	0x00A4
(0044) 	{
(0045) 		if(g_ucIICDataNum > 0)
    0083 2422      CLR	R2
    0084 90300102  LDS	R3,g_ucIICDataNum
    0086 1423      CP	R2,R3
    0087 F4A8      BCC	0x009D
(0046) 		{
(0047)  			TWDR = *(++g_ucIICDataBuf);
    0088 91800119  LDS	R24,g_ucIICDataBuf
    008A 9190011A  LDS	R25,g_ucIICDataBuf+1
    008C 9601      ADIW	R24,1
    008D 9390011A  STS	g_ucIICDataBuf+1,R25
    008F 93800119  STS	g_ucIICDataBuf,R24
    0091 01FC      MOVW	R30,R24
    0092 8020      LDD	R2,Z+0
    0093 922000BB  STS	0xBB,R2
(0048)  			g_ucIICDataNum--;
    0095 2D83      MOV	R24,R3
    0096 5081      SUBI	R24,1
    0097 93800102  STS	g_ucIICDataNum,R24
(0049) 			ZHONGTU_START_IIC();
    0099 E885      LDI	R24,0x85
    009A 938000BC  STS	0xBC,R24
(0050) 		}
    009C C00D      RJMP	0x00AA
(0051) 		else
(0052) 		{
(0053) 			g_ucIICEnd = 1;
    009D E081      LDI	R24,1
    009E 93800101  STS	g_ucIICEnd,R24
(0054) 			STOP_IIC();
    00A0 E985      LDI	R24,0x95
    00A1 938000BC  STS	0xBC,R24
(0055) 		}
(0056) 	}
    00A3 C006      RJMP	0x00AA
(0057) 	else
(0058) 	{
(0059) 		STOP_IIC();
    00A4 E985      LDI	R24,0x95
    00A5 938000BC  STS	0xBC,R24
(0060)         g_ucIICState = IIC_BUSY;
    00A7 E180      LDI	R24,0x10
    00A8 93800100  STS	g_ucIICState,R24
(0061) 	}
    00AA 9029      LD	R2,Y+
    00AB BE2F      OUT	0x3F,R2
    00AC 91F9      LD	R31,Y+
    00AD 91E9      LD	R30,Y+
    00AE 9199      LD	R25,Y+
    00AF 9189      LD	R24,Y+
    00B0 9109      LD	R16,Y+
    00B1 9039      LD	R3,Y+
    00B2 9029      LD	R2,Y+
    00B3 9518      RETI
(0062) }
(0063) 
(0064) //ucIICAdress为子地址;*s为要传送的数据组,ucIICDataNum为要传送数据的个数
(0065) uint IICSendStr(uchar ucIICAdress, uchar *s, uchar ucIICDataNum)
(0066) {
(0067) 	g_ucIICAdress = ucIICAdress;
_IICSendStr:
  ucIICDataNum         --> Y+0
  s                    --> R18
  ucIICAdress          --> R16
    00B4 9300011B  STS	g_ucIICAdress,R16
(0068) 	g_ucIICDataBuf = s;
    00B6 9330011A  STS	g_ucIICDataBuf+1,R19
    00B8 93200119  STS	g_ucIICDataBuf,R18
(0069) 	g_ucIICDataNum = ucIICDataNum;
    00BA 8008      LDD	R0,Y+0
    00BB 92000102  STS	g_ucIICDataNum,R0
(0070) 	g_ucIICEnd = 0;
    00BD 2422      CLR	R2
    00BE 92200101  STS	g_ucIICEnd,R2
(0071) 	START_IIC();
    00C0 EA85      LDI	R24,0xA5
    00C1 938000BC  STS	0xBC,R24
(0072) 	while(g_ucIICEnd == 0)
    00C3 90200101  LDS	R2,g_ucIICEnd
    00C5 2022      TST	R2
    00C6 F3E1      BEQ	0x00C3
(0073) 	{}
(0074) 
(0075) 	if(g_ucIICEnd == 1)
    00C7 2D82      MOV	R24,R2
    00C8 3081      CPI	R24,1
    00C9 F419      BNE	0x00CD
(0076) 		return(1);
    00CA E001      LDI	R16,1
    00CB E010      LDI	R17,0
    00CC C002      RJMP	0x00CF
(0077) 	else
(0078) 		return(0);
    00CD 2700      CLR	R16
    00CE 2711      CLR	R17
    00CF 9508      RET
FILE: D:\application\ADP1653\MCU\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) void port_init(void)   //此段改了fengzm的
(0008) {
(0009) 	PORTB = 0x01;	   //只用PB0口,并且是输入口
_port_init:
    00D0 E081      LDI	R24,1
    00D1 B985      OUT	0x05,R24
(0010) 	DDRB  = 0xFE;
    00D2 EF8E      LDI	R24,0xFE
    00D3 B984      OUT	0x04,R24
(0011) 	PORTC = 0x00;
    00D4 2422      CLR	R2
    00D5 B828      OUT	0x08,R2
(0012) 	DDRC  = 0x00;
    00D6 B827      OUT	0x07,R2
(0013) 	PORTD = 0x00;
    00D7 B82B      OUT	0x0B,R2
(0014) 	DDRD  = 0x00;
    00D8 B82A      OUT	0x0A,R2
    00D9 9508      RET
(0015) }
(0016) 
(0017) //TIMER0 initialize - prescale:64
(0018) // WGM: Normal
(0019) // desired value: 1mSec
(0020) // actual value:  1.000mSec (0.0%)
(0021) void timer0_init(void)
(0022) {
(0023) 	TCCR0B = 0x00; //stop
_timer0_init:
    00DA 2422      CLR	R2
    00DB BC25      OUT	0x25,R2
(0024) 	TCNT0  = 0x83; //set count
    00DC E883      LDI	R24,0x83
    00DD BD86      OUT	0x26,R24
(0025) 	TCCR0A = 0x00;
    00DE BC24      OUT	0x24,R2
(0026) 	TCCR0B = 0x03; //start timer
    00DF E083      LDI	R24,3
    00E0 BD85      OUT	0x25,R24
    00E1 9508      RET
_timer0_ovf_isr:
    00E2 922A      ST	R2,-Y
    00E3 923A      ST	R3,-Y
    00E4 938A      ST	R24,-Y
    00E5 939A      ST	R25,-Y
    00E6 B62F      IN	R2,0x3F
    00E7 922A      ST	R2,-Y
(0027) }
(0028) 
(0029) 
(0030) #pragma interrupt_handler timer0_ovf_isr:17		//TIMER0 has overflowed
(0031) void timer0_ovf_isr(void)
(0032) {
(0033) 	static uint s_unLoopTimeCnt = 0;
(0034) 
(0035) 	TCNT0  = 0x83; 								//set count
    00E8 E883      LDI	R24,0x83
    00E9 BD86      OUT	0x26,R24
(0036) 	s_unLoopTimeCnt++;
    00EA 91800112  LDS	R24,s_unLoopTimeCnt
    00EC 91900113  LDS	R25,s_unLoopTimeCnt+1
    00EE 9601      ADIW	R24,1
    00EF 93900113  STS	s_unLoopTimeCnt+1,R25
    00F1 93800112  STS	s_unLoopTimeCnt,R24
(0037) 	if(s_unLoopTimeCnt > 2)
    00F3 E082      LDI	R24,2
    00F4 E090      LDI	R25,0
    00F5 90200112  LDS	R2,s_unLoopTimeCnt
    00F7 90300113  LDS	R3,s_unLoopTimeCnt+1
    00F9 1582      CP	R24,R2
    00FA 0593      CPC	R25,R3

⌨️ 快捷键说明

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