📄 avr_gy-29.lis
字号:
.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 + -