📄 main.lis
字号:
00AC ; Load(SLA_W);
00AC 02E3 ldi R16,50
00AE B1DF xcall _Load
00B0 .dbline 84
00B0 ; if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
00B0 81B1 in R24,0x1
00B2 887F andi R24,248
00B4 8831 cpi R24,24
00B6 29F0 breq L25
00B8 .dbline 84
00B8 .dbline 84
00B8 01B1 in R16,0x1
00BA 087F andi R16,248
00BC BADF xcall _ERROR
00BE .dbline 84
00BE 0027 clr R16
00C0 2DC0 xjmp L22
00C2 L25:
00C2 .dbline 87
00C2 ;
00C2 ; //发送EEPROM地址,等待回应,错误检测
00C2 ; Load(addr);
00C2 062F mov R16,R22
00C4 A6DF xcall _Load
00C6 .dbline 88
00C6 ; if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
00C6 81B1 in R24,0x1
00C8 887F andi R24,248
00CA 8832 cpi R24,40
00CC 29F0 breq L27
00CE .dbline 88
00CE .dbline 88
00CE 01B1 in R16,0x1
00D0 087F andi R16,248
00D2 AFDF xcall _ERROR
00D4 .dbline 88
00D4 0027 clr R16
00D6 22C0 xjmp L22
00D8 L27:
00D8 .dbline 91
00D8 ;
00D8 ; //再次启动I2C
00D8 ; Start();
00D8 93DF xcall _Start
00DA .dbline 92
00DA ; if(STATUS!=RE_START) {ERROR(STATUS);return 0;}
00DA 81B1 in R24,0x1
00DC 887F andi R24,248
00DE 8031 cpi R24,16
00E0 29F0 breq L29
00E2 .dbline 92
00E2 .dbline 92
00E2 01B1 in R16,0x1
00E4 087F andi R16,248
00E6 A5DF xcall _ERROR
00E8 .dbline 92
00E8 0027 clr R16
00EA 18C0 xjmp L22
00EC L29:
00EC .dbline 95
00EC ;
00EC ; //发送从机地址(读),等待回应, 错误检测
00EC ; Load(SLA_R);
00EC 03E3 ldi R16,51
00EE 91DF xcall _Load
00F0 .dbline 96
00F0 ; if(STATUS!=MT_SLA_READ_ACK) {ERROR(STATUS);return 0;}
00F0 81B1 in R24,0x1
00F2 887F andi R24,248
00F4 8034 cpi R24,64
00F6 29F0 breq L31
00F8 .dbline 96
00F8 .dbline 96
00F8 01B1 in R16,0x1
00FA 087F andi R16,248
00FC 9ADF xcall _ERROR
00FE .dbline 96
00FE 0027 clr R16
0100 0DC0 xjmp L22
0102 L31:
0102 .dbline 99
0102 ;
0102 ; //读取I2C数据
0102 ; Get(p_data);
0102 8A01 movw R16,R20
0104 8DDF xcall _Get
0106 .dbline 100
0106 ; if(STATUS!=MT_READ_ACK) {ERROR(STATUS);return 0;}
0106 81B1 in R24,0x1
0108 887F andi R24,248
010A 8835 cpi R24,88
010C 29F0 breq L33
010E .dbline 100
010E .dbline 100
010E 01B1 in R16,0x1
0110 087F andi R16,248
0112 8FDF xcall _ERROR
0114 .dbline 100
0114 0027 clr R16
0116 02C0 xjmp L22
0118 L33:
0118 .dbline 103
0118 ;
0118 ; //发送Stop,结束读I2C操作。
0118 ; Stop();
0118 79DF xcall _Stop
011A .dbline 104
011A ; return 1;
011A 01E0 ldi R16,1
011C .dbline -2
011C L22:
011C 0E940000 xcall pop_gset2
0120 .dbline 0 ; func end
0120 0895 ret
0122 .dbsym r p_data 20 pc
0122 .dbsym r addr 22 c
0122 .dbend
0122 .dbfunc e Init_Io _Init_Io fV
.even
0122 _Init_Io::
0122 .dbline -1
0122 .dbline 110
0122 ;
0122 ;
0122 ;
0122 ; }/**/
0122 ; void Init_Io(void)
0122 ; {
0122 .dbline 111
0122 ; DDRC&=~((1<<PC0)&(1<<PC0)&(1<<PC2));
0122 84B3 in R24,0x14
0124 8F7F andi R24,255
0126 84BB out 0x14,R24
0128 .dbline 112
0128 ; PORTC|= (1<<PC0)|(1<<PC0)|(1<<PC2);
0128 85B3 in R24,0x15
012A 8560 ori R24,5
012C 85BB out 0x15,R24
012E .dbline 115
012E ;
012E ; //TWI接口初始化,从器件模式
012E ; TWAR=TWI_ADDRESS | (1<<TWGCE);
012E 83E3 ldi R24,51
0130 82B9 out 0x2,R24
0132 .dbline 116
0132 ; TWCR=(1<<TWEA) | (1<<TWEN)|(1<<TWIE);
0132 85E4 ldi R24,69
0134 86BF out 0x36,R24
0136 .dbline 117
0136 ; asm("SEI");
0136 7894 SEI
0138 .dbline -2
0138 .dbline 118
0138 ; }
0138 L35:
0138 .dbline 0 ; func end
0138 0895 ret
013A .dbend
013A .dbfunc e main _main fV
013A ; temp2 -> R20
013A ; temp1 -> R22
.even
013A _main::
013A .dbline -1
013A .dbline 120
013A ; void main()
013A ; {
013A .dbline 122
013A ; uchar temp1,temp2;
013A ; Init_Io();
013A F3DF xcall _Init_Io
013C .dbline 123
013C ; uart_init();
013C 0E940000 xcall _uart_init
0140 0DC0 xjmp L38
0142 L37:
0142 .dbline 126
0142 ; // puts("串口正常工作");
0142 ; while(1)
0142 ; {
0142 .dbline 127
0142 ; TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN); //启动一次接收
0142 84EC ldi R24,196
0144 86BF out 0x36,R24
0146 L40:
0146 .dbline 128
0146 L41:
0146 .dbline 128
0146 ; while((TWCR&(1<<TWINT))==0); //等待有数据被接收
0146 26B6 in R2,0x36
0148 27FE sbrs R2,7
014A FDCF rjmp L40
014C .dbline 130
014C ; //Delay_nms(100);
014C ; temp1=STATUS;
014C 61B1 in R22,0x1
014E 687F andi R22,248
0150 .dbline 132
0150 ;
0150 ; temp2=TWDR;
0150 43B1 in R20,0x3
0152 .dbline 135
0152 ; //UDR = temp2;
0152 ; //putchar(temp1);
0152 ; if(temp1==0x90)
0152 6039 cpi R22,144
0154 19F4 brne L43
0156 .dbline 136
0156 ; {
0156 .dbline 138
0156 ; // puts("接受到:");
0156 ; putchar(temp2);
0156 042F mov R16,R20
0158 0E940000 xcall _putchar
015C .dbline 139
015C ; }
015C L43:
015C .dbline 142
015C L38:
015C .dbline 125
015C F2CF xjmp L37
015E X0:
015E .dbline -2
015E .dbline 144
015E ;
015E ;
015E ; }
015E ;
015E ; }
015E L36:
015E .dbline 0 ; func end
015E 0895 ret
0160 .dbsym r temp2 20 c
0160 .dbsym r temp1 22 c
0160 .dbend
.area vector(rom, abs)
.org 68
0044 0C94B000 jmp _TWI_ISR
.area text(rom, con, rel)
0160 .dbfile E:\atmega16子函数\TWI_slaver0\main.c
0160 .dbfunc e TWI_ISR _TWI_ISR fV
0160 ; temp2 -> R16
0160 ; temp1 -> R16
.even
0160 _TWI_ISR::
0160 0A93 st -y,R16
0162 8A93 st -y,R24
0164 0FB7 in R16,0x3f
0166 0A93 st -y,R16
0168 .dbline -1
0168 .dbline 147
0168 ; #pragma interrupt_handler TWI_ISR:18
0168 ; void TWI_ISR(void)
0168 ; {
0168 .dbline 149
0168 ; uchar temp1,temp2;
0168 ; temp1=STATUS;
0168 01B1 in R16,0x1
016A 087F andi R16,248
016C .dbline 150
016C ; temp2=TWDR;
016C 03B1 in R16,0x3
016E .dbline 156
016E ; /* if(temp1==0x90)
016E ; {
016E ; puts("接受到:");
016E ; putchar(temp2);
016E ; }*/
016E ; TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN)|(1<<TWIE); //启动一次接收
016E 85EC ldi R24,197
0170 86BF out 0x36,R24
0172 .dbline -2
0172 .dbline 158
0172 ;
0172 ; }
0172 L45:
0172 0991 ld R16,y+
0174 0FBF out 0x3f,R16
0176 8991 ld R24,y+
0178 0991 ld R16,y+
017A .dbline 0 ; func end
017A 1895 reti
017C .dbsym r temp2 16 c
017C .dbsym r temp1 16 c
017C .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -