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