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

📄 avr_gy-27.lis

📁 GY-27资料源码 ADXL345 HMC5883L
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module AVR_GY-27.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\MCU_Project\MCU_AVR\AVR_GY-27\AVR_GY-27.c
 0000                   .dbfile D:\MCU_Project\MCU_AVR\AVR_GY-27\delay.h
 0000                   .dbfunc e delay_1us _delay_1us fV
                        .even
 0000           _delay_1us::
 0000                   .dbline -1
 0000                   .dbline 15
 0000           ; /*-----------------------------------------------------------------------
 0000           ; 延时函数
 0000           ; 编译器:ICC-AVR v6.31A 
 0000           ; 目标芯片 : M16
 0000           ; 时钟: 8.0000Mhz
 0000           ; -----------------------------------------------------------------------*/
 0000           ; #ifndef __delay_h
 0000           ; #define __delay_h
 0000           ; void delay_nus(unsigned int n);
 0000           ; void delay_nms(unsigned int n);
 0000           ; void delay_1us(void);
 0000           ; void delay_1ms(void) ; 
 0000           ; 
 0000           ; void delay_1us(void)                 //1us延时函数
 0000           ;   {
 0000                   .dbline 16
 0000           ;    asm("nop");
 0000 0000              nop
 0002                   .dbline 17
 0002           ;    asm("nop");
 0002 0000              nop
 0004                   .dbline 18
 0004           ;    asm("nop");
 0004 0000              nop
 0006                   .dbline 19
 0006           ;    asm("nop");
 0006 0000              nop
 0008                   .dbline 20
 0008           ;    asm("nop");
 0008 0000              nop
 000A                   .dbline -2
 000A           L1:
 000A                   .dbline 0 ; func end
 000A 0895              ret
 000C                   .dbend
 000C                   .dbfunc e delay_nus _delay_nus fV
 000C           ;              i -> R20,R21
 000C           ;              n -> R10,R11
                        .even
 000C           _delay_nus::
 000C 0E940000          xcall push_xgset300C
 0010 5801              movw R10,R16
 0012                   .dbline -1
 0012                   .dbline 24
 0012           ;   }
 0012           ; 
 0012           ; void delay_nus(unsigned int n)       //N us延时函数
 0012           ;   {
 0012                   .dbline 25
 0012           ;    unsigned int i=0;
 0012 4427              clr R20
 0014 5527              clr R21
 0016                   .dbline 26
 0016           ;    for (i=0;i<n;i++)
 0016 03C0              xjmp L6
 0018           L3:
 0018                   .dbline 27
 0018           ;    delay_1us();
 0018 F3DF              xcall _delay_1us
 001A           L4:
 001A                   .dbline 26
 001A 4F5F              subi R20,255  ; offset = 1
 001C 5F4F              sbci R21,255
 001E           L6:
 001E                   .dbline 26
 001E 4A15              cp R20,R10
 0020 5B05              cpc R21,R11
 0022 D0F3              brlo L3
 0024           X0:
 0024                   .dbline -2
 0024           L2:
 0024                   .dbline 0 ; func end
 0024 0C940000          xjmp pop_xgset300C
 0028                   .dbsym r i 20 i
 0028                   .dbsym r n 10 i
 0028                   .dbend
 0028                   .dbfunc e delay_1ms _delay_1ms fV
 0028           ;              i -> R16,R17
                        .even
 0028           _delay_1ms::
 0028                   .dbline -1
 0028                   .dbline 31
 0028           ;   }
 0028           ;   
 0028           ; void delay_1ms(void)                 //1ms延时函数
 0028           ;   {
 0028                   .dbline 33
 0028           ;    unsigned int i;
 0028           ;    for (i=0;i<500;i++);
 0028 0027              clr R16
 002A 1127              clr R17
 002C 02C0              xjmp L11
 002E           L8:
 002E                   .dbline 33
 002E           L9:
 002E                   .dbline 33
 002E 0F5F              subi R16,255  ; offset = 1
 0030 1F4F              sbci R17,255
 0032           L11:
 0032                   .dbline 33
 0032 043F              cpi R16,244
 0034 E1E0              ldi R30,1
 0036 1E07              cpc R17,R30
 0038 D0F3              brlo L8
 003A           X1:
 003A                   .dbline -2
 003A           L7:
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbsym r i 16 i
 003C                   .dbend
 003C                   .dbfunc e delay_nms _delay_nms fV
 003C           ;              i -> R20,R21
 003C           ;              n -> R10,R11
                        .even
 003C           _delay_nms::
 003C 0E940000          xcall push_xgset300C
 0040 5801              movw R10,R16
 0042                   .dbline -1
 0042                   .dbline 37
 0042           ;   }
 0042           ;   
 0042           ; void delay_nms(unsigned int n)       //N ms延时函数
 0042           ;   {
 0042                   .dbline 38
 0042           ;    unsigned int i=0;
 0042 4427              clr R20
 0044 5527              clr R21
 0046                   .dbline 39
 0046           ;    for (i=0;i<n;i++)
 0046 03C0              xjmp L16
 0048           L13:
 0048                   .dbline 40
 0048           ;    delay_1ms();
 0048 EFDF              xcall _delay_1ms
 004A           L14:
 004A                   .dbline 39
 004A 4F5F              subi R20,255  ; offset = 1
 004C 5F4F              sbci R21,255
 004E           L16:
 004E                   .dbline 39
 004E 4A15              cp R20,R10
 0050 5B05              cpc R21,R11
 0052 D0F3              brlo L13
 0054           X2:
 0054                   .dbline -2
 0054           L12:
 0054                   .dbline 0 ; func end
 0054 0C940000          xjmp pop_xgset300C
 0058                   .dbsym r i 20 i
 0058                   .dbsym r n 10 i
 0058                   .dbend
 0058                   .dbfile D:\MCU_Project\MCU_AVR\AVR_GY-27\I2C.h
 0058                   .dbfunc e I2C_Write _I2C_Write fc
 0058           ;          Wdata -> R10
 0058           ;     RegAddress -> R12
                        .even
 0058           _I2C_Write::
 0058 AA92              st -y,R10
 005A CA92              st -y,R12
 005C A22E              mov R10,R18
 005E C02E              mov R12,R16
 0060                   .dbline -1
 0060                   .dbline 41
 0060           ; #include <macros.h>
 0060           ; #include "delay.h"
 0060           ; 
 0060           ; //使用AVR内部硬件iic,引脚定义
 0060           ; //PC0->SCL  ;  PC1->SDA
 0060           ; //I2C 状态定义
 0060           ; //MT 主方式传输 MR 主方式接受
 0060           ; #define START                 0x08
 0060           ; #define RE_START              0x10
 0060           ; #define MT_SLA_ACK            0x18
 0060           ; #define MT_SLA_NOACK  0x20
 0060           ; #define MT_DATA_ACK           0x28
 0060           ; #define MT_DATA_NOACK 0x30
 0060           ; #define MR_SLA_ACK            0x40
 0060           ; #define MR_SLA_NOACK  0x48
 0060           ; #define MR_DATA_ACK           0x50
 0060           ; #define MR_DATA_NOACK 0x58    
 0060           ;                                   
 0060           ; #define RD_DEVICE_ADDR  0x3D     
 0060           ; #define WD_DEVICE_ADDR  0x3C     
 0060           ; 
 0060           ; //常用TWI操作(主模式写和读)
 0060           ; #define Start()                       (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))          //启动I2C
 0060           ; #define Stop()                        (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))          //停止I2C
 0060           ; #define Wait()                        {while(!(TWCR&(1<<TWINT)));}                            //等待中断发生
 0060           ; #define TestAck()             (TWSR&0xf8)                                                                     //观察返回状态
 0060           ; #define SetAck                        (TWCR|=(1<<TWEA))                                                       //做出ACK应答
 0060           ; #define SetNoAck              (TWCR&=~(1<<TWEA))                                                      //做出Not Ack应答
 0060           ; #define Twi()                 (TWCR=(1<<TWINT)|(1<<TWEN))                                 //启动I2C
 0060           ; #define Write8Bit(x)  {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}           //写数据到TWDR
 0060           ; 
 0060           ; unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata);
 0060           ; unsigned char I2C_Read(unsigned RegAddress);
 0060           ; 
 0060           ; /*********************************************
 0060           ; I2C总线写一个字节
 0060           ; 返回0:写成功
 0060           ; 返回1:写失败
 0060           ; **********************************************/
 0060           ; unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata)
 0060           ; {
 0060                   .dbline 42
 0060           ;         Start();                                              //I2C启动
 0060 84EA              ldi R24,164
 0062 86BF              out 0x36,R24
 0064                   .dbline 43
 0064           ;         Wait();
 0064           L18:
 0064                   .dbline 43
 0064           L19:
 0064                   .dbline 43
 0064 26B6              in R2,0x36
 0066 27FE              sbrs R2,7
 0068 FDCF              rjmp L18
 006A           X3:
 006A                   .dbline 43
 006A                   .dbline 43
 006A                   .dbline 44
 006A           ;         if(TestAck()!=START) 
 006A 81B1              in R24,0x1
 006C 887F              andi R24,248
 006E 8830              cpi R24,8
 0070 11F0              breq L21
 0072           X4:
 0072                   .dbline 45
 0072           ;               return 1;                                       //ACK
 0072 01E0              ldi R16,1
 0074 2BC0              xjmp L17
 0076           L21:
 0076                   .dbline 47
 0076           ;         
 0076           ;         Write8Bit(WD_DEVICE_ADDR);    //写I2C从器件地址和写方式
 0076                   .dbline 47
 0076 8CE3              ldi R24,60
 0078 83B9              out 0x3,R24
 007A                   .dbline 47
 007A 84E8              ldi R24,132
 007C 86BF              out 0x36,R24
 007E                   .dbline 47
 007E                   .dbline 47
 007E                   .dbline 48
 007E           ;         Wait();
 007E           L23:
 007E                   .dbline 48
 007E           L24:
 007E                   .dbline 48
 007E 26B6              in R2,0x36
 0080 27FE              sbrs R2,7
 0082 FDCF              rjmp L23
 0084           X5:
 0084                   .dbline 48
 0084                   .dbline 48
 0084                   .dbline 49
 0084           ;         if(TestAck()!=MT_SLA_ACK) 
 0084 81B1              in R24,0x1
 0086 887F              andi R24,248
 0088 8831              cpi R24,24
 008A 11F0              breq L26
 008C           X6:
 008C                   .dbline 50
 008C           ;               return 1;                                       //ACK
 008C 01E0              ldi R16,1
 008E 1EC0              xjmp L17
 0090           L26:
 0090                   .dbline 52
 0090           ;         
 0090           ;         Write8Bit(RegAddress);                //写器件相应寄存器地址
 0090                   .dbline 52
 0090 C3B8              out 0x3,R12
 0092                   .dbline 52
 0092 84E8              ldi R24,132
 0094 86BF              out 0x36,R24
 0096                   .dbline 52
 0096                   .dbline 52
 0096                   .dbline 53
 0096           ;         Wait();
 0096           L28:
 0096                   .dbline 53
 0096           L29:
 0096                   .dbline 53
 0096 26B6              in R2,0x36
 0098 27FE              sbrs R2,7
 009A FDCF              rjmp L28
 009C           X7:
 009C                   .dbline 53
 009C                   .dbline 53
 009C                   .dbline 54
 009C           ;         if(TestAck()!=MT_DATA_ACK) 
 009C 81B1              in R24,0x1
 009E 887F              andi R24,248
 00A0 8832              cpi R24,40
 00A2 11F0              breq L31
 00A4           X8:
 00A4                   .dbline 55
 00A4           ;               return 1;                                   //ACK
 00A4 01E0              ldi R16,1
 00A6 12C0              xjmp L17
 00A8           L31:
 00A8                   .dbline 57
 00A8           ;         
 00A8           ;         Write8Bit(Wdata);                             //写数据到器件相应寄存器
 00A8                   .dbline 57
 00A8 A3B8              out 0x3,R10
 00AA                   .dbline 57
 00AA 84E8              ldi R24,132
 00AC 86BF              out 0x36,R24
 00AE                   .dbline 57
 00AE                   .dbline 57
 00AE                   .dbline 58
 00AE           ;         Wait();
 00AE           L33:
 00AE                   .dbline 58
 00AE           L34:
 00AE                   .dbline 58
 00AE 26B6              in R2,0x36
 00B0 27FE              sbrs R2,7
 00B2 FDCF              rjmp L33
 00B4           X9:
 00B4                   .dbline 58
 00B4                   .dbline 58
 00B4                   .dbline 59
 00B4           ;         if(TestAck()!=MT_DATA_ACK) 
 00B4 81B1              in R24,0x1
 00B6 887F              andi R24,248
 00B8 8832              cpi R24,40
 00BA 11F0              breq L36
 00BC           X10:
 00BC                   .dbline 60
 00BC           ;               return 1;                                   //ACK        
 00BC 01E0              ldi R16,1
 00BE 06C0              xjmp L17
 00C0           L36:
 00C0                   .dbline 61
 00C0           ;         Stop();                                               //I2C停止
 00C0 84E9              ldi R24,148
 00C2 86BF              out 0x36,R24
 00C4                   .dbline 62
 00C4           ;       delay_nms(10);                          //延时  
 00C4 0AE0              ldi R16,10
 00C6 10E0              ldi R17,0

⌨️ 快捷键说明

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