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

📄 iic_drive.lis

📁 hao da jia lai fen xiang
💻 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 + -