📄 iic.lis
字号:
.module iic.c
.area vector(rom, abs)
.org 34
0022 00C0 rjmp _TWI_ISR
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\Rooger\桌面\GSM_PHONE\iic.c
0000 .dbfunc e TWI_ISR _TWI_ISR fV
.even
0000 _TWI_ISR::
0000 2A92 st -y,R2
0002 3A92 st -y,R3
0004 0A93 st -y,R16
0006 1A93 st -y,R17
0008 8A93 st -y,R24
000A 9A93 st -y,R25
000C EA93 st -y,R30
000E FA93 st -y,R31
0010 2FB6 in R2,0x3f
0012 2A92 st -y,R2
0014 .dbline -1
0014 .dbline 22
0014 ; /************************************iic.c**************************
0014 ; *iic.c负责同上层软件之间的通讯
0014 ; *iic在NPI中处于两种工作方式 从机接收模式以及从机发送模式
0014 ; *从机接收模式 在通讯过程中 应答主机请求 并将数据保存到相应数组以便主程序判断
0014 ; *从机发送模式 通过pwr拉高请求主机接收数据 然后根据主机应答发送数据
0014 ; ********************************************************************/
0014 ; #include <iom8v.h>
0014 ; #include <macros.h>
0014 ; #include "iic.h"
0014 ; #include "define.h"
0014 ;
0014 ; extern uchar buf[15]; //pc同i2c交互数据存放处
0014 ; extern uchar cmd;//i2c数据缓存
0014 ; extern uchar cmd_num;//i2c数据计数
0014 ; extern uchar flag; //
0014 ; extern uchar *data;
0014 ; extern uchar j;
0014 ; extern uchar req_flag,start_flag,vision_flag,cmd_flag;
0014 ; //*****************************************************************************/
0014 ; #pragma interrupt_handler TWI_ISR:18
0014 ; void TWI_ISR(void)
0014 ; {
0014 .dbline 24
0014 ; //TWI被控接收器模式中断处理
0014 ; switch (TestAck())
0014 01B1 in R16,0x1
0016 1127 clr R17
0018 087F andi R16,248
001A 1070 andi R17,0
001C 0039 cpi R16,144
001E E0E0 ldi R30,0
0020 1E07 cpc R17,R30
0022 09F4 brne X1
0024 02C1 rjmp L27
0026 X1:
0026 80E9 ldi R24,144
0028 90E0 ldi R25,0
002A 8017 cp R24,R16
002C 9107 cpc R25,R17
002E 0CF4 brge X2
0030 30C0 rjmp L52
0032 X2:
0032 L51:
0032 0037 cpi R16,112
0034 E0E0 ldi R30,0
0036 1E07 cpc R17,R30
0038 09F4 brne X3
003A 67C0 rjmp L7
003C X3:
003C 80E7 ldi R24,112
003E 90E0 ldi R25,0
0040 8017 cp R24,R16
0042 9107 cpc R25,R17
0044 84F0 brlt L54
0046 L53:
0046 0036 cpi R16,96
0048 E0E0 ldi R30,0
004A 1E07 cpc R17,R30
004C 09F4 brne X4
004E 57C0 rjmp L5
0050 X4:
0050 0036 cpi R16,96
0052 E0E0 ldi R30,0
0054 1E07 cpc R17,R30
0056 0CF4 brge X5
0058 BDC1 rjmp L2
005A X5:
005A L55:
005A 0836 cpi R16,104
005C E0E0 ldi R30,0
005E 1E07 cpc R17,R30
0060 09F4 brne X6
0062 50C0 rjmp L6
0064 X6:
0064 B7C1 rjmp L2
0066 L54:
0066 0038 cpi R16,128
0068 E0E0 ldi R30,0
006A 1E07 cpc R17,R30
006C 09F4 brne X7
006E 53C0 rjmp L9
0070 X7:
0070 80E8 ldi R24,128
0072 90E0 ldi R25,0
0074 8017 cp R24,R16
0076 9107 cpc R25,R17
0078 34F0 brlt L57
007A L56:
007A 0837 cpi R16,120
007C E0E0 ldi R30,0
007E 1E07 cpc R17,R30
0080 09F4 brne X8
0082 46C0 rjmp L8
0084 X8:
0084 A7C1 rjmp L2
0086 L57:
0086 0838 cpi R16,136
0088 E0E0 ldi R30,0
008A 1E07 cpc R17,R30
008C 09F4 brne X9
008E 88C0 rjmp L18
0090 X9:
0090 A1C1 rjmp L2
0092 L52:
0092 003B cpi R16,176
0094 E0E0 ldi R30,0
0096 1E07 cpc R17,R30
0098 09F4 brne X10
009A 64C1 rjmp L46
009C X10:
009C 80EB ldi R24,176
009E 90E0 ldi R25,0
00A0 8017 cp R24,R16
00A2 9107 cpc R25,R17
00A4 B4F0 brlt L59
00A6 L58:
00A6 003A cpi R16,160
00A8 E0E0 ldi R30,0
00AA 1E07 cpc R17,R30
00AC 09F4 brne X11
00AE 8CC1 rjmp L50
00B0 X11:
00B0 80EA ldi R24,160
00B2 90E0 ldi R25,0
00B4 8017 cp R24,R16
00B6 9107 cpc R25,R17
00B8 34F0 brlt L61
00BA L60:
00BA 0839 cpi R16,152
00BC E0E0 ldi R30,0
00BE 1E07 cpc R17,R30
00C0 09F4 brne X12
00C2 F8C0 rjmp L36
00C4 X12:
00C4 87C1 rjmp L2
00C6 L61:
00C6 083A cpi R16,168
00C8 E0E0 ldi R30,0
00CA 1E07 cpc R17,R30
00CC 09F4 brne X13
00CE 37C1 rjmp L45
00D0 X13:
00D0 81C1 rjmp L2
00D2 L59:
00D2 003C cpi R16,192
00D4 E0E0 ldi R30,0
00D6 1E07 cpc R17,R30
00D8 09F4 brne X14
00DA 6AC1 rjmp L48
00DC X14:
00DC 80EC ldi R24,192
00DE 90E0 ldi R25,0
00E0 8017 cp R24,R16
00E2 9107 cpc R25,R17
00E4 34F0 brlt L63
00E6 L62:
00E6 083B cpi R16,184
00E8 E0E0 ldi R30,0
00EA 1E07 cpc R17,R30
00EC 09F4 brne X15
00EE 4DC1 rjmp L47
00F0 X15:
00F0 71C1 rjmp L2
00F2 L63:
00F2 083C cpi R16,200
00F4 E0E0 ldi R30,0
00F6 1E07 cpc R17,R30
00F8 09F4 brne X16
00FA 60C1 rjmp L49
00FC X16:
00FC 6BC1 rjmp L2
00FE X0:
00FE .dbline 25
00FE ; {
00FE L5:
00FE .dbline 28
00FE ; //从机接收
00FE ; case SR_SLA_ACK: //SR_SLA_ACK=0x60; SLA+W已经被接收ACK 已返回
00FE ; {
00FE .dbline 29
00FE ; Twi_ACK();
00FE 85EC ldi R24,197
0100 86BF out 0x36,R24
0102 .dbline 30
0102 ; break;
0102 6AC1 rjmp L3
0104 L6:
0104 .dbline 33
0104 ; }
0104 ; case MT_SR_SLA_ACK://MT_SR_SLA_ACK=0x68;SLA+R/W 作为主机的仲裁失败;自己的SLA+W 已经被接收,ACK 已返回
0104 ; {
0104 .dbline 34
0104 ; Twi_ACK();
0104 85EC ldi R24,197
0106 86BF out 0x36,R24
0108 .dbline 35
0108 ; break;
0108 67C1 rjmp L3
010A L7:
010A .dbline 38
010A ; }
010A ; case SR_ALL_ACK://SR_ALL_ACK=0x70;接收到广播地址,ACK 已返回
010A ; {
010A .dbline 39
010A ; Twi_ACK();
010A 85EC ldi R24,197
010C 86BF out 0x36,R24
010E .dbline 40
010E ; break;
010E 64C1 rjmp L3
0110 L8:
0110 .dbline 43
0110 ; }
0110 ; case MT_SR_ALL_ACK://MT_SR_ALL_ACK=0x78;SLA+R/W 作为主机的仲裁失败;接收到广播地址,ACK 已返回
0110 ; {
0110 .dbline 44
0110 ; Twi_ACK();
0110 85EC ldi R24,197
0112 86BF out 0x36,R24
0114 .dbline 45
0114 ; break;
0114 61C1 rjmp L3
0116 L9:
0116 .dbline 48
0116 ; }
0116 ; case SR_DATA_ACK://SR_DATA_ACK=0X80;以前以自己的 SLA+W 被寻址;数据已经被接收,ACK 已返回
0116 ; {
0116 .dbline 49
0116 ; cmd=TWDR;
0116 23B0 in R2,0x3
0118 20920000 sts _cmd,R2
011C .dbline 50
011C ; buf[cmd_num]=cmd;
011C 80E0 ldi R24,<_buf
011E 90E0 ldi R25,>_buf
0120 E0910000 lds R30,_cmd_num
0124 FF27 clr R31
0126 E80F add R30,R24
0128 F91F adc R31,R25
012A 2082 std z+0,R2
012C .dbline 51
012C ; cmd_num++;
012C 80910000 lds R24,_cmd_num
0130 8F5F subi R24,255 ; addi 1
0132 80930000 sts _cmd_num,R24
0136 .dbline 52
0136 ; if(cmd==0x00 && cmd_num==2) //接收到主机请求数据结束位 置标记
0136 20900000 lds R2,_cmd
013A 2220 tst R2
013C 89F4 brne L10
013E 8230 cpi R24,2
0140 79F4 brne L10
0142 .dbline 53
0142 ; {
0142 .dbline 54
0142 ; PWRON;
0142 88B3 in R24,0x18
0144 8F7D andi R24,223
0146 88BB out 0x18,R24
0148 .dbline 55
0148 ; req_flag=1;
0148 81E0 ldi R24,1
014A 80930000 sts _req_flag,R24
014E .dbline 56
014E ; start_flag=0;
014E 2224 clr R2
0150 20920000 sts _start_flag,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -