📄 twi.lis
字号:
00AE 7B85 ldd R23,y+11
00B0 .dbline -1
00B0 .dbline 106
00B0 ; }
00B0 ;
00B0 ; /*
00B0 ; 函数:TWI_page_write()
00B0 ; 功能:I2C总线综合发送函数,向从机发送多个字节的数据,整页发送
00B0 ; 参数:
00B0 ; SlaveAddr:从机地址(7位纯地址,不含读写位)
00B0 ; addr:从机的子地址
00B0 ; *arr:要发送的数据
00B0 ; n:数据的字节数
00B0 ; 返回:
00B0 ; 1:发送成功
00B0 ; 0:在发送过程中出现异常
00B0 ; 说明:
00B0 ; 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
00B0 ; 当从机没有子地址时,参数addr任意
00B0 ; */
00B0 ; uchar TWI_page_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
00B0 ; {
00B0 .dbline 108
00B0 ; uchar i;
00B0 ; TWI_start();
00B0 C5DF xcall _TWI_start
00B2 .dbline 109
00B2 ; TWI_writeB(devadd);
00B2 0C2D mov R16,R12
00B4 D0DF xcall _TWI_writeB
00B6 .dbline 110
00B6 ; TWI_writeB(addr);
00B6 042F mov R16,R20
00B8 CEDF xcall _TWI_writeB
00BA .dbline 111
00BA ; for(i=1;i<=n;i++)
00BA 41E0 ldi R20,1
00BC 06C0 xjmp L32
00BE L29:
00BE .dbline 112
00BE .dbline 115
00BE FB01 movw R30,R22
00C0 0081 ldd R16,z+0
00C2 C9DF xcall _TWI_writeB
00C4 .dbline 116
00C4 6F5F subi R22,255 ; offset = 1
00C6 7F4F sbci R23,255
00C8 .dbline 117
00C8 L30:
00C8 .dbline 111
00C8 4395 inc R20
00CA L32:
00CA .dbline 111
00CA A416 cp R10,R20
00CC C0F7 brsh L29
00CE .dbline 118
00CE ; {
00CE ; //TWI_writeB(i);
00CE ; //table[i]=i;
00CE ; TWI_writeB(*arr);
00CE ; arr++;
00CE ; }
00CE ; TWI_stop();
00CE BFDF xcall _TWI_stop
00D0 .dbline 119
00D0 ; delay(80);
00D0 00E5 ldi R16,80
00D2 10E0 ldi R17,0
00D4 95DF xcall _delay
00D6 .dbline -2
00D6 .dbline 120
00D6 ; }
00D6 L28:
00D6 0E940000 xcall pop_gset4
00DA .dbline 0 ; func end
00DA 0895 ret
00DC .dbsym r i 20 c
00DC .dbsym r arr 22 pc
00DC .dbsym r n 10 c
00DC .dbsym r addr 20 c
00DC .dbsym r devadd 12 c
00DC .dbend
00DC .dbfunc e TWI_write _TWI_write fc
00DC ; n_tmp -> R14
00DC ; arr -> R20,R21
00DC ; n -> R22
00DC ; addr -> R10
00DC ; devadd -> R12
.even
00DC _TWI_write::
00DC 0E940000 xcall push_gset5
00E0 A22E mov R10,R18
00E2 C02E mov R12,R16
00E4 2497 sbiw R28,4
00E6 6E85 ldd R22,y+14
00E8 4889 ldd R20,y+16
00EA 5989 ldd R21,y+17
00EC .dbline -1
00EC .dbline 138
00EC ;
00EC ; /*
00EC ; 函数:TWI_page_write()
00EC ; 功能:I2C总线综合发送函数,向从机发送多个字节的数据
00EC ; 参数:
00EC ; SlaveAddr:从机地址(7位纯地址,不含读写位)
00EC ; addr:从机的子地址
00EC ; *arr:要发送的数据
00EC ; n:数据的字节数
00EC ; 返回:
00EC ; 1:发送成功
00EC ; 0:在发送过程中出现异常
00EC ; 说明:
00EC ; 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
00EC ; 当从机没有子地址时,参数addr任意
00EC ; */
00EC ; uchar TWI_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
00EC ; {
00EC .dbline 140
00EC ; uchar n_tmp;
00EC ; n_tmp=Page_size-(uchar)(addr&Page_mask);
00EC 8A2D mov R24,R10
00EE 9927 clr R25
00F0 8770 andi R24,7
00F2 9070 andi R25,0
00F4 98E0 ldi R25,8
00F6 E92E mov R14,R25
00F8 E81A sub R14,R24
00FA .dbline 141
00FA ; if((n>n_tmp)&&(n_tmp!=0))
00FA E616 cp R14,R22
00FC E0F4 brsh L37
00FE EE20 tst R14
0100 D1F0 breq L37
0102 .dbline 142
0102 ; {
0102 .dbline 143
0102 ; TWI_page_write(devadd,addr,n_tmp,arr);//
0102 4A83 std y+2,R20
0104 5B83 std y+3,R21
0106 E882 std y+0,R14
0108 2A2D mov R18,R10
010A 0C2D mov R16,R12
010C CADF xcall _TWI_page_write
010E .dbline 144
010E ; addr+=n_tmp;
010E AE0C add R10,R14
0110 .dbline 145
0110 ; n-=n_tmp;
0110 6E19 sub R22,R14
0112 .dbline 146
0112 ; arr+=n_tmp;
0112 2E2C mov R2,R14
0114 3324 clr R3
0116 420D add R20,R2
0118 531D adc R21,R3
011A .dbline 147
011A ; }
011A 0DC0 xjmp L37
011C L36:
011C .dbline 149
011C .dbline 150
011C 4A83 std y+2,R20
011E 5B83 std y+3,R21
0120 88E0 ldi R24,8
0122 8883 std y+0,R24
0124 2A2D mov R18,R10
0126 0C2D mov R16,R12
0128 BCDF xcall _TWI_page_write
012A .dbline 151
012A 8A2D mov R24,R10
012C 885F subi R24,248 ; addi 8
012E A82E mov R10,R24
0130 .dbline 152
0130 6850 subi R22,8
0132 .dbline 153
0132 485F subi R20,248 ; offset = 8
0134 5F4F sbci R21,255
0136 .dbline 154
0136 L37:
0136 .dbline 148
0136 6830 cpi R22,8
0138 88F7 brsh L36
013A .dbline 155
013A 6623 tst R22
013C 31F0 breq L39
013E .dbline 156
013E 4A83 std y+2,R20
0140 5B83 std y+3,R21
0142 6883 std y+0,R22
0144 2A2D mov R18,R10
0146 0C2D mov R16,R12
0148 ACDF xcall _TWI_page_write
014A L39:
014A .dbline -2
014A .dbline 157
014A ; while(n>=Page_size)
014A ; {
014A ; TWI_page_write(devadd,addr,Page_size,arr);//
014A ; addr+=Page_size;
014A ; n-=Page_size;
014A ; arr+=Page_size;
014A ; }
014A ; if(n!=0)
014A ; TWI_page_write(devadd,addr,n,arr);//
014A ; }
014A L33:
014A 2496 adiw R28,4
014C 0E940000 xcall pop_gset5
0150 .dbline 0 ; func end
0150 0895 ret
0152 .dbsym r n_tmp 14 c
0152 .dbsym r arr 20 pc
0152 .dbsym r n 22 c
0152 .dbsym r addr 10 c
0152 .dbsym r devadd 12 c
0152 .dbend
0152 .dbfunc e TWI_read _TWI_read fc
0152 ; i -> R20
0152 ; arr -> R22,R23
0152 ; n -> R10
0152 ; addr -> R12
0152 ; devadd -> R20
.even
0152 _TWI_read::
0152 0E940000 xcall push_gset4
0156 C22E mov R12,R18
0158 402F mov R20,R16
015A A884 ldd R10,y+8
015C 6A85 ldd R22,y+10
015E 7B85 ldd R23,y+11
0160 .dbline -1
0160 .dbline 175
0160 ;
0160 ; /*
0160 ; 函数:TWI_read()
0160 ; 功能:I2C总线综合接收函数,从从机接收多个字节的数据
0160 ; 参数:
0160 ; SlaveAddr:从机地址(7位纯地址,不含读写位)
0160 ; addr:从机的子地址
0160 ; *arr:要发送的数据
0160 ; n:数据的字节数
0160 ; 返回:
0160 ; 1:接收成功
0160 ; 0:在接收过程中出现异常
0160 ; 说明:
0160 ; 本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
0160 ; 当从机没有子地址时,参数addr任意
0160 ; */
0160 ; uchar TWI_read(uchar devadd,uchar addr,uchar n,uchar *arr)
0160 ; {
0160 .dbline 177
0160 ; uchar i;
0160 ; TWI_start();
0160 6DDF xcall _TWI_start
0162 .dbline 178
0162 ; TWI_writeB(devadd);
0162 042F mov R16,R20
0164 78DF xcall _TWI_writeB
0166 .dbline 179
0166 ; TWI_writeB(addr);
0166 0C2D mov R16,R12
0168 76DF xcall _TWI_writeB
016A .dbline 180
016A ; TWI_start();
016A 68DF xcall _TWI_start
016C .dbline 181
016C ; TWI_writeB(devadd|1);
016C 042F mov R16,R20
016E 0160 ori R16,1
0170 72DF xcall _TWI_writeB
0172 .dbline 182
0172 ; for(i=1;i<=n-1;i++)
0172 41E0 ldi R20,1
0174 07C0 xjmp L45
0176 L42:
0176 .dbline 183
0176 .dbline 184
0176 01E0 ldi R16,1
0178 84DF xcall _TWI_readB
017A FB01 movw R30,R22
017C 0083 std z+0,R16
017E .dbline 185
017E 6F5F subi R22,255 ; offset = 1
0180 7F4F sbci R23,255
0182 .dbline 186
0182 L43:
0182 .dbline 182
0182 4395 inc R20
0184 L45:
0184 .dbline 182
0184 8A2D mov R24,R10
0186 8150 subi R24,1
0188 8417 cp R24,R20
018A A8F7 brsh L42
018C .dbline 187
018C ; {
018C ; *arr= TWI_readB(1);
018C ; arr++;
018C ; }
018C ; *arr= TWI_readB(0);
018C 0027 clr R16
018E 79DF xcall _TWI_readB
0190 FB01 movw R30,R22
0192 0083 std z+0,R16
0194 .dbline 188
0194 ; TWI_stop();
0194 5CDF xcall _TWI_stop
0196 .dbline -2
0196 .dbline 189
0196 ; }
0196 L41:
0196 0E940000 xcall pop_gset4
019A .dbline 0 ; func end
019A 0895 ret
019C .dbsym r i 20 c
019C .dbsym r arr 22 pc
019C .dbsym r n 10 c
019C .dbsym r addr 12 c
019C .dbsym r devadd 20 c
019C .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -