📄 mcu2.lst
字号:
__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 + -