📄 iic_drive.lis
字号:
.module IIC_drive.C
.area text(rom, con, rel)
0000 .dbfile D:\mega16\drive\IIC_drive.C
0000 .dbfunc e IIC_init _IIC_init fV
.even
0000 _IIC_init::
0000 .dbline -1
0000 .dbline 20
0000 ; /******************************************************************************/
0000 ; /* 用TWI口 读写IIC总线 */
0000 ; /* MEGA16 8M */
0000 ; /* 100K */
0000 ; /******************************************************************************/
0000 ;
0000 ; #include "config.h"
0000 ;
0000 ; #define TW_START 0X08
0000 ; #define TW_SLA_ACK 0X18
0000 ; #define TW_SLA_NO_ACK 0X20
0000 ; #define TW_DATA_ACK 0X28
0000 ; #define TW_DATA_NO_ACK 0X30
0000 ;
0000 ;
0000 ; #define TW_STATE (TWSR & 0XF8)
0000 ;
0000 ; /******************************************************************************/
0000 ; void IIC_init(void)
0000 ; {
0000 .dbline 21
0000 ; TWCR= 0X00; //disable twi
0000 2224 clr R2
0002 26BE out 0x36,R2
0004 .dbline 22
0004 ; TWBR= 0x20; //set bit rate
0004 80E2 ldi R24,32
0006 80B9 out 0x0,R24
0008 .dbline 23
0008 ; TWSR= 0x00; //set prescale
0008 21B8 out 0x1,R2
000A .dbline 24
000A ; TWAR= 0x00; //set slave address
000A 22B8 out 0x2,R2
000C .dbline 25
000C ; TWCR= 0x00; //enable twi
000C 26BE out 0x36,R2
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
0010 .dbfunc e IIC_START _IIC_START fV
.even
0010 _IIC_START::
0010 .dbline -1
0010 .dbline 29
0010 ; }
0010 ; /******************************************************************************/
0010 ; void IIC_START(void)
0010 ; {
0010 .dbline 30
0010 ; TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
0010 84EA ldi R24,164
0012 86BF out 0x36,R24
0014 L3:
0014 .dbline 31
0014 L4:
0014 .dbline 31
0014 ; while(!(TWCR & BIT(TWINT)));
0014 26B6 in R2,0x36
0016 27FE sbrs R2,7
0018 FDCF rjmp L3
001A .dbline -2
001A L2:
001A .dbline 0 ; func end
001A 0895 ret
001C .dbend
001C .dbfunc e IIC_STOP _IIC_STOP fV
.even
001C _IIC_STOP::
001C .dbline -1
001C .dbline 35
001C ; }
001C ; /******************************************************************************/
001C ; void IIC_STOP(void)
001C ; {
001C .dbline 36
001C ; TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
001C 84E9 ldi R24,148
001E 86BF out 0x36,R24
0020 L7:
0020 .dbline 37
0020 L8:
0020 .dbline 37
0020 ; while(!(TWCR & BIT(TWINT)));
0020 26B6 in R2,0x36
0022 27FE sbrs R2,7
0024 FDCF rjmp L7
0026 .dbline -2
0026 L6:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbend
0028 .dbfunc e IIC_send _IIC_send fV
0028 ; IIC_state -> <dead>
0028 ; IIC_data -> R16
.even
0028 _IIC_send::
0028 .dbline -1
0028 .dbline 41
0028 ; }
0028 ; /******************************************************************************/
0028 ; void IIC_send(unsigned char IIC_data)
0028 ; {
0028 .dbline 43
0028 ; unsigned char IIC_state;
0028 ; TWDR = IIC_data;
0028 03B9 out 0x3,R16
002A .dbline 44
002A ; TWCR = BIT(TWINT) | BIT(TWEN);
002A 84E8 ldi R24,132
002C 86BF out 0x36,R24
002E L11:
002E .dbline 45
002E L12:
002E .dbline 45
002E ; while(!(TWCR & TWINT));
002E 86B7 in R24,0x36
0030 8770 andi R24,7
0032 E9F3 breq L11
0034 .dbline -2
0034 L10:
0034 .dbline 0 ; func end
0034 0895 ret
0036 .dbsym l IIC_state 1 c
0036 .dbsym r IIC_data 16 c
0036 .dbend
0036 .dbfunc e IIC_take _IIC_take fc
.even
0036 _IIC_take::
0036 .dbline -1
0036 .dbline 49
0036 ; }
0036 ; /******************************************************************************/
0036 ; unsigned char IIC_take(void)
0036 ; {
0036 .dbline 50
0036 ; TWCR |= BIT(TWINT) | BIT(TWEN) | BIT(TWEA);
0036 86B7 in R24,0x36
0038 846C ori R24,196
003A 86BF out 0x36,R24
003C L15:
003C .dbline 51
003C L16:
003C .dbline 51
003C ; while(!(TWCR & BIT(TWINT)));
003C 26B6 in R2,0x36
003E 27FE sbrs R2,7
0040 FDCF rjmp L15
0042 .dbline 52
0042 ; return (TWDR);
0042 03B1 in R16,0x3
0044 .dbline -2
0044 L14:
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbend
0046 .dbfunc e IIC_read _IIC_read fc
0046 ; n_byte -> R20
0046 ; IIC_data -> R22,R23
0046 ; IIC_address -> R10
.even
0046 _IIC_read::
0046 0E940000 xcall push_gset3
004A B901 movw R22,R18
004C A02E mov R10,R16
004E 4E81 ldd R20,y+6
0050 .dbline -1
0050 .dbline 56
0050 ; }
0050 ; /******************************************************************************/
0050 ; unsigned char IIC_read(unsigned char IIC_address,unsigned char *IIC_data,unsigned char n_byte)
0050 ; {
0050 .dbline 57
0050 ; IIC_address |= 0x01;
0050 8A2D mov R24,R10
0052 8160 ori R24,1
0054 A82E mov R10,R24
0056 .dbline 58
0056 ; IIC_START();
0056 DCDF xcall _IIC_START
0058 .dbline 59
0058 ; IIC_send(IIC_address);
0058 0A2D mov R16,R10
005A E6DF xcall _IIC_send
005C .dbline 60
005C ; if(TW_STATE != TW_SLA_ACK)
005C 81B1 in R24,0x1
005E 887F andi R24,248
0060 8831 cpi R24,24
0062 49F0 breq L22
0064 .dbline 61
0064 ; {
0064 .dbline 64
0064 ; // IIC_STOP();
0064 ; // return FALSE;
0064 ; }
0064 08C0 xjmp L22
0066 L21:
0066 .dbline 66
0066 ; while(--n_byte)
0066 ; {
0066 .dbline 67
0066 ; *IIC_data++ = IIC_take();
0066 E7DF xcall _IIC_take
0068 FB01 movw R30,R22
006A 0193 st Z+,R16
006C BF01 movw R22,R30
006E .dbline 68
006E ; if(TW_STATE == TW_DATA_NO_ACK)
006E 81B1 in R24,0x1
0070 887F andi R24,248
0072 8033 cpi R24,48
0074 01F4 brne L24
0076 .dbline 69
0076 ; {
0076 .dbline 72
0076 ; // IIC_STOP();
0076 ; // return FALSE;
0076 ; }
0076 L24:
0076 .dbline 73
0076 L22:
0076 .dbline 65
0076 842F mov R24,R20
0078 8150 subi R24,1
007A 482F mov R20,R24
007C 8823 tst R24
007E 99F7 brne L21
0080 .dbline 74
0080 ; }
0080 ; TWCR |= BIT(TWINT) | BIT(TWEN);
0080 86B7 in R24,0x36
0082 8468 ori R24,132
0084 86BF out 0x36,R24
0086 L26:
0086 .dbline 75
0086 L27:
0086 .dbline 75
0086 ; while(!(TWCR & BIT(TWINT)));
0086 26B6 in R2,0x36
0088 27FE sbrs R2,7
008A FDCF rjmp L26
008C .dbline 76
008C ; *IIC_data = TWDR;
008C 23B0 in R2,0x3
008E FB01 movw R30,R22
0090 2082 std z+0,R2
0092 .dbline 77
0092 ; if(TW_STATE == TW_DATA_NO_ACK)
0092 81B1 in R24,0x1
0094 887F andi R24,248
0096 8033 cpi R24,48
0098 01F4 brne L29
009A .dbline 78
009A ; {
009A .dbline 81
009A ; // IIC_STOP();
009A ; // return FALSE;
009A ; }
009A L29:
009A .dbline 82
009A ; IIC_STOP();
009A C0DF xcall _IIC_STOP
009C .dbline 83
009C ; return TRUE;
009C 01E0 ldi R16,1
009E .dbline -2
009E L18:
009E 0E940000 xcall pop_gset3
00A2 .dbline 0 ; func end
00A2 0895 ret
00A4 .dbsym r n_byte 20 c
00A4 .dbsym r IIC_data 22 pc
00A4 .dbsym r IIC_address 10 c
00A4 .dbend
00A4 .dbfunc e IIC_write _IIC_write fc
00A4 ; n_byte -> R20
00A4 ; IIC_data -> R22,R23
00A4 ; IIC_address -> R10
.even
00A4 _IIC_write::
00A4 0E940000 xcall push_gset3
00A8 B901 movw R22,R18
00AA A02E mov R10,R16
00AC 4E81 ldd R20,y+6
00AE .dbline -1
00AE .dbline 87
00AE ; }
00AE ; /******************************************************************************/
00AE ; unsigned char IIC_write(unsigned char IIC_address,unsigned char *IIC_data,unsigned char n_byte)
00AE ; {
00AE .dbline 88
00AE ; IIC_address &= 0xfe;
00AE 8A2D mov R24,R10
00B0 8E7F andi R24,254
00B2 A82E mov R10,R24
00B4 .dbline 89
00B4 ; IIC_START();
00B4 ADDF xcall _IIC_START
00B6 .dbline 90
00B6 ; IIC_send(IIC_address);
00B6 0A2D mov R16,R10
00B8 B7DF xcall _IIC_send
00BA .dbline 91
00BA ; if(TW_STATE != TW_SLA_ACK)
00BA 81B1 in R24,0x1
00BC 887F andi R24,248
00BE 8831 cpi R24,24
00C0 49F0 breq L35
00C2 .dbline 92
00C2 ; {
00C2 .dbline 95
00C2 ; // IIC_STOP();
00C2 ; // return FALSE;
00C2 ; }
00C2 08C0 xjmp L35
00C4 L34:
00C4 .dbline 97
00C4 ; while(n_byte--)
00C4 ; {
00C4 .dbline 98
00C4 ; IIC_send(*IIC_data++);
00C4 FB01 movw R30,R22
00C6 0191 ld R16,Z+
00C8 BF01 movw R22,R30
00CA AEDF xcall _IIC_send
00CC .dbline 99
00CC ; if(TW_STATE != TW_DATA_ACK)
00CC 81B1 in R24,0x1
00CE 887F andi R24,248
00D0 8832 cpi R24,40
00D2 01F0 breq L37
00D4 .dbline 100
00D4 ; {
00D4 .dbline 103
00D4 ; // IIC_STOP();
00D4 ; // return FALSE;
00D4 ; }
00D4 L37:
00D4 .dbline 104
00D4 L35:
00D4 .dbline 96
00D4 242E mov R2,R20
00D6 3324 clr R3
00D8 4150 subi R20,1
00DA 2220 tst R2
00DC 99F7 brne L34
00DE .dbline 105
00DE ; }
00DE ; IIC_STOP();
00DE 9EDF xcall _IIC_STOP
00E0 .dbline 106
00E0 ; return TRUE;
00E0 01E0 ldi R16,1
00E2 .dbline -2
00E2 L31:
00E2 0E940000 xcall pop_gset3
00E6 .dbline 0 ; func end
00E6 0895 ret
00E8 .dbsym r n_byte 20 c
00E8 .dbsym r IIC_data 22 pc
00E8 .dbsym r IIC_address 10 c
00E8 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -