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

📄 i2c.lis

📁 AVR系列被广泛应用的单片机MEGA8开发(原理图)及例程
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module I2C.C
                        .area text(rom, con, rel)
 0000                   .dbfile D:\Datasheet\Atmel\FROMJI~1\AVR_Demo\m8\SoftWare\I2C.C
 0000                   .dbfunc e i2c_Write _i2c_Write fc
 0000           ;          Wdata -> R20
 0000           ;       RomAddrL -> R22
                        .even
 0000           _i2c_Write::
 0000 00D0              rcall push_gset2
 0002 422F              mov R20,R18
 0004 602F              mov R22,R16
 0006                   .dbline -1
 0006                   .dbline 8
 0006           ; #include <iom8v.h>
 0006           ; #include <macros.h>
 0006           ; #include "Uart.h"
 0006           ; #include"I2C.H"
 0006           ; #include "M8Demo.h"
 0006           ; 
 0006           ; unsigned char i2c_Write(unsigned char RomAddrL,unsigned char Wdata) 
 0006           ; {     PORTC|=0x38;
 0006                   .dbline 8
 0006 85B3              in R24,0x15
 0008 8863              ori R24,56
 000A 85BB              out 0x15,R24
 000C                   .dbline 9
 000C           ;         Delayms(10);
 000C 0AE0              ldi R16,10
 000E 10E0              ldi R17,0
 0010 00D0              rcall _Delayms
 0012                   .dbline 10
 0012           ;         Start();//I2C启动
 0012 84EA              ldi R24,164
 0014 86BF              out 0x36,R24
 0016                   .dbline 11
 0016           L2:
 0016                   .dbline 11
 0016           L3:
 0016                   .dbline 11
 0016           ;         Wait();
 0016 26B6              in R2,0x36
 0018 27FE              sbrs R2,7
 001A FDCF              rjmp L2
 001C                   .dbline 11
 001C                   .dbline 11
 001C                   .dbline 12
 001C           ;         if(TestAck()!=START) 
 001C 81B1              in R24,0x1
 001E 887F              andi R24,248
 0020 8830              cpi R24,8
 0022 21F0              breq L5
 0024                   .dbline 13
 0024           ;         {PutStr("ERROR1");goto end_i2c_write;} //ACK
 0024                   .dbline 13
 0024 00E0              ldi R16,<L7
 0026 10E0              ldi R17,>L7
 0028 00D0              rcall _PutStr
 002A                   .dbline 13
 002A 33C0              rjmp L8
 002C           L5:
 002C                   .dbline 15
 002C           ;         
 002C           ;         Write8Bit(wr_device_add);//写I2C从器件地址和写方式
 002C                   .dbline 15
 002C 80EA              ldi R24,160
 002E 83B9              out 0x3,R24
 0030                   .dbline 15
 0030 84E8              ldi R24,132
 0032 86BF              out 0x36,R24
 0034                   .dbline 15
 0034                   .dbline 15
 0034                   .dbline 16
 0034           L9:
 0034                   .dbline 16
 0034           L10:
 0034                   .dbline 16
 0034           ;         Wait();
 0034 26B6              in R2,0x36
 0036 27FE              sbrs R2,7
 0038 FDCF              rjmp L9
 003A                   .dbline 16
 003A                   .dbline 16
 003A                   .dbline 17
 003A           ;         if(TestAck()!=MT_ADDR_ACK)
 003A 81B1              in R24,0x1
 003C 887F              andi R24,248
 003E 8831              cpi R24,24
 0040 21F0              breq L12
 0042                   .dbline 18
 0042           ;               {PutStr("ERROR2");goto end_i2c_write;} //ACK
 0042                   .dbline 18
 0042 00E0              ldi R16,<L14
 0044 10E0              ldi R17,>L14
 0046 00D0              rcall _PutStr
 0048                   .dbline 18
 0048 24C0              rjmp L8
 004A           L12:
 004A                   .dbline 20
 004A           ;               
 004A           ;         Write8Bit(RomAddrL);//写24C02的ROM地址
 004A                   .dbline 20
 004A 63B9              out 0x3,R22
 004C                   .dbline 20
 004C 84E8              ldi R24,132
 004E 86BF              out 0x36,R24
 0050                   .dbline 20
 0050                   .dbline 20
 0050                   .dbline 21
 0050           L15:
 0050                   .dbline 21
 0050           L16:
 0050                   .dbline 21
 0050           ;         Wait();
 0050 26B6              in R2,0x36
 0052 27FE              sbrs R2,7
 0054 FDCF              rjmp L15
 0056                   .dbline 21
 0056                   .dbline 21
 0056                   .dbline 22
 0056           ;         if(TestAck()!=MT_DATA_ACK)
 0056 81B1              in R24,0x1
 0058 887F              andi R24,248
 005A 8832              cpi R24,40
 005C 21F0              breq L18
 005E                   .dbline 23
 005E           ;               {PutStr("ERROR4");goto end_i2c_write;} //ACK
 005E                   .dbline 23
 005E 00E0              ldi R16,<L20
 0060 10E0              ldi R17,>L20
 0062 00D0              rcall _PutStr
 0064                   .dbline 23
 0064 16C0              rjmp L8
 0066           L18:
 0066                   .dbline 25
 0066           ; 
 0066           ;         Write8Bit(Wdata);//写数据到24C02的ROM
 0066                   .dbline 25
 0066 43B9              out 0x3,R20
 0068                   .dbline 25
 0068 84E8              ldi R24,132
 006A 86BF              out 0x36,R24
 006C                   .dbline 25
 006C                   .dbline 25
 006C                   .dbline 26
 006C           L21:
 006C                   .dbline 26
 006C           L22:
 006C                   .dbline 26
 006C           ;         Wait();
 006C 26B6              in R2,0x36
 006E 27FE              sbrs R2,7
 0070 FDCF              rjmp L21
 0072                   .dbline 26
 0072                   .dbline 26
 0072                   .dbline 27
 0072           ;         if(TestAck()!=MT_DATA_ACK)    
 0072 81B1              in R24,0x1
 0074 887F              andi R24,248
 0076 8832              cpi R24,40
 0078 21F0              breq L24
 007A                   .dbline 28
 007A           ;               {PutStr("ERROR5");goto end_i2c_write;} //ACK
 007A                   .dbline 28
 007A 00E0              ldi R16,<L26
 007C 10E0              ldi R17,>L26
 007E 00D0              rcall _PutStr
 0080                   .dbline 28
 0080 08C0              rjmp L8
 0082           L24:
 0082                   .dbline 29
 0082           ;         Stop();//I2C停止
 0082 84E9              ldi R24,148
 0084 86BF              out 0x36,R24
 0086                   .dbline 30
 0086           ;          twi_Disable();
 0086 00D0              rcall _twi_Disable
 0088                   .dbline 31
 0088           ; Delayms(10  );
 0088 0AE0              ldi R16,10
 008A 10E0              ldi R17,0
 008C 00D0              rcall _Delayms
 008E                   .dbline 32
 008E           ;         return 0;
 008E 0027              clr R16
 0090 04C0              rjmp L1
 0092           L8:
 0092                   .dbline 35
 0092           ; end_i2c_write:
 0092           ;       
 0092           ;        Stop();//I2C停止
 0092 84E9              ldi R24,148
 0094 86BF              out 0x36,R24
 0096                   .dbline 36
 0096           ;         twi_Disable();
 0096 00D0              rcall _twi_Disable
 0098                   .dbline 37
 0098           ;                 return 1;
 0098 01E0              ldi R16,1
 009A                   .dbline -2
 009A           L1:
 009A 00D0              rcall pop_gset2
 009C                   .dbline 0 ; func end
 009C 0895              ret
 009E                   .dbsym r Wdata 20 c
 009E                   .dbsym r RomAddrL 22 c
 009E                   .dbend
 009E                   .dbfunc e i2c_Read _i2c_Read fc
 009E           ;           temp -> R20
 009E           ;       RomAddrL -> R20
                        .even
 009E           _i2c_Read::
 009E 00D0              rcall push_gset1
 00A0 402F              mov R20,R16
 00A2                   .dbline -1
 00A2                   .dbline 46
 00A2           ;       
 00A2           ; }
 00A2           ; 
 00A2           ; /******************************************
 00A2           ;       I2C总线读一个字节(Mega8 as Master)
 00A2           ;                  如果读失败也返回0
 00A2           ; */
 00A2           ; unsigned char i2c_Read(unsigned char RomAddrL)       //this is a sample of reading 24c01(EEPROM)
 00A2           ;       {
 00A2                   .dbline 48
 00A2           ;          unsigned char temp;
 00A2           ;          PORTC|=0x38;
 00A2 85B3              in R24,0x15
 00A4 8863              ori R24,56

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -