⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lis

📁 atmega16 iic(twi)主从机通信 测试通过
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 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 + -