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

📄 i2c.lis

📁 LED条屏显示程序,但是对初学者
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -