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

📄 avr_gy-29.lis

📁 GY-27资料源码 ADXL345 HMC5883L
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .module AVR_GY-29.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\MCU_Project\MCU_AVR\AVR_GY-29\AVR_GY-29.c
 0000                   .dbfile D:\MCU_Project\MCU_AVR\AVR_GY-29\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-29\I2C.h
 0058                   .dbfunc e I2C_Write _I2C_Write fc
 0058           ;          Wdata -> R18
 0058           ;     RegAddress -> R16
                        .even
 0058           _I2C_Write::
 0058                   .dbline -1
 0058                   .dbline 41
 0058           ; #include <macros.h>
 0058           ; #include "delay.h"
 0058           ; 
 0058           ; //使用AVR内部硬件iic,引脚定义
 0058           ; //PC0->SCL  ;  PC1->SDA
 0058           ; //I2C 状态定义
 0058           ; //MT 主方式传输 MR 主方式接受
 0058           ; #define START                 0x08
 0058           ; #define RE_START              0x10
 0058           ; #define MT_SLA_ACK            0x18
 0058           ; #define MT_SLA_NOACK  0x20
 0058           ; #define MT_DATA_ACK           0x28
 0058           ; #define MT_DATA_NOACK 0x30
 0058           ; #define MR_SLA_ACK            0x40
 0058           ; #define MR_SLA_NOACK  0x48
 0058           ; #define MR_DATA_ACK           0x50
 0058           ; #define MR_DATA_NOACK 0x58    
 0058           ;                                   
 0058           ; #define RD_DEVICE_ADDR  0xA7     //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
 0058           ; #define WD_DEVICE_ADDR  0xA6     //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
 0058           ; 
 0058           ; //常用TWI操作(主模式写和读)
 0058           ; #define Start()                       (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))          //启动I2C
 0058           ; #define Stop()                        (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))          //停止I2C
 0058           ; #define Wait()                        {while(!(TWCR&(1<<TWINT)));}                            //等待中断发生
 0058           ; #define TestAck()             (TWSR&0xf8)                                                                     //观察返回状态
 0058           ; #define SetAck                        (TWCR|=(1<<TWEA))                                                       //做出ACK应答
 0058           ; #define SetNoAck              (TWCR&=~(1<<TWEA))                                                      //做出Not Ack应答
 0058           ; #define Twi()                 (TWCR=(1<<TWINT)|(1<<TWEN))                                 //启动I2C
 0058           ; #define Write8Bit(x)  {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}           //写数据到TWDR
 0058           ; 
 0058           ; unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata);
 0058           ; unsigned char I2C_Read(unsigned RegAddress);
 0058           ; 
 0058           ; /*********************************************
 0058           ; I2C总线写一个字节
 0058           ; 返回0:写成功
 0058           ; 返回1:写失败
 0058           ; **********************************************/
 0058           ; unsigned char I2C_Write(unsigned char RegAddress,unsigned char Wdata)
 0058           ; {
 0058                   .dbline 42
 0058           ;         Start();                                              //I2C启动
 0058 84EA              ldi R24,164
 005A 86BF              out 0x36,R24
 005C                   .dbline 43
 005C           ;         Wait();
 005C           L18:
 005C                   .dbline 43
 005C           L19:
 005C                   .dbline 43
 005C 26B6              in R2,0x36
 005E 27FE              sbrs R2,7
 0060 FDCF              rjmp L18
 0062           X3:
 0062                   .dbline 43
 0062                   .dbline 43
 0062                   .dbline 44
 0062           ;         if(TestAck()!=START) 
 0062 81B1              in R24,0x1
 0064 887F              andi R24,248
 0066 8830              cpi R24,8
 0068 11F0              breq L21
 006A           X4:
 006A                   .dbline 45
 006A           ;               return 1;                                       //ACK
 006A 01E0              ldi R16,1
 006C 28C0              xjmp L17
 006E           L21:
 006E                   .dbline 47
 006E           ;         
 006E           ;         Write8Bit(WD_DEVICE_ADDR);    //写I2C从器件地址和写方式
 006E                   .dbline 47
 006E 86EA              ldi R24,166
 0070 83B9              out 0x3,R24
 0072                   .dbline 47
 0072 84E8              ldi R24,132
 0074 86BF              out 0x36,R24
 0076                   .dbline 47
 0076                   .dbline 47
 0076                   .dbline 48
 0076           ;         Wait();
 0076           L23:
 0076                   .dbline 48
 0076           L24:
 0076                   .dbline 48
 0076 26B6              in R2,0x36
 0078 27FE              sbrs R2,7
 007A FDCF              rjmp L23
 007C           X5:
 007C                   .dbline 48
 007C                   .dbline 48
 007C                   .dbline 49
 007C           ;         if(TestAck()!=MT_SLA_ACK) 
 007C 81B1              in R24,0x1
 007E 887F              andi R24,248
 0080 8831              cpi R24,24
 0082 11F0              breq L26
 0084           X6:
 0084                   .dbline 50
 0084           ;               return 1;                                       //ACK
 0084 01E0              ldi R16,1
 0086 1BC0              xjmp L17
 0088           L26:
 0088                   .dbline 52
 0088           ;         
 0088           ;         Write8Bit(RegAddress);                //写器件相应寄存器地址
 0088                   .dbline 52
 0088 03B9              out 0x3,R16
 008A                   .dbline 52
 008A 84E8              ldi R24,132
 008C 86BF              out 0x36,R24
 008E                   .dbline 52
 008E                   .dbline 52
 008E                   .dbline 53
 008E           ;         Wait();
 008E           L28:
 008E                   .dbline 53
 008E           L29:
 008E                   .dbline 53
 008E 26B6              in R2,0x36
 0090 27FE              sbrs R2,7
 0092 FDCF              rjmp L28
 0094           X7:
 0094                   .dbline 53
 0094                   .dbline 53
 0094                   .dbline 54
 0094           ;         if(TestAck()!=MT_DATA_ACK) 
 0094 81B1              in R24,0x1
 0096 887F              andi R24,248
 0098 8832              cpi R24,40
 009A 11F0              breq L31
 009C           X8:
 009C                   .dbline 55
 009C           ;               return 1;                                   //ACK
 009C 01E0              ldi R16,1
 009E 0FC0              xjmp L17
 00A0           L31:
 00A0                   .dbline 57
 00A0           ;         
 00A0           ;         Write8Bit(Wdata);                             //写数据到器件相应寄存器
 00A0                   .dbline 57
 00A0 23B9              out 0x3,R18
 00A2                   .dbline 57
 00A2 84E8              ldi R24,132
 00A4 86BF              out 0x36,R24
 00A6                   .dbline 57
 00A6                   .dbline 57
 00A6                   .dbline 58
 00A6           ;         Wait();
 00A6           L33:
 00A6                   .dbline 58
 00A6           L34:
 00A6                   .dbline 58
 00A6 26B6              in R2,0x36

⌨️ 快捷键说明

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