📄 i2c.lis
字号:
.module i2c.c
.area text(rom, con, rel)
0000 .dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\i2c.c
0000 .dbfunc e I2C_Ini _I2C_Ini fV
.even
0000 _I2C_Ini::
0000 .dbline -1
0000 .dbline 15
0000 ; //ICC-AVR application builder : 2005-11-12 17:11:59
0000 ; // Target : M16
0000 ; // Crystal: 8.0000Mhz
0000 ; // copyright:鲁军波(endylu)
0000 ; // www.shop34612283.taobao.com
0000 ; // www.adembed.com
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "main.h"
0000 ;
0000 ;
0000 ; //=======================================================================
0000 ; //初始化端口
0000 ; void I2C_Ini(void)
0000 ; {
0000 .dbline 16
0000 ; i2c_ddr|=(1<<SCL); //SCK为输出
0000 A09A sbi 0x14,0
0002 .dbline 17
0002 ; i2c_ddr|=(1<<SDA); //SDA为双向的,先设置为输出
0002 A19A sbi 0x14,1
0004 .dbline -2
0004 L1:
0004 .dbline 0 ; func end
0004 0895 ret
0006 .dbend
0006 .dbfunc e IICStart _IICStart fV
.even
0006 _IICStart::
0006 .dbline -1
0006 .dbline 24
0006 ;
0006 ;
0006 ; }
0006 ; //=======================================================================
0006 ; //启动总线。根据IIC协议,SCL为1时,SDA从1转变为0。
0006 ; void IICStart(void)
0006 ; { SCL_0;
0006 .dbline 24
0006 .dbline 24
0006 A898 cbi 0x15,0
0008 .dbline 24
0008 02E0 ldi R16,2
000A 10E0 ldi R17,0
000C 0E940000 xcall _Delay_us
0010 .dbline 24
0010 .dbline 24
0010 .dbline 25
0010 ; SDA_1;
0010 .dbline 25
0010 A99A sbi 0x15,1
0012 .dbline 25
0012 02E0 ldi R16,2
0014 10E0 ldi R17,0
0016 0E940000 xcall _Delay_us
001A .dbline 25
001A .dbline 25
001A .dbline 26
001A ; SCL_1;
001A .dbline 26
001A A89A sbi 0x15,0
001C .dbline 26
001C 02E0 ldi R16,2
001E 10E0 ldi R17,0
0020 0E940000 xcall _Delay_us
0024 .dbline 26
0024 .dbline 26
0024 .dbline 27
0024 ; SDA_0;
0024 .dbline 27
0024 A998 cbi 0x15,1
0026 .dbline 27
0026 02E0 ldi R16,2
0028 10E0 ldi R17,0
002A 0E940000 xcall _Delay_us
002E .dbline 27
002E .dbline 27
002E .dbline 28
002E ; SCL_0;
002E .dbline 28
002E A898 cbi 0x15,0
0030 .dbline 28
0030 02E0 ldi R16,2
0032 10E0 ldi R17,0
0034 0E940000 xcall _Delay_us
0038 .dbline 28
0038 .dbline 28
0038 .dbline -2
0038 L2:
0038 .dbline 0 ; func end
0038 0895 ret
003A .dbend
003A .dbfunc e IICStop _IICStop fV
.even
003A _IICStop::
003A .dbline -1
003A .dbline 33
003A ; }
003A ; //=======================================================================
003A ; //停止IIC总线。根据IIC协议,SCL为1时,SDA从0转变为1。
003A ; void IICStop(void)
003A ; {
003A .dbline 34
003A ; SCL_0;
003A .dbline 34
003A A898 cbi 0x15,0
003C .dbline 34
003C 02E0 ldi R16,2
003E 10E0 ldi R17,0
0040 0E940000 xcall _Delay_us
0044 .dbline 34
0044 .dbline 34
0044 .dbline 35
0044 ; SDA_0;
0044 .dbline 35
0044 A998 cbi 0x15,1
0046 .dbline 35
0046 02E0 ldi R16,2
0048 10E0 ldi R17,0
004A 0E940000 xcall _Delay_us
004E .dbline 35
004E .dbline 35
004E .dbline 36
004E ; SCL_1;
004E .dbline 36
004E A89A sbi 0x15,0
0050 .dbline 36
0050 02E0 ldi R16,2
0052 10E0 ldi R17,0
0054 0E940000 xcall _Delay_us
0058 .dbline 36
0058 .dbline 36
0058 .dbline 37
0058 ; SDA_1;
0058 .dbline 37
0058 A99A sbi 0x15,1
005A .dbline 37
005A 02E0 ldi R16,2
005C 10E0 ldi R17,0
005E 0E940000 xcall _Delay_us
0062 .dbline 37
0062 .dbline 37
0062 .dbline -2
0062 L3:
0062 .dbline 0 ; func end
0062 0895 ret
0064 .dbend
0064 .dbfunc e IICRecAck _IICRecAck fc
0064 ; ack -> R20
.even
0064 _IICRecAck::
0064 0E940000 xcall push_gset1
0068 .dbline -1
0068 .dbline 45
0068 ; //SCL_0;
0068 ; }
0068 ; //=======================================================================
0068 ; //检查应答位,向I2C写数据时,I2C设备(EEPROM)正常接受到数据后在第9周期发出0应答,
0068 ; //如果不正常接受到数据,则不以0应答而进入待命状态。
0068 ; //写数据后需检查I2C设备是否有0应答。
0068 ; unsigned char IICRecAck(void)
0068 ; {
0068 .dbline 48
0068 ; uint8 ack;
0068 ;
0068 ; SCL_0;
0068 .dbline 48
0068 A898 cbi 0x15,0
006A .dbline 48
006A 02E0 ldi R16,2
006C 10E0 ldi R17,0
006E 0E940000 xcall _Delay_us
0072 .dbline 48
0072 .dbline 48
0072 .dbline 49
0072 ; SDA_0;
0072 .dbline 49
0072 A998 cbi 0x15,1
0074 .dbline 49
0074 02E0 ldi R16,2
0076 10E0 ldi R17,0
0078 0E940000 xcall _Delay_us
007C .dbline 49
007C .dbline 49
007C .dbline 50
007C ; SCL_1;
007C .dbline 50
007C A89A sbi 0x15,0
007E .dbline 50
007E 02E0 ldi R16,2
0080 10E0 ldi R17,0
0082 0E940000 xcall _Delay_us
0086 .dbline 50
0086 .dbline 50
0086 .dbline 52
0086 ;
0086 ; i2c_ddr&=~(1<<SDA); //设置SDA为输入
0086 A198 cbi 0x14,1
0088 .dbline 53
0088 ; i2c_port|=1<<SDA; //上拉
0088 A99A sbi 0x15,1
008A .dbline 54
008A ; ack=(i2c_pin & (1<<SDA)); //读SDA应答位
008A 43B3 in R20,0x13
008C 4270 andi R20,2
008E .dbline 55
008E ; i2c_ddr|=(1<<SDA); //恢复为输出
008E A19A sbi 0x14,1
0090 .dbline 57
0090 ;
0090 ; SCL_0;
0090 .dbline 57
0090 A898 cbi 0x15,0
0092 .dbline 57
0092 02E0 ldi R16,2
0094 10E0 ldi R17,0
0096 0E940000 xcall _Delay_us
009A .dbline 57
009A .dbline 57
009A .dbline 58
009A ; return(ack);
009A 042F mov R16,R20
009C .dbline -2
009C L4:
009C 0E940000 xcall pop_gset1
00A0 .dbline 0 ; func end
00A0 0895 ret
00A2 .dbsym r ack 20 c
00A2 .dbend
00A2 .dbfunc e IICReceiveByte _IICReceiveByte fc
00A2 ; i -> R20
00A2 ; receivebyte -> R22
.even
00A2 _IICReceiveByte::
00A2 0E940000 xcall push_gset2
00A6 .dbline -1
00A6 .dbline 63
00A6 ; }
00A6 ; //=======================================================================
00A6 ; //从IIC总线上读数据。
00A6 ; unsigned char IICReceiveByte(void)
00A6 ; {
00A6 .dbline 64
00A6 ; uint8 receivebyte=0,i=8;
00A6 6627 clr R22
00A8 .dbline 64
00A8 48E0 ldi R20,8
00AA .dbline 66
00AA ;
00AA ; i2c_ddr&=~(1<<SDA); //设置SDA为输入
00AA A198 cbi 0x14,1
00AC .dbline 67
00AC ; i2c_port|=1<<SDA; //上拉
00AC A99A sbi 0x15,1
00AE .dbline 68
00AE ; i2c_port&=~(1<<SCL);
00AE A898 cbi 0x15,0
00B0 0EC0 xjmp L7
00B2 L6:
00B2 .dbline 71
00B2 ;
00B2 ; while(i--)
00B2 ; {
00B2 .dbline 72
00B2 ; SCL_1;
00B2 .dbline 72
00B2 A89A sbi 0x15,0
00B4 .dbline 72
00B4 02E0 ldi R16,2
00B6 10E0 ldi R17,0
00B8 0E940000 xcall _Delay_us
00BC .dbline 72
00BC .dbline 72
00BC .dbline 73
00BC ; receivebyte <<= 1;
00BC 660F lsl R22
00BE .dbline 74
00BE ; if(i2c_pin & (1<<SDA)) receivebyte |= 1;
00BE 999B sbis 0x13,1
00C0 01C0 rjmp L9
00C2 .dbline 74
00C2 6160 ori R22,1
00C4 L9:
00C4 .dbline 75
00C4 .dbline 75
00C4 A898 cbi 0x15,0
00C6 .dbline 75
00C6 02E0 ldi R16,2
00C8 10E0 ldi R17,0
00CA 0E940000 xcall _Delay_us
00CE .dbline 75
00CE .dbline 75
00CE .dbline 76
00CE L7:
00CE .dbline 70
00CE 242E mov R2,R20
00D0 3324 clr R3
00D2 4150 subi R20,1
00D4 2220 tst R2
00D6 69F7 brne L6
00D8 .dbline 78
00D8 ; SCL_0;
00D8 ; }
00D8 ;
00D8 ; i2c_ddr|=(1<<SDA); //恢复SDA为输出
00D8 A19A sbi 0x14,1
00DA .dbline 79
00DA ; return(receivebyte);
00DA 062F mov R16,R22
00DC .dbline -2
00DC L5:
00DC 0E940000 xcall pop_gset2
00E0 .dbline 0 ; func end
00E0 0895 ret
00E2 .dbsym r i 20 c
00E2 .dbsym r receivebyte 22 c
00E2 .dbend
00E2 .dbfunc e IICACK _IICACK fV
.even
00E2 _IICACK::
00E2 .dbline -1
00E2 .dbline 86
00E2 ; }
00E2 ;
00E2 ;
00E2 ; //=======================================================================
00E2 ; //对IIC总线产生应答。读I2C设备时,如果下一步还要读则产生0应答。
00E2 ; void IICACK(void)
00E2 ; {
00E2 .dbline 87
00E2 ; SDA_0;
00E2 .dbline 87
00E2 A998 cbi 0x15,1
00E4 .dbline 87
00E4 02E0 ldi R16,2
00E6 10E0 ldi R17,0
00E8 0E940000 xcall _Delay_us
00EC .dbline 87
00EC .dbline 87
00EC .dbline 88
00EC ; SCL_1;
00EC .dbline 88
00EC A89A sbi 0x15,0
00EE .dbline 88
00EE 02E0 ldi R16,2
00F0 10E0 ldi R17,0
00F2 0E940000 xcall _Delay_us
00F6 .dbline 88
00F6 .dbline 88
00F6 .dbline 89
00F6 ; SCL_0;
00F6 .dbline 89
00F6 A898 cbi 0x15,0
00F8 .dbline 89
00F8 02E0 ldi R16,2
00FA 10E0 ldi R17,0
00FC 0E940000 xcall _Delay_us
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -