📄 twi.lst
字号:
__start:
__text_start:
0031 E5CF LDI R28,0x5F
0032 E0D4 LDI R29,4
0033 BFCD OUT 0x3D,R28
0034 BFDE OUT 0x3E,R29
0035 51C0 SUBI R28,0x10
0036 40D0 SBCI R29,0
0037 EA0A LDI R16,0xAA
0038 8308 STD Y+0,R16
0039 2400 CLR R0
003A E6E2 LDI R30,0x62
003B E0F0 LDI R31,0
003C E010 LDI R17,0
003D 36E3 CPI R30,0x63
003E 07F1 CPC R31,R17
003F F011 BEQ 0x0042
0040 9201 ST R0,Z+
0041 CFFB RJMP 0x003D
0042 8300 STD Z+0,R16
0043 E6E0 LDI R30,0x60
0044 E0F0 LDI R31,0
0045 E6A0 LDI R26,0x60
0046 E0B0 LDI R27,0
0047 E010 LDI R17,0
0048 36E2 CPI R30,0x62
0049 07F1 CPC R31,R17
004A F021 BEQ 0x004F
004B 95C8 LPM
004C 9631 ADIW R30,1
004D 920D ST R0,X+
004E CFF9 RJMP 0x0048
004F 940E015B CALL _main
_exit:
0051 CFFF RJMP _exit
FILE: D:\programe\AVR实验\I2C\TWI-at2401\ac15-3.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) //-----------------------------------------------
(0004) #define uchar unsigned char
(0005) #define uint unsigned int
(0006)
(0007) //TWI状态定义
(0008) //MT 主方式传输 MR 主方式接收
(0009) #define START 0x08
(0010) #define RE_START 0x10
(0011) #define MT_SLA_ACK 0x18
(0012) #define MT_SLA_NOACK 0x20
(0013) #define MT_DATA_ACK 0x28
(0014) #define MT_DATA_NOACK 0x30
(0015) #define MR_SLA_ACK 0x40
(0016) #define MR_SLA_NOACK 0x48
(0017) #define MR_DATA_ACK 0x50
(0018) #define MR_DATA_NOACK 0x58
(0019)
(0020)
(0021) #define rd_device_add 0xa1
(0022) #define wr_device_add 0xa0
(0023)
(0024) #define DS12_CONTROL_PORT PORTB
(0025) #define CS PB3
(0026) #define CS_ON() ( DS12_CONTROL_PORT &= ~(1<<CS) )
(0027) #define CS_OFF() ( DS12_CONTROL_PORT |= (1<<CS) )
(0028)
(0029) //常用TWI操作(主模式写和主模式读)
(0030) #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0031) #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0032) #define Wait() {while(!(TWCR&(1<<TWINT)));}
(0033) #define TestAck() (TWSR&0xf8)
(0034) #define SetAck() (TWCR|=(1<<TWEA))
(0035) #define SetNoAck() (TWCR&=~(1<<TWEA))
(0036) #define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
(0037) #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
(0038)
(0039) #define xtal 8
(0040)
(0041) flash unsigned char dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
(0042) flash unsigned char position[]={0x10,0x20};
(0043) unsigned char dis_buff[2]={0,0},posit;
(0044)
(0045) //========函数声明=========
(0046)
(0047) void port_init(void);
(0048) void delay_ms(unsigned int time);
(0049) void delay_us(int time);
(0050) //=======================
(0051)
(0052) void Delay_2us()
(0053) {
(0054) NOP();NOP();NOP();
_Delay_2us:
0052 0000 NOP
0053 0000 NOP
0054 0000 NOP
0055 9508 RET
__delay_us:
xus --> R20
0056 940E01A0 CALL push_gset1
0058 01A8 MOVW R20,R16
(0055) }
(0056)
(0057) void _delay_us(unsigned int xus)
(0058) {
0059 C001 RJMP 0x005B
(0059) while (xus--)
(0060) Delay_2us();
005A DFF7 RCALL _Delay_2us
005B 011A MOVW R2,R20
005C 5041 SUBI R20,1
005D 4050 SBCI R21,0
005E 2022 TST R2
005F F7D1 BNE 0x005A
0060 2033 TST R3
0061 F7C1 BNE 0x005A
0062 940E01A3 CALL pop_gset1
0064 9508 RET
_delay_ms:
i --> R20
j --> R22
xms --> R16
0065 940E019E CALL push_gset2
(0061) }
(0062)
(0063) void delay_ms(unsigned int xms) //crystal=8MHz
(0064) {
(0065) unsigned int i,j; //variable:declare Word
(0066) for(i=0; i<xms; i++)
0067 2744 CLR R20
0068 2755 CLR R21
0069 C014 RJMP 0x007E
(0067) for(j=0; j<498;j++)
006A 2766 CLR R22
006B 2777 CLR R23
006C C00B RJMP 0x0078
(0068) {
(0069) NOP();NOP();NOP();NOP();
006D 0000 NOP
006E 0000 NOP
006F 0000 NOP
0070 0000 NOP
(0070) NOP();NOP();NOP();NOP();NOP();
0071 0000 NOP
0072 0000 NOP
0073 0000 NOP
0074 0000 NOP
0075 0000 NOP
0076 5F6F SUBI R22,0xFF
0077 4F7F SBCI R23,0xFF
0078 3F62 CPI R22,0xF2
0079 E0E1 LDI R30,1
007A 077E CPC R23,R30
007B F388 BCS 0x006D
007C 5F4F SUBI R20,0xFF
007D 4F5F SBCI R21,0xFF
007E 1740 CP R20,R16
007F 0751 CPC R21,R17
0080 F348 BCS 0x006A
0081 940E0195 CALL pop_gset2
0083 9508 RET
_display:
adc1 --> R20
0084 940E01A0 CALL push_gset1
0086 2F40 MOV R20,R16
(0071)
(0072) }
(0073) }
(0074)
(0075) void display(unsigned char adc1) // 2 位LED 数码管动态扫描函数
(0076) {
(0077) dis_buff[1]=adc1 /10;
0087 E01A LDI R17,0xA
0088 2F04 MOV R16,R20
0089 940E017F CALL div8u
008B 93000061 STS dis_buff+1,R16
(0078)
(0079) dis_buff[0]=adc1 %10;
008D E01A LDI R17,0xA
008E 2F04 MOV R16,R20
008F 940E017D CALL mod8u
0091 93000060 STS dis_buff,R16
(0080)
(0081) //PORTB = 0x00;
(0082) for(posit=0; posit<2;posit++)
0093 2422 CLR R2
0094 92200062 STS posit,R2
0096 C020 RJMP 0x00B7
(0083) {
(0084)
(0085) PORTD = dis_7[dis_buff[posit]];
0097 E680 LDI R24,0x60
0098 E090 LDI R25,0
0099 91E00062 LDS R30,posit
009B 27FF CLR R31
009C 0FE8 ADD R30,R24
009D 1FF9 ADC R31,R25
009E 81E0 LDD R30,Z+0
009F 27FF CLR R31
00A0 E584 LDI R24,0x54
00A1 E090 LDI R25,0
00A2 0FE8 ADD R30,R24
00A3 1FF9 ADC R31,R25
00A4 91E4 LPM R30,0(Z)
00A5 BBE2 OUT 0x12,R30
(0086) PORTB = position[posit];
00A6 E58E LDI R24,0x5E
00A7 E090 LDI R25,0
00A8 91E00062 LDS R30,posit
00AA 27FF CLR R31
00AB 0FE8 ADD R30,R24
00AC 1FF9 ADC R31,R25
00AD 91E4 LPM R30,0(Z)
00AE BBE8 OUT 0x18,R30
(0087)
(0088) _delay_us(100);
00AF E604 LDI R16,0x64
00B0 E010 LDI R17,0
00B1 DFA4 RCALL __delay_us
00B2 91800062 LDS R24,posit
00B4 5F8F SUBI R24,0xFF
00B5 93800062 STS posit,R24
00B7 91800062 LDS R24,posit
00B9 3082 CPI R24,2
00BA F2E0 BCS 0x0097
00BB 940E01A3 CALL pop_gset1
00BD 9508 RET
(0089) //PORTB &= ~position[posit];
(0090)
(0091) }
(0092) }
(0093)
(0094) /********************端口初始化******************/
(0095) void port_init(void)
(0096) {
(0097) //PORTA = 0x00;
(0098) //DDRA = 0xFF;
(0099) // PORTB = 0x00;
(0100) DDRB = 0xFF;
_port_init:
00BE EF8F LDI R24,0xFF
00BF BB87 OUT 0x17,R24
(0101) // PORTC = 0x00;
(0102) DDRC = 0x30;
00C0 E380 LDI R24,0x30
00C1 BB84 OUT 0x14,R24
(0103) // PORTD = 0xFF;
(0104) DDRD = 0xFF;
00C2 EF8F LDI R24,0xFF
00C3 BB81 OUT 0x11,R24
00C4 9508 RET
_i2c_Read:
temp --> R20
RomAddress --> R16
00C5 940E01A0 CALL push_gset1
(0105) }
(0106)
(0107)
(0108) /******************************************
(0109) I2C总线读一个字节
(0110) 如果读失败返回0
(0111) *******************************************/
(0112) unsigned char i2c_Read(unsigned char RomAddress)
(0113) {
(0114) unsigned char temp;
(0115) Start();
00C7 EA84 LDI R24,0xA4
00C8 BF86 OUT 0x36,R24
(0116) Wait();
00C9 B626 IN R2,0x36
00CA FE27 SBRS R2,7
00CB CFFD RJMP 0x00C9
(0117) if (TestAck()!=START) return 0;
00CC B181 IN R24,0x01
00CD 7F88 ANDI R24,0xF8
00CE 3088 CPI R24,0x8
00CF F011 BEQ 0x00D2
00D0 2700 CLR R16
00D1 C040 RJMP 0x0112
(0118) Write8Bit(wr_device_add);
00D2 EA80 LDI R24,0xA0
00D3 B983 OUT 0x03,R24
00D4 E884 LDI R24,0x84
00D5 BF86 OUT 0x36,R24
(0119) Wait();
00D6 B626 IN R2,0x36
00D7 FE27 SBRS R2,7
00D8 CFFD RJMP 0x00D6
(0120) if (TestAck()!=MT_SLA_ACK) return 0;
00D9 B181 IN R24,0x01
00DA 7F88 ANDI R24,0xF8
00DB 3188 CPI R24,0x18
00DC F011 BEQ 0x00DF
00DD 2700 CLR R16
00DE C033 RJMP 0x0112
(0121) Write8Bit(RomAddress);
00DF B903 OUT 0x03,R16
00E0 E884 LDI R24,0x84
00E1 BF86 OUT 0x36,R24
(0122) Wait();
00E2 B626 IN R2,0x36
00E3 FE27 SBRS R2,7
00E4 CFFD RJMP 0x00E2
(0123) if (TestAck()!=MT_DATA_ACK) return 0;
00E5 B181 IN R24,0x01
00E6 7F88 ANDI R24,0xF8
00E7 3288 CPI R24,0x28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -