📄 i2c.lis
字号:
008A _SendByte::
008A AA92 st -y,R10
008C 4A93 st -y,R20
008E A02E mov R10,R16
0090 .dbline -1
0090 .dbline 77
0090 ; }
0090 ;
0090 ; void SendByte(BYTE c)
0090 ; {
0090 .dbline 79
0090 ; BYTE BitCnt;
0090 ; I2C_DDR=(1<<SDA)|(1<<SCL); /*SDA SCL端口均定义为输出*/
0090 80EA ldi R24,160
0092 81BB out 0x11,R24
0094 .dbline 80
0094 ; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
0094 4427 clr R20
0096 11C0 xjmp L15
0098 L12:
0098 .dbline 81
0098 ; {
0098 .dbline 82
0098 ; if((c<<BitCnt)&0x08) /*判断发送位*/
0098 0A2D mov R16,R10
009A 142F mov R17,R20
009C 0E940000 xcall lsl8
00A0 802F mov R24,R16
00A2 8870 andi R24,8
00A4 11F0 breq L16
00A6 X2:
00A6 .dbline 83
00A6 ; {
00A6 .dbline 84
00A6 ; SDA_H;
00A6 979A sbi 0x12,7
00A8 .dbline 85
00A8 ; }
00A8 01C0 xjmp L17
00AA L16:
00AA .dbline 87
00AA ; else
00AA ; {
00AA .dbline 88
00AA ; SDA_L;
00AA 9798 cbi 0x12,7
00AC .dbline 89
00AC ; }
00AC L17:
00AC .dbline 90
00AC ; delay_us(1);
00AC 01E0 ldi R16,1
00AE A8DF xcall _delay_us
00B0 .dbline 91
00B0 ; SCL_H; /*置时钟线为高,通知被控器开始接收数据位*/
00B0 959A sbi 0x12,5
00B2 .dbline 92
00B2 ; delay_us(5); /*保证时钟高电平周期大于4μs*/
00B2 05E0 ldi R16,5
00B4 A5DF xcall _delay_us
00B6 .dbline 93
00B6 ; SCL_L;
00B6 9598 cbi 0x12,5
00B8 .dbline 94
00B8 ; }
00B8 L13:
00B8 .dbline 80
00B8 4395 inc R20
00BA L15:
00BA .dbline 80
00BA 4830 cpi R20,8
00BC 68F3 brlo L12
00BE X3:
00BE .dbline 95
00BE ; delay_us(2);
00BE 02E0 ldi R16,2
00C0 9FDF xcall _delay_us
00C2 .dbline 96
00C2 ; I2C_DDR=~(1<<SDA); /*SDA定义为输入,置数据线为输入方式*/
00C2 8FE7 ldi R24,-129
00C4 9FEF ldi R25,-1
00C6 81BB out 0x11,R24
00C8 .dbline 97
00C8 ; SDA_H; /*8位发送完后释放数据线,准备接收应答位,打开内部上拉*/
00C8 979A sbi 0x12,7
00CA .dbline 98
00CA ; delay_us(2);
00CA 02E0 ldi R16,2
00CC 99DF xcall _delay_us
00CE .dbline 99
00CE ; SCL_H;
00CE 959A sbi 0x12,5
00D0 .dbline 100
00D0 ; delay_us(3);
00D0 03E0 ldi R16,3
00D2 96DF xcall _delay_us
00D4 .dbline 101
00D4 ; if(ACK_FAIL) /*判断是否接收到应答信号*/
00D4 80B3 in R24,0x10
00D6 8695 lsr R24
00D8 8695 lsr R24
00DA 8695 lsr R24
00DC 8695 lsr R24
00DE 8695 lsr R24
00E0 8695 lsr R24
00E2 8695 lsr R24
00E4 8170 andi R24,1
00E6 21F0 breq L18
00E8 X4:
00E8 .dbline 102
00E8 ; {
00E8 .dbline 103
00E8 ; ack=0;
00E8 2224 clr R2
00EA 20920000 sts _ack,R2
00EE .dbline 104
00EE ; }
00EE 03C0 xjmp L19
00F0 L18:
00F0 .dbline 106
00F0 ; else
00F0 ; {
00F0 .dbline 107
00F0 ; ack=1;
00F0 81E0 ldi R24,1
00F2 80930000 sts _ack,R24
00F6 .dbline 108
00F6 ; }
00F6 L19:
00F6 .dbline 109
00F6 ; SCL_L;
00F6 9598 cbi 0x12,5
00F8 .dbline 110
00F8 ; delay_us(2);
00F8 02E0 ldi R16,2
00FA 82DF xcall _delay_us
00FC .dbline -2
00FC L11:
00FC .dbline 0 ; func end
00FC 4991 ld R20,y+
00FE A990 ld R10,y+
0100 0895 ret
0102 .dbsym r BitCnt 20 c
0102 .dbsym r c 10 c
0102 .dbend
0102 .dbfunc e ReceiveByte _ReceiveByte fc
0102 ; retc -> R10
0102 ; BitCnt -> R20
.even
0102 _ReceiveByte::
0102 AA92 st -y,R10
0104 4A93 st -y,R20
0106 .dbline -1
0106 .dbline 114
0106 ; }
0106 ;
0106 ; BYTE ReceiveByte(void)
0106 ; {
0106 .dbline 117
0106 ; BYTE retc;
0106 ; BYTE BitCnt;
0106 ; retc=0;
0106 AA24 clr R10
0108 .dbline 118
0108 ; I2C_DDR=~(1<<SDA);
0108 8FE7 ldi R24,-129
010A 9FEF ldi R25,-1
010C 81BB out 0x11,R24
010E .dbline 119
010E ; SDA_H; /*SDA定义为输入,置数据线为输入方式*/
010E 979A sbi 0x12,7
0110 .dbline 120
0110 ; for(BitCnt=0;BitCnt<8;BitCnt++)
0110 4427 clr R20
0112 17C0 xjmp L24
0114 L21:
0114 .dbline 121
0114 ; {
0114 .dbline 122
0114 ; delay_us(1);
0114 01E0 ldi R16,1
0116 74DF xcall _delay_us
0118 .dbline 123
0118 ; SCL_L; /*置时钟线位低,准备接收数据位*/
0118 9598 cbi 0x12,5
011A .dbline 124
011A ; delay_us(5); /*时钟低电平周期大于4.7μs*/
011A 05E0 ldi R16,5
011C 71DF xcall _delay_us
011E .dbline 125
011E ; SCL_H; /*置时钟线为高,使数据线上数据有效*/
011E 959A sbi 0x12,5
0120 .dbline 126
0120 ; delay_us(2);
0120 02E0 ldi R16,2
0122 6EDF xcall _delay_us
0124 .dbline 127
0124 ; retc<<=1;
0124 AA0C lsl R10
0126 .dbline 128
0126 ; if(SDA_HIGH)
0126 80B3 in R24,0x10
0128 8695 lsr R24
012A 8695 lsr R24
012C 8695 lsr R24
012E 8695 lsr R24
0130 8695 lsr R24
0132 8695 lsr R24
0134 8695 lsr R24
0136 8170 andi R24,1
0138 09F0 breq L25
013A X5:
013A .dbline 129
013A ; {
013A .dbline 130
013A ; retc+=1; /*读数据位,接收的数据位放入retc中*/
013A A394 inc R10
013C .dbline 131
013C ; }
013C L25:
013C .dbline 132
013C ; delay_us(2);
013C 02E0 ldi R16,2
013E 60DF xcall _delay_us
0140 .dbline 133
0140 ; }
0140 L22:
0140 .dbline 120
0140 4395 inc R20
0142 L24:
0142 .dbline 120
0142 4830 cpi R20,8
0144 38F3 brlo L21
0146 X6:
0146 .dbline 134
0146 ; SCL_L;
0146 9598 cbi 0x12,5
0148 .dbline 135
0148 ; delay_us(2);
0148 02E0 ldi R16,2
014A 5ADF xcall _delay_us
014C .dbline 136
014C ; return retc;
014C 0A2D mov R16,R10
014E .dbline -2
014E L20:
014E .dbline 0 ; func end
014E 4991 ld R20,y+
0150 A990 ld R10,y+
0152 0895 ret
0154 .dbsym r retc 10 c
0154 .dbsym r BitCnt 20 c
0154 .dbend
0154 ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -