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

📄 twi_master_polling.lis

📁 UART_TO_TWI程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module twi_master_polling.c
                        .area text(rom, con, rel)
 0000                   .dbfile H:\程序库\twi_master_polling.c
 0000                   .dbfunc e twi_init _twi_init fV
                        .even
 0000           _twi_init::
 0000                   .dbline -1
 0000                   .dbline 10
 0000           ; #include <iom8v.h>
 0000           ; #include <macros.h>
 0000           ; #include "delay.h"
 0000           ; #include "twi_master_polling.h"
 0000           ; 
 0000           ; unsigned char Write_Succsee_Flag;
 0000           ; unsigned char Read_Succsee_Flag;
 0000           ; 
 0000           ; void twi_init(void)
 0000           ; {
 0000                   .dbline 11
 0000           ;  Write_Succsee_Flag = false;
 0000 2224              clr R2
 0002 20920100          sts _Write_Succsee_Flag,R2
 0006                   .dbline 12
 0006           ;  Read_Succsee_Flag  = false;
 0006 20920000          sts _Read_Succsee_Flag,R2
 000A                   .dbline 14
 000A           ;  
 000A           ;  TWCR= 0X00; //disable twi
 000A 26BE              out 0x36,R2
 000C                   .dbline 15
 000C           ;  TWBR= 0x20; //set bit rate
 000C 80E2              ldi R24,32
 000E 80B9              out 0x0,R24
 0010                   .dbline 16
 0010           ;  TWSR= 0x00; //set prescale
 0010 21B8              out 0x1,R2
 0012                   .dbline 18
 0012           ;  //TWAR= DEVICE_ADR; //set slave address 本身作为主控
 0012           ;  TWCR= 0x44; //enable twi 置位TWEA,TWEN TWIE
 0012 84E4              ldi R24,68
 0014 86BF              out 0x36,R24
 0016                   .dbline -2
 0016           L1:
 0016                   .dbline 0 ; func end
 0016 0895              ret
 0018                   .dbend
 0018                   .dbfunc e twi_write_byte _twi_write_byte fc
 0018           ;          Wdata -> y+4
 0018           ;     RamAddress -> R20
 0018           ;     device_adr -> R22
                        .even
 0018           _twi_write_byte::
 0018 00D0              rcall push_gset2
 001A 422F              mov R20,R18
 001C 602F              mov R22,R16
 001E                   .dbline -1
 001E                   .dbline 26
 001E           ; }
 001E           ; /******************************************
 001E           ;                 I2C总线写一个字节
 001E           ;                           返回0:       写成功
 001E           ;                               返回错误状态字:写失败
 001E           ; *******************************************/
 001E           ; unsigned char twi_write_byte(unsigned char device_adr,unsigned char RamAddress,unsigned char Wdata) 
 001E           ; {
 001E                   .dbline 28
 001E 84EA              ldi R24,164
 0020 86BF              out 0x36,R24
 0022                   .dbline 28
 0022           L3:
 0022                   .dbline 28
 0022           L4:
 0022                   .dbline 28
 0022           ;         //I2C启动
 0022           ;         Start();                      Wait(); //等TWINT置位
 0022 26B6              in R2,0x36
 0024 27FE              sbrs R2,7
 0026 FDCF              rjmp L3
 0028                   .dbline 28
 0028                   .dbline 28
 0028                   .dbline 29
 0028           ;         if(TestAck()!=START)         {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
 0028 81B1              in R24,0x1
 002A 887F              andi R24,248
 002C 8830              cpi R24,8
 002E 41F0              breq L6
 0030                   .dbline 29
 0030                   .dbline 29
 0030 2224              clr R2
 0032 20920100          sts _Write_Succsee_Flag,R2
 0036                   .dbline 29
 0036 84E9              ldi R24,148
 0038 86BF              out 0x36,R24
 003A                   .dbline 29
 003A 01B1              in R16,0x1
 003C 087F              andi R16,248
 003E 40C0              rjmp L2
 0040           L6:
 0040                   .dbline 31
 0040                   .dbline 31
 0040 63B9              out 0x3,R22
 0042                   .dbline 31
 0042 84E8              ldi R24,132
 0044 86BF              out 0x36,R24
 0046                   .dbline 31
 0046                   .dbline 31
 0046                   .dbline 31
 0046           L8:
 0046                   .dbline 31
 0046           L9:
 0046                   .dbline 31
 0046           ;         //写I2C从器件地址和写方式
 0046           ;         Write8Bit(device_adr);        Wait();
 0046 26B6              in R2,0x36
 0048 27FE              sbrs R2,7
 004A FDCF              rjmp L8
 004C                   .dbline 31
 004C                   .dbline 31
 004C                   .dbline 32
 004C           ;         if(TestAck()!=MT_SLA_ACK)    {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
 004C 81B1              in R24,0x1
 004E 887F              andi R24,248
 0050 8831              cpi R24,24
 0052 41F0              breq L11
 0054                   .dbline 32
 0054                   .dbline 32
 0054 2224              clr R2
 0056 20920100          sts _Write_Succsee_Flag,R2
 005A                   .dbline 32
 005A 84E9              ldi R24,148
 005C 86BF              out 0x36,R24
 005E                   .dbline 32
 005E 01B1              in R16,0x1
 0060 087F              andi R16,248
 0062 2EC0              rjmp L2
 0064           L11:
 0064                   .dbline 34
 0064                   .dbline 34
 0064 43B9              out 0x3,R20
 0066                   .dbline 34
 0066 84E8              ldi R24,132
 0068 86BF              out 0x36,R24
 006A                   .dbline 34
 006A                   .dbline 34
 006A                   .dbline 34
 006A           L13:
 006A                   .dbline 34
 006A           L14:
 006A                   .dbline 34
 006A           ;         //写RAM地址
 006A           ;         Write8Bit(RamAddress);        Wait();
 006A 26B6              in R2,0x36
 006C 27FE              sbrs R2,7
 006E FDCF              rjmp L13
 0070                   .dbline 34
 0070                   .dbline 34
 0070                   .dbline 35
 0070           ;         if(TestAck()!=MT_DATA_ACK)   {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK
 0070 81B1              in R24,0x1
 0072 887F              andi R24,248
 0074 8832              cpi R24,40
 0076 41F0              breq L16
 0078                   .dbline 35
 0078                   .dbline 35
 0078 2224              clr R2
 007A 20920100          sts _Write_Succsee_Flag,R2
 007E                   .dbline 35
 007E 84E9              ldi R24,148
 0080 86BF              out 0x36,R24
 0082                   .dbline 35
 0082 01B1              in R16,0x1
 0084 087F              andi R16,248
 0086 1CC0              rjmp L2
 0088           L16:
 0088                   .dbline 37
 0088                   .dbline 37
 0088 0C80              ldd R0,y+4
 008A 03B8              out 0x3,R0
 008C                   .dbline 37
 008C 84E8              ldi R24,132
 008E 86BF              out 0x36,R24
 0090                   .dbline 37
 0090                   .dbline 37
 0090                   .dbline 37
 0090           L18:
 0090                   .dbline 37
 0090           L19:
 0090                   .dbline 37
 0090           ;         //写数据
 0090           ;         Write8Bit(Wdata);             Wait();
 0090 26B6              in R2,0x36
 0092 27FE              sbrs R2,7
 0094 FDCF              rjmp L18
 0096                   .dbline 37
 0096                   .dbline 37
 0096                   .dbline 38
 0096           ;         if(TestAck()!=MT_DATA_ACK)   {Write_Succsee_Flag = false;Stop();return TestAck();}//ACK       
 0096 81B1              in R24,0x1
 0098 887F              andi R24,248
 009A 8832              cpi R24,40
 009C 41F0              breq L21
 009E                   .dbline 38
 009E                   .dbline 38
 009E 2224              clr R2
 00A0 20920100          sts _Write_Succsee_Flag,R2
 00A4                   .dbline 38
 00A4 84E9              ldi R24,148
 00A6 86BF              out 0x36,R24
 00A8                   .dbline 38
 00A8 01B1              in R16,0x1
 00AA 087F              andi R16,248
 00AC 09C0              rjmp L2
 00AE           L21:
 00AE                   .dbline 40
 00AE           ;         //I2C停止
 00AE           ;         Stop();
 00AE 84E9              ldi R24,148
 00B0 86BF              out 0x36,R24
 00B2                   .dbline 41
 00B2           ;         delay_ms(10);//延时等写完
 00B2 0AE0              ldi R16,10
 00B4 10E0              ldi R17,0
 00B6 00D0              rcall _delay_ms
 00B8                   .dbline 42
 00B8           ;         Write_Succsee_Flag = true;
 00B8 81E0              ldi R24,1
 00BA 80930100          sts _Write_Succsee_Flag,R24
 00BE                   .dbline 43
 00BE           ;         return Write_Succsee_Flag;
 00BE 082F              mov R16,R24
 00C0                   .dbline -2
 00C0           L2:
 00C0 00D0              rcall pop_gset2
 00C2                   .dbline 0 ; func end
 00C2 0895              ret
 00C4                   .dbsym l Wdata 4 c
 00C4                   .dbsym r RamAddress 20 c
 00C4                   .dbsym r device_adr 22 c
 00C4                   .dbend
 00C4                   .dbfunc e twi_read_byte _twi_read_byte fc
 00C4           ;           temp -> R20
 00C4           ;     RamAddress -> R18
 00C4           ;     device_adr -> R16
                        .even
 00C4           _twi_read_byte::
 00C4 00D0              rcall push_gset1
 00C6                   .dbline -1
 00C6                   .dbline 50
 00C6           ; }
 00C6           ; /******************************************
 00C6           ;                I2C总线读一个字节
 00C6           ;                          如果读失败也返回0
 00C6           ; *******************************************/

⌨️ 快捷键说明

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