📄 iic接口读写.lis
字号:
.module IIC接口读写.c
.area text(rom, con, rel)
0000 .dbfile E:\xiaozhiyong2009\设计资料\项目设计\ICCAVR_mega8_C\ICCAVR_mega8_IIC接口读写\IIC接口读写.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 9
0000 ; //ICC-AVR application builder : 2009-3-12 17:05:04
0000 ; // Target : M8
0000 ; // Crystal: 8.0000Mhz
0000 ;
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 10
0000 ; PORTB = 0x00;
0000 2224 clr R2
0002 28BA out 0x18,R2
0004 .dbline 11
0004 ; DDRB = 0x00;
0004 27BA out 0x17,R2
0006 .dbline 12
0006 ; PORTC = 0x00; //m103 output only
0006 25BA out 0x15,R2
0008 .dbline 13
0008 ; DDRC = 0x00;
0008 24BA out 0x14,R2
000A .dbline 14
000A ; PORTD = 0x00;
000A 22BA out 0x12,R2
000C .dbline 15
000C ; DDRD = 0x00;
000C 21BA out 0x11,R2
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
0010 .dbfunc e init_devices _init_devices fV
.even
0010 _init_devices::
0010 .dbline -1
0010 .dbline 20
0010 ; }
0010 ;
0010 ; //call this routine to initialize all peripherals
0010 ; void init_devices(void)
0010 ; {
0010 .dbline 22
0010 ; //stop errant interrupts until set up
0010 ; CLI(); //disable all interrupts
0010 F894 cli
0012 .dbline 23
0012 ; port_init();
0012 F6DF rcall _port_init
0014 .dbline 25
0014 ;
0014 ; MCUCR = 0x00;
0014 2224 clr R2
0016 25BE out 0x35,R2
0018 .dbline 26
0018 ; GICR = 0x00;
0018 2BBE out 0x3b,R2
001A .dbline 27
001A ; TIMSK = 0x00; //timer interrupt sources
001A 29BE out 0x39,R2
001C .dbline 28
001C ; SEI(); //re-enable interrupts
001C 7894 sei
001E .dbline -2
001E L2:
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbend
0020 .dbfunc e delay_ms _delay_ms fV
0020 ; i -> R20,R21
0020 ; time -> R16,R17
.even
0020 _delay_ms::
0020 4A93 st -y,R20
0022 5A93 st -y,R21
0024 .dbline -1
0024 .dbline 66
0024 ; //all peripherals are now initialized
0024 ; }
0024 ;
0024 ; /*************************************************************************
0024 ; 用 途:iic发送接收
0024 ; Taget :mega8
0024 ; crystal :8M
0024 ; 介 绍:PC4-SDA
0024 ; PC5-SCK/SCL
0024 ; //***********************************************************************
0024 ; I2C 状态定义
0024 ; MT 主方式传输 MR 主方式接受
0024 ; ***************************/
0024 ; #define START 0x08
0024 ; #define RE_START 0x10
0024 ; #define MT_SLA_ACK 0x18
0024 ; #define MT_SLA_NOACK 0x20
0024 ; #define MT_DATA_ACK 0x28
0024 ; #define MT_DATA_NOACK 0x30
0024 ;
0024 ; #define MR_SLA_ACK 0x40
0024 ; #define MR_SLA_NOACK 0x48
0024 ; #define MR_DATA_ACK 0x50
0024 ; #define MR_DATA_NOACK 0x58
0024 ;
0024 ; #define RD_DEVICE_ADDR 0xA1 //前4位器件固定,后三位看连线,最后1位是读写指令位
0024 ; #define WD_DEVICE_ADDR 0xA0
0024 ; #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动I2C
0024 ; #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止I2C
0024 ; #define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生
0024 ; #define TestAck() (TWSR&0xf8) //观察返回状态
0024 ; #define SetAck (TWCR|=(1<<TWEA)) //做出ACK应答
0024 ; #define SetNoAck (TWCR&=~(1<<TWEA)) //做出Not Ack应答
0024 ; #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C
0024 ; #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //写数据到TWDR
0024 ; /*延时子程序*/
0024 ; void delay_ms(int time)
0024 ; {
0024 .dbline 68
0024 ; int i;
0024 ; for(;time>0;time--)
0024 0AC0 rjmp L7
0026 L4:
0026 .dbline 69
0026 ; for(i=0;i<1000;i++);
0026 4427 clr R20
0028 5527 clr R21
002A L8:
002A .dbline 69
002A L9:
002A .dbline 69
002A 4F5F subi R20,255 ; offset = 1
002C 5F4F sbci R21,255
002E .dbline 69
002E 483E cpi R20,232
0030 E3E0 ldi R30,3
0032 5E07 cpc R21,R30
0034 D4F3 brlt L8
0036 X0:
0036 L5:
0036 .dbline 68
0036 0150 subi R16,1
0038 1040 sbci R17,0
003A L7:
003A .dbline 68
003A 2224 clr R2
003C 3324 clr R3
003E 2016 cp R2,R16
0040 3106 cpc R3,R17
0042 8CF3 brlt L4
0044 X1:
0044 .dbline -2
0044 L3:
0044 .dbline 0 ; func end
0044 5991 ld R21,y+
0046 4991 ld R20,y+
0048 0895 ret
004A .dbsym r i 20 I
004A .dbsym r time 16 I
004A .dbend
004A .dbfunc e iic_init _iic_init fV
.even
004A _iic_init::
004A .dbline -1
004A .dbline 73
004A ; }
004A ; //初始化
004A ; void iic_init()
004A ; {
004A .dbline 74
004A ; TWBR= 0x20; //设置波特率
004A 80E2 ldi R24,32
004C 80B9 out 0x0,R24
004E .dbline 75
004E ; TWSR= 0x00; //设置预分频比
004E 2224 clr R2
0050 21B8 out 0x1,R2
0052 .dbline 76
0052 ; TWCR= 0x44; //使能应答,使能TWI
0052 84E4 ldi R24,68
0054 86BF out 0x36,R24
0056 .dbline 77
0056 ; DDRC|=(1<<PC4)|(1<<PC5);
0056 84B3 in R24,0x14
0058 8063 ori R24,48
005A 84BB out 0x14,R24
005C .dbline 78
005C ; PORTC|=(1<<PC4)|(1<<PC5);
005C 85B3 in R24,0x15
005E 8063 ori R24,48
0060 85BB out 0x15,R24
0062 .dbline -2
0062 L12:
0062 .dbline 0 ; func end
0062 0895 ret
0064 .dbend
0064 .dbfunc e iic_write _iic_write fc
0064 ; RegAddress -> R12
0064 ; Wdata -> R10
.even
0064 _iic_write::
0064 AA92 st -y,R10
0066 CA92 st -y,R12
0068 C22E mov R12,R18
006A A02E mov R10,R16
006C .dbline -1
006C .dbline 86
006C ; }
006C ; /*********************************************
006C ; I2C总线写一个字节
006C ; 返回0:写成功
006C ; 返回1:写失败
006C ; **********************************************/
006C ; unsigned char iic_write(unsigned char Wdata,unsigned char RegAddress)
006C ; {
006C .dbline 87
006C ; Start(); //I2C启动
006C 84EA ldi R24,164
006E 86BF out 0x36,R24
0070 .dbline 88
0070 ; Wait();
0070 L14:
0070 .dbline 88
0070 L15:
0070 .dbline 88
0070 26B6 in R2,0x36
0072 27FE sbrs R2,7
0074 FDCF rjmp L14
0076 X2:
0076 .dbline 88
0076 .dbline 88
0076 .dbline 89
0076 ; if(TestAck()!=START)
0076 81B1 in R24,0x1
0078 887F andi R24,248
007A 8830 cpi R24,8
007C 11F0 breq L17
007E X3:
007E .dbline 90
007E ; return 1; //ACK
007E 01E0 ldi R16,1
0080 2BC0 rjmp L13
0082 L17:
0082 .dbline 92
0082 ;
0082 ; Write8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式
0082 .dbline 92
0082 80EA ldi R24,160
0084 83B9 out 0x3,R24
0086 .dbline 92
0086 84E8 ldi R24,132
0088 86BF out 0x36,R24
008A .dbline 92
008A .dbline 92
008A .dbline 93
008A ; Wait();
008A L19:
008A .dbline 93
008A L20:
008A .dbline 93
008A 26B6 in R2,0x36
008C 27FE sbrs R2,7
008E FDCF rjmp L19
0090 X4:
0090 .dbline 93
0090 .dbline 93
0090 .dbline 94
0090 ; if(TestAck()!=MT_SLA_ACK)
0090 81B1 in R24,0x1
0092 887F andi R24,248
0094 8831 cpi R24,24
0096 11F0 breq L22
0098 X5:
0098 .dbline 95
0098 ; return 1; //ACK
0098 01E0 ldi R16,1
009A 1EC0 rjmp L13
009C L22:
009C .dbline 97
009C ;
009C ; Write8Bit(RegAddress); //写器件相应寄存器地址
009C .dbline 97
009C C3B8 out 0x3,R12
009E .dbline 97
009E 84E8 ldi R24,132
00A0 86BF out 0x36,R24
00A2 .dbline 97
00A2 .dbline 97
00A2 .dbline 98
00A2 ; Wait();
00A2 L24:
00A2 .dbline 98
00A2 L25:
00A2 .dbline 98
00A2 26B6 in R2,0x36
00A4 27FE sbrs R2,7
00A6 FDCF rjmp L24
00A8 X6:
00A8 .dbline 98
00A8 .dbline 98
00A8 .dbline 99
00A8 ; if(TestAck()!=MT_DATA_ACK)
00A8 81B1 in R24,0x1
00AA 887F andi R24,248
00AC 8832 cpi R24,40
00AE 11F0 breq L27
00B0 X7:
00B0 .dbline 100
00B0 ; return 1; //ACK
00B0 01E0 ldi R16,1
00B2 12C0 rjmp L13
00B4 L27:
00B4 .dbline 102
00B4 ;
00B4 ; Write8Bit(Wdata); //写数据到器件相应寄存器
00B4 .dbline 102
00B4 A3B8 out 0x3,R10
00B6 .dbline 102
00B6 84E8 ldi R24,132
00B8 86BF out 0x36,R24
00BA .dbline 102
00BA .dbline 102
00BA .dbline 103
00BA ; Wait();
00BA L29:
00BA .dbline 103
00BA L30:
00BA .dbline 103
00BA 26B6 in R2,0x36
00BC 27FE sbrs R2,7
00BE FDCF rjmp L29
00C0 X8:
00C0 .dbline 103
00C0 .dbline 103
00C0 .dbline 104
00C0 ; if(TestAck()!=MT_DATA_ACK)
00C0 81B1 in R24,0x1
00C2 887F andi R24,248
00C4 8832 cpi R24,40
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -