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

📄 i2c.lst

📁 根据I2C协议传输的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
文件: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 + -