?? avr_gy-27.lis
字號:
.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 + -