📄 i2c.lst
字号:
文件:I2C.c 盛群编译器版本 2.86 页次1
; 9: {
9 0000 __latched EQU [02aH]
9 0000 __vol EQU [029H]
9 0000 __dah EQU [028H]
9 0000 __dal EQU [027H]
9 0000 __voicec EQU [026H]
9 0000 __tmr3c EQU [025H]
9 0000 __tmr3l EQU [024H]
9 0000 __tmr2c EQU [022H]
9 0000 __tmr2l EQU [021H]
9 0000 __tmr2h EQU [020H]
9 0000 __tbhp EQU [01fH]
9 0000 __intch EQU [01eH]
9 0000 __latch1l EQU [01dH]
9 0000 __latch1m EQU [01cH]
9 0000 __latch1h EQU [01bH]
9 0000 __latch0l EQU [01aH]
9 0000 __latch0m EQU [019H]
9 0000 __latch0h EQU [018H]
9 0000 __pcc EQU [017H]
9 0000 __pc EQU [016H]
9 0000 __pbc EQU [015H]
9 0000 __pb EQU [014H]
9 0000 __pac EQU [013H]
9 0000 __pa EQU [012H]
9 0000 __tmr1c EQU [011H]
9 0000 __tmr1l EQU [010H]
9 0000 __tmr1h EQU [0fH]
9 0000 __tmr0c EQU [0eH]
9 0000 __tmr0l EQU [0dH]
9 0000 __tmr0h EQU [0cH]
9 0000 __intc EQU [0bH]
9 0000 __status EQU [0aH]
9 0000 __wdts EQU [09H]
9 0000 __tblh EQU [08H]
9 0000 __tblp EQU [07H]
9 0000 __pcl EQU [06H]
9 0000 __acc EQU [05H]
9 0000 __mp1 EQU [03H]
9 0000 __iar1 EQU [02H]
9 0000 __mp0 EQU [01H]
9 0000 __iar0 EQU [00H]
9 0000 @SYSTEM_INITIAL .SECTION 'CODE'
9 0000 PUBLIC _SYSTEM_INITIAL
9 0000 _SYSTEM_INITIAL PROC
; 10: SPEECH_INITIAL();
10 0000 2000 E CALL _SPEECH_INITIAL
; 11: _pac = 0b11111111; //Input:Bit=1,Output:Bit=0
11 0001 1F93 SET __pac
; 12: _pbc = 0b11110000;
12 0002 0FF0 MOV A,0f0h
12 0003 0095 MOV __pbc,A
; 13: _pcc = 0b00000011;
文件:I2C.c 盛群编译器版本 2.86 页次2
13 0004 0F03 MOV A,03h
13 0005 0097 MOV __pcc,A
; 14: _tmr1c = 0x80;
文件:I2C.C 盛群编译器版本 2.86 页次2
14 0006 0F80 MOV A,080h
14 0007 0091 MOV __tmr1c,A
; 15: _emi = 1;
15 0008 300B SET [0BH].0
; 16: _et0i = 1;
16 0009 310B SET [0BH].2
; 17: _et1i = 0;
17 000A 358B CLR [0BH].3
; 18: _et2i = 1;
18 000B 301E SET [01EH].0
; 19: _et3i = 0;
19 000C 349E CLR [01EH].1
; 21: _tmr2c = 0x90; //500us Timer
21 000D 0F90 MOV A,090h
21 000E 00A2 MOV __tmr2c,A
; 22: _tmr2h = 0xFC;
22 000F 0FFC MOV A,0fch
22 0010 00A0 MOV __tmr2h,A
; 23: _tmr2l = 0x18;
23 0011 0F18 MOV A,018h
23 0012 00A1 MOV __tmr2l,A
; 25: _T1ON = 0;
25 0013 3611 CLR [011H].4
; 26: _T2ON = 0;
26 0014 3622 CLR [022H].4
; 27: _T3ON = 0;
27 0015 3625 CLR [025H].4
27 0016 L4:
27 0016 0003 RET
27 0017 _SYSTEM_INITIAL ENDP
; 31: {
31 0000 @GameInitial .SECTION 'CODE'
31 0000 PUBLIC _GameInitial
31 0000 _GameInitial PROC
; 32: I2C.uMode.ucValue = 0xE0;
32 0000 0FE0 MOV A,0e0h
32 0001 0080 R MOV _I2C[3],A
32 0002 L5:
32 0002 0003 RET
32 0003 _GameInitial ENDP
; 39: {
文件:I2C.c 盛群编译器版本 2.86 页次3
39 0000 @INTERRUPT_TIMER1_I2C .SECTION 'CODE'
39 0000 PUBLIC _INTERRUPT_TIMER1_I2C
39 0000 _INTERRUPT_TIMER1_I2C PROC
; 41: mov _ucI2CAcc,a
41 0000 0080 R mov _ucI2CAcc,a
; 42: mov a,[0ah]
42 0001 070A mov a,[0ah]
; 43: mov _ucI2CStatus,a
43 0002 0080 R mov _ucI2CStatus,a
; 45: if (I2C.bPulseBusy == TRUE) //判断脉冲有没有输出完
45 0003 3800 R SNZ _I2C.0
45 0004 2800 R JMP L8
; 47: if (I2C.bPulse == HIGH)
47 0005 340A CLR [0AH].0
47 0006 1B00 R RRCA _I2C
47 0007 0080 R MOV b0_3,A
文件:I2C.C 盛群编译器版本 2.86 页次3
47 0008 3800 R SNZ b0_3.0
47 0009 2800 R JMP L10
; 49: _SCL = LOW; //SCL输出低电平
49 000A 3792 CLR [012H].7
; 50: I2C.uMode.bits.bSCL = OUTPUT;
50 000B 3400 R CLR _I2C[3].7
; 51: _I2CPort = I2C.uMode.ucValue;
51 000C 0700 R MOV A,_I2C[3]
51 000D 0093 MOV __pac,A
; 53: if (I2C.uSend.bits.bData)
53 000E 3800 R SNZ _I2C[1].7
53 000F 2800 R JMP L14
; 55: I2C.uMode.bits.bSDA = INPUT;
55 0010 3000 R SET _I2C[3].6
; 56: _I2CPort = I2C.uMode.ucValue;
56 0011 0700 R MOV A,_I2C[3]
56 0012 0093 MOV __pac,A
; 57: }
57 0013 2800 R JMP L11
57 0014 L14:
; 60: _SDA = LOW;
60 0014 3712 CLR [012H].6
; 61: I2C.uMode.bits.bSDA = OUTPUT;
61 0015 3400 R CLR _I2C[3].6
; 62: _I2CPort = I2C.uMode.ucValue;
62 0016 0700 R MOV A,_I2C[3]
62 0017 0093 MOV __pac,A
文件:I2C.c 盛群编译器版本 2.86 页次4
; 64: }
64 0018 2800 R JMP L11
64 0019 L10:
; 67: I2C.uMode.bits.bSCL = INPUT; //SCL输出高电平
67 0019 3000 R SET _I2C[3].7
; 68: _I2CPort = I2C.uMode.ucValue;
68 001A 0700 R MOV A,_I2C[3]
68 001B 0093 MOV __pac,A
; 69: I2C.bPulseBusy = FALSE;
69 001C 3400 R CLR _I2C.0
69 001D L11:
; 71: I2C.bPulse = ~I2C.bPulse; //输出脉冲的电平取反
71 001D 0700 R MOV A,_I2C
71 001E 0080 R MOV b0_3,A
71 001F 0700 R MOV A,b0_3
71 0020 0EFD AND A,0fdh
71 0021 0080 R MOV b1_3,A
71 0022 340A CLR [0AH].0
71 0023 1B00 R RRCA b0_3
71 0024 0080 R MOV b0_3,A
71 0025 0700 R MOV A,b0_3
71 0026 0E01 AND A,01h
71 0027 0080 R MOV b0_3,A
71 0028 0180 R CPL b0_3
71 0029 0700 R MOV A,b0_3
71 002A 0E01 AND A,01h
文件:I2C.C 盛群编译器版本 2.86 页次4
71 002B 0080 R MOV b0_3,A
71 002C 340A CLR [0AH].0
71 002D 1A80 R RLC b0_3
71 002E 0F02 MOV A,02h
71 002F 0680 R ANDM A,b0_3
71 0030 0700 R MOV A,b1_3
71 0031 0500 R OR A,b0_3
71 0032 0080 R MOV _I2C,A
71 0033 L8:
; 74: mov a,_ucI2CStatus
74 0033 0700 R mov a,_ucI2CStatus
; 75: mov [0ah],a
75 0034 008A mov [0ah],a
; 76: mov a,_ucI2CAcc
76 0035 0700 R mov a,_ucI2CAcc
; 77: reti
77 0036 0004 reti
77 0037 L7:
77 0037 0003 RET
77 0000 00 LOCAL b0_3 DB ?
77 0001 00 LOCAL b1_3 DB ?
77 0038 _INTERRUPT_TIMER1_I2C ENDP
; 83: {
文件:I2C.c 盛群编译器版本 2.86 页次5
83 0000 @PulseOut .SECTION 'CODE'
83 0000 PUBLIC _PulseOut
83 0000 _PulseOut PROC
; 84: _tmr1l = TIME1_L;
84 0000 0FB0 MOV A,0b0h
84 0001 0090 MOV __tmr1l,A
; 85: _tmr1h = TIME1_H; //50us:Pulse
85 0002 1F8F SET __tmr1h
; 86: _T1ON = 1;
86 0003 3211 SET [011H].4
; 87: _et1i = 1;
87 0004 318B SET [0BH].3
; 88: I2C.bPulse = HIGH; //输出脉冲的初始化
88 0005 3000 R SET _I2C.1
88 0006 2800 R JMP L25
88 0007 L24:
; 91: I2C.bPulseBusy = TRUE;
91 0007 3000 R SET _I2C.0
91 0008 2800 R JMP L29
91 0009 L28:
; 94: _T1ON = 1;
94 0009 3211 SET [011H].4
; 95: _et1i = 1;
95 000A 318B SET [0BH].3
95 000B L29:
; 92: while(I2C.bPulseBusy == TRUE) //等待输出的脉冲
92 000B 3C00 R SZ _I2C.0
92 000C 2800 R JMP L28
; 97: I2C.uSend.ucValue <<= 1; //下一个地址
97 000D 340A CLR [0AH].0
97 000E 1A80 R RLC _I2C[1]
文件:I2C.C 盛群编译器版本 2.86 页次5
; 99: I2C.uSend.ucValue |= 0x01;
99 000F 3000 R SET _I2C[1].0
; 100: I2C.ucPulseNumber--;
100 0010 1580 R DEC _I2C[4]
100 0011 L25:
; 89: while(I2C.ucPulseNumber != 0)
89 0011 1080 R SZ _I2C[4]
89 0012 2800 R JMP L24
; 102: _T1ON = 0;
102 0013 3611 CLR [011H].4
; 103: _et1i = 0;
103 0014 358B CLR [0BH].3
文件:I2C.c 盛群编译器版本 2.86 页次6
103 0015 L23:
103 0015 0003 RET
103 0016 _PulseOut ENDP
; 107: {
107 0000 @SendStart .SECTION 'CODE'
107 0000 PUBLIC _SendStart
107 0000 _SendStart PROC
; 108: I2C.uMode.bits.bSCL = INPUT; //发送Start信号,即在SCL为高电平时,SDA下降沿。
108 0000 3000 R SET _I2C[3].7
; 109: _I2CPort = I2C.uMode.ucValue;
109 0001 0700 R MOV A,_I2C[3]
109 0002 0093 MOV __pac,A
; 110: I2C.uMode.bits.bSDA = INPUT;
110 0003 3000 R SET _I2C[3].6
; 111: _I2CPort = I2C.uMode.ucValue;
111 0004 0700 R MOV A,_I2C[3]
111 0005 0093 MOV __pac,A
; 113: if (_SCL && _SDA)
113 0006 3B92 SNZ [012H].7
113 0007 2800 R JMP L39
113 0008 3B12 SNZ [012H].6
113 0009 2800 R JMP L39
; 115: _SDA = LOW;
115 000A 3712 CLR [012H].6
; 116: I2C.uMode.bits.bSDA = OUTPUT;
116 000B 3400 R CLR _I2C[3].6
; 117: _I2CPort = I2C.uMode.ucValue;
117 000C 0700 R MOV A,_I2C[3]
117 000D 0093 MOV __pac,A
; 118: }
118 000E 2800 R JMP L40
118 000F L39:
; 120: return ERROR;
120 000F 1F05 CLR [05H]
120 0010 2800 R JMP L34
120 0011 L40:
; 121: return OK;
121 0011 1F05 CLR [05H]
121 0012 3005 SET [05H].0
121 0013 L34:
121 0013 0003 RET
121 0014 _SendStart ENDP
; 125: {
文件:I2C.C 盛群编译器版本 2.86 页次6
125 0000 @SendByte .SECTION 'CODE'
125 0000 PUBLIC _SendByte
文件:I2C.c 盛群编译器版本 2.86 页次7
125 0000 _SendByte PROC
; 127: ucWatch3 = I2C.uSend.ucValue; I2C.ucPulseNumber = 9; //发送信号
127 0000 0700 R MOV A,_I2C[1]
127 0001 0080 R MOV _ucWatch3,A
127 0002 0F09 MOV A,09h
127 0003 0080 R MOV _I2C[4],A
; 128: PulseOut();
128 0004 2000 R CALL _PulseOut
; 130: I2C.uSend.bits.bPrevious = _SCL;
130 0005 0700 R MOV A,_I2C[1]
130 0006 0EFD AND A,0fdh
130 0007 0080 R MOV b0_6,A
130 0008 1F00 R CLR b1_6
130 0009 3F92 SZ [012H].7
130 000A 3000 R SET b1_6.0
130 000B 0F01 MOV A,01h
130 000C 0680 R ANDM A,b1_6
130 000D 340A CLR [0AH].0
130 000E 1A80 R RLC b1_6
130 000F 0F02 MOV A,02h
130 0010 0680 R ANDM A,b1_6
130 0011 0700 R MOV A,b0_6
130 0012 0500 R OR A,b1_6
130 0013 0080 R MOV _I2C[1],A
; 131: for(i=0; i<255; i++) //接收ACK信号
131 0014 1F00 R CLR CR7
131 0015 2800 R JMP L50
131 0016 L47:
; 133: I2C.uSend.bits.bCurrent = _SCL;
133 0016 0700 R MOV A,_I2C[1]
133 0017 0EFE AND A,0feh
133 0018 0080 R MOV b0_6,A
133 0019 1F00 R CLR b1_6
133 001A 3F92 SZ [012H].7
133 001B 3000 R SET b1_6.0
133 001C 0700 R MOV A,b1_6
133 001D 0E01 AND A,01h
133 001E 0080 R MOV b1_6,A
133 001F 0700 R MOV A,b1_6
133 0020 0E01 AND A,01h
133 0021 0080 R MOV b1_6,A
133 0022 0700 R MOV A,b0_6
133 0023 0500 R OR A,b1_6
133 0024 0080 R MOV _I2C[1],A
; 134: if (I2C.uSend.bits.bCurrent && !I2C.uSend.bits.bPrevious) //读取SCL上升沿时,SDA的值
134 0025 3800 R SNZ _I2C[1].0
134 0026 2800 R JMP L52
134 0027 3C00 R SZ _I2C[1].1
134 0028 2800 R JMP L52
; 136: if (_SDA == LOW)
136 0029 3F12 SZ [012H].6
136 002A 2800 R JMP L56
文件:I2C.C 盛群编译器版本 2.86 页次7
文件:I2C.c 盛群编译器版本 2.86 页次8
; 138: for(j=0; j<255; j++) //收到ACK的上升沿信号,等待Slave放弃总线
138 002B 1F00 R CLR CR6
138 002C 2800 R JMP L61
138 002D L58:
; 140: if (_SDA && _SCL)
140 002D 3B12 SNZ [012H].6
140 002E 2800 R JMP L62
140 002F 3B92 SNZ [012H].7
140 0030 2800 R JMP L62
; 141: return OK;
141 0031 1F05 CLR [05H]
141 0032 3005 SET [05H].0
141 0033 2800 R JMP L43
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -