📄 iic.lis
字号:
.module iic.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\fengzm.POWERMAXTECH\桌面\MCU2\iic.c
0000 .dbfunc e twi_init _twi_init fV
.even
0000 _twi_init::
0000 .dbline -1
0000 .dbline 10
0000 ;
0000 ; #include "IIC.h"
0000 ; #include "common.h"
0000 ;
0000 ;
0000 ; // TWI initialize
0000 ; // bit rate:32,prescal:1,rate:100Khz;
0000 ; //SCL frequency = CPU Clock frequence / (16 + 2(TWBR)(PrescalerValue))
0000 ; void twi_init(void)
0000 ; {
0000 .dbline 11
0000 ; TWCR = 0x00; //disable twi
0000 2224 clr R2
0002 2092BC00 sts 188,R2
0006 .dbline 12
0006 ; TWBR = 0x20; //set bit rate equal 32
0006 80E2 ldi R24,32
0008 8093B800 sts 184,R24
000C .dbline 13
000C ; TWSR = 0x00; //set prescale clock/1
000C 2092B900 sts 185,R2
0010 .dbline 14
0010 ; TWAR = 0x00; //set slave address
0010 2092BA00 sts 186,R2
0014 .dbline 15
0014 ; TWCR = 0x85; //enable twi
0014 85E8 ldi R24,133
0016 8093BC00 sts 188,R24
001A .dbline -2
001A L1:
001A .dbline 0 ; func end
001A 0895 ret
001C .dbend
.area vector(rom, abs)
.org 48
0030 0EC0 rjmp _twi_isr
.area text(rom, con, rel)
001C .dbfile C:\DOCUME~1\fengzm.POWERMAXTECH\桌面\MCU2\iic.c
001C .dbfunc e twi_isr _twi_isr fV
001C ; ucIIC_TWSR -> R16
.even
001C _twi_isr::
001C 2A92 st -y,R2
001E 3A92 st -y,R3
0020 0A93 st -y,R16
0022 8A93 st -y,R24
0024 9A93 st -y,R25
0026 EA93 st -y,R30
0028 FA93 st -y,R31
002A 2FB6 in R2,0x3f
002C 2A92 st -y,R2
002E .dbline -1
002E .dbline 20
002E ; }
002E ;
002E ; #pragma interrupt_handler twi_isr:25
002E ; void twi_isr(void)
002E ; {
002E .dbline 23
002E ; uchar ucIIC_TWSR;
002E ;
002E ; ucIIC_TWSR = TWSR & 0xF8;
002E 0091B900 lds R16,185
0032 087F andi R16,248
0034 .dbline 24
0034 ; if(ucIIC_TWSR == 0x08)
0034 0830 cpi R16,8
0036 41F4 brne L3
0038 .dbline 25
0038 ; {
0038 .dbline 26
0038 ; TWDR = g_ucIICAdress;
0038 20900000 lds R2,_g_ucIICAdress
003C 2092BB00 sts 187,R2
0040 .dbline 27
0040 ; ZHONGTU_START_IIC();
0040 85E8 ldi R24,133
0042 8093BC00 sts 188,R24
0046 .dbline 28
0046 ; }
0046 42C0 rjmp L4
0048 L3:
0048 .dbline 29
0048 ; else if((ucIIC_TWSR == 0x18) || (ucIIC_TWSR == 0x20))
0048 0831 cpi R16,24
004A 11F0 breq L7
004C 0032 cpi R16,32
004E 81F4 brne L5
0050 L7:
0050 .dbline 30
0050 ; {
0050 .dbline 31
0050 ; TWDR = *g_ucIICDataBuf;
0050 E0910000 lds R30,_g_ucIICDataBuf
0054 F0910100 lds R31,_g_ucIICDataBuf+1
0058 2080 ldd R2,z+0
005A 2092BB00 sts 187,R2
005E .dbline 32
005E ; g_ucIICDataNum--;
005E 80910000 lds R24,_g_ucIICDataNum
0062 8150 subi R24,1
0064 80930000 sts _g_ucIICDataNum,R24
0068 .dbline 33
0068 ; ZHONGTU_START_IIC();
0068 85E8 ldi R24,133
006A 8093BC00 sts 188,R24
006E .dbline 34
006E ; }
006E 2EC0 rjmp L6
0070 L5:
0070 .dbline 35
0070 ; else if((ucIIC_TWSR == 0x28) || (ucIIC_TWSR == 0x30))
0070 0832 cpi R16,40
0072 11F0 breq L10
0074 0033 cpi R16,48
0076 09F5 brne L8
0078 L10:
0078 .dbline 36
0078 ; {
0078 .dbline 37
0078 ; if(g_ucIICDataNum > 0)
0078 2224 clr R2
007A 30900000 lds R3,_g_ucIICDataNum
007E 2314 cp R2,R3
0080 A8F4 brsh L11
0082 .dbline 38
0082 ; {
0082 .dbline 39
0082 ; TWDR = *(++g_ucIICDataBuf);
0082 80910000 lds R24,_g_ucIICDataBuf
0086 90910100 lds R25,_g_ucIICDataBuf+1
008A 0196 adiw R24,1
008C 90930100 sts _g_ucIICDataBuf+1,R25
0090 80930000 sts _g_ucIICDataBuf,R24
0094 FC01 movw R30,R24
0096 2080 ldd R2,z+0
0098 2092BB00 sts 187,R2
009C .dbline 40
009C ; g_ucIICDataNum--;
009C 832D mov R24,R3
009E 8150 subi R24,1
00A0 80930000 sts _g_ucIICDataNum,R24
00A4 .dbline 41
00A4 ; ZHONGTU_START_IIC();
00A4 85E8 ldi R24,133
00A6 8093BC00 sts 188,R24
00AA .dbline 42
00AA ; }
00AA 10C0 rjmp L9
00AC L11:
00AC .dbline 44
00AC ; else
00AC ; {
00AC .dbline 45
00AC ; g_ucIICEnd = 1;
00AC 81E0 ldi R24,1
00AE 80930000 sts _g_ucIICEnd,R24
00B2 .dbline 46
00B2 ; STOP_IIC();
00B2 85E9 ldi R24,149
00B4 8093BC00 sts 188,R24
00B8 .dbline 47
00B8 ; }
00B8 .dbline 48
00B8 ; }
00B8 09C0 rjmp L9
00BA L8:
00BA .dbline 50
00BA ; else
00BA ; {
00BA .dbline 51
00BA ; STOP_IIC();
00BA 85E9 ldi R24,149
00BC 8093BC00 sts 188,R24
00C0 .dbline 52
00C0 ; g_ucIICState = IIC_BUSY;
00C0 80E1 ldi R24,16
00C2 80930000 sts _g_ucIICState,R24
00C6 .dbline 53
00C6 ; g_ucIICEnd = 1;
00C6 81E0 ldi R24,1
00C8 80930000 sts _g_ucIICEnd,R24
00CC .dbline 54
00CC ; }
00CC L9:
00CC L6:
00CC L4:
00CC .dbline -2
00CC L2:
00CC 2990 ld R2,y+
00CE 2FBE out 0x3f,R2
00D0 F991 ld R31,y+
00D2 E991 ld R30,y+
00D4 9991 ld R25,y+
00D6 8991 ld R24,y+
00D8 0991 ld R16,y+
00DA 3990 ld R3,y+
00DC 2990 ld R2,y+
00DE .dbline 0 ; func end
00DE 1895 reti
00E0 .dbsym r ucIIC_TWSR 16 c
00E0 .dbend
00E0 .dbfunc e IICSendStr _IICSendStr fi
00E0 ; ucIICDataNum -> y+0
00E0 ; s -> R18,R19
00E0 ; ucIICAdress -> R16
.even
00E0 _IICSendStr::
00E0 .dbline -1
00E0 .dbline 59
00E0 ; }
00E0 ;
00E0 ; //ucIICAdress为子地址;*s为要传送的数据组,ucIICDataNum为要传送数据的个数
00E0 ; uint IICSendStr(uchar ucIICAdress, uchar *s, uchar ucIICDataNum)
00E0 ; {
00E0 .dbline 60
00E0 ; g_ucIICAdress = ucIICAdress;
00E0 00930000 sts _g_ucIICAdress,R16
00E4 .dbline 61
00E4 ; g_ucIICDataBuf = s;
00E4 30930100 sts _g_ucIICDataBuf+1,R19
00E8 20930000 sts _g_ucIICDataBuf,R18
00EC .dbline 62
00EC ; g_ucIICDataNum = ucIICDataNum;
00EC 0880 ldd R0,y+0
00EE 00920000 sts _g_ucIICDataNum,R0
00F2 .dbline 63
00F2 ; g_ucIICEnd = 0;
00F2 2224 clr R2
00F4 20920000 sts _g_ucIICEnd,R2
00F8 .dbline 64
00F8 ; START_IIC();
00F8 85EA ldi R24,165
00FA 8093BC00 sts 188,R24
00FE L14:
00FE .dbline 66
00FE .dbline 66
00FE L15:
00FE .dbline 65
00FE ; while(g_ucIICEnd == 0)
00FE 20900000 lds R2,_g_ucIICEnd
0102 2220 tst R2
0104 E1F3 breq L14
0106 .dbline 68
0106 ; {}
0106 ;
0106 ; if(g_ucIICEnd == 1)
0106 822D mov R24,R2
0108 8130 cpi R24,1
010A 19F4 brne L17
010C .dbline 69
010C ; return(1);
010C 01E0 ldi R16,1
010E 10E0 ldi R17,0
0110 02C0 rjmp L13
0112 L17:
0112 .dbline 71
0112 ; else
0112 ; return(0);
0112 0027 clr R16
0114 1127 clr R17
0116 .dbline -2
0116 L13:
0116 .dbline 0 ; func end
0116 0895 ret
0118 .dbsym l ucIICDataNum 0 c
0118 .dbsym r s 18 pc
0118 .dbsym r ucIICAdress 16 c
0118 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -