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

📄 com.src

📁 使用I2C总线
💻 SRC
📖 第 1 页 / 共 2 页
字号:
; void serial(void) interrupt 4//串口中断响应

	RSEG  ?PR?serial?COM
	USING	0
serial:
	PUSH 	ACC
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR6
	PUSH 	AR7
	USING	0
			; SOURCE LINE # 123
; {  
;   if(RI)//为接收中断
			; SOURCE LINE # 125
	JNB  	RI,?C0022
;      {      
			; SOURCE LINE # 126
;       RI=0;                                         //清接收中断标志
			; SOURCE LINE # 127
	CLR  	RI
;       LED = ~LED;                                   //闪串口指示LED
			; SOURCE LINE # 128
	CPL  	LED
;       sbuffer = SBUF;                               //读取串口缓冲区数据
			; SOURCE LINE # 129
	MOV  	sbuffer,SBUF
; 
;       if((sbuffer == 's') && (receive == 0))       //判断是否为数据头 ,是数据头则准备接收
			; SOURCE LINE # 131
	MOV  	A,sbuffer
	CJNE 	A,#073H,?C0023
	JB   	receive,?C0023
;        {     
			; SOURCE LINE # 132
;            receive = 1;     //开始接收标志                         
			; SOURCE LINE # 133
	SETB 	receive
;            cmd_numb = 0;    //清接收计数器
			; SOURCE LINE # 134
	MOV  	cmd_numb,#00H
;            re_finish = 0;   //清接收完成标志
			; SOURCE LINE # 135
	CLR  	re_finish
;           }
			; SOURCE LINE # 136
	SJMP 	?C0029
?C0023:
;       else if(sbuffer == 'e')   //判断数据尾     
			; SOURCE LINE # 137
	MOV  	A,sbuffer
	CJNE 	A,#065H,?C0025
;         { 
			; SOURCE LINE # 138
;           re_finish = 1;         //置接收完成标志      
			; SOURCE LINE # 139
	SETB 	re_finish
;           receive =0;            //清接收标志
			; SOURCE LINE # 140
	CLR  	receive
;           }
			; SOURCE LINE # 141
	SJMP 	?C0029
?C0025:
;       else if(receive){     //判断当前是否处于接收状态
			; SOURCE LINE # 142
	JNB  	receive,?C0029
;                    
;           buffer[cmd_numb++] = sbuffer-'0';  //当前字符送缓冲区
			; SOURCE LINE # 144
	MOV  	A,sbuffer
	ADD  	A,#0D0H
	MOV  	R7,A
	MOV  	R6,cmd_numb
	INC  	cmd_numb
	MOV  	A,#LOW (buffer)
	ADD  	A,R6
	MOV  	R0,A
	MOV  	@R0,AR7
;          }      
			; SOURCE LINE # 145
	SJMP 	?C0029
;       else                    //无效命令则返回
;          return;
;        }
			; SOURCE LINE # 148
?C0022:
;     else{ 
			; SOURCE LINE # 149
;      TI=0;                   //为单个字符发送完中断
			; SOURCE LINE # 150
	CLR  	TI
;      if(!number)             //字符串发送完
			; SOURCE LINE # 151
	MOV  	A,number?
	JNZ  	?C0031
;       { REN = 1;             //允许接收
			; SOURCE LINE # 152
	SETB 	REN
;        }
			; SOURCE LINE # 153
	SJMP 	?C0029
?C0031:
;      else{                  //字符串未发送完
			; SOURCE LINE # 154
;         SBUF =  buffer[i++];   //发送下一字符
			; SOURCE LINE # 155
	MOV  	R7,i
	INC  	i
	MOV  	A,#LOW (buffer)
	ADD  	A,R7
	MOV  	R0,A
	MOV  	A,@R0
	MOV  	SBUF,A
; 		number--;           //发送字符数减一
			; SOURCE LINE # 156
	DEC  	number?
;        }             
			; SOURCE LINE # 157
;      }
			; SOURCE LINE # 158
;    }
			; SOURCE LINE # 159
?C0029:
	POP  	AR7
	POP  	AR6
	POP  	AR0
	POP  	PSW
	POP  	ACC
	RETI 	
; END OF serial

; 
; /*****************************延时函数**************************/
; void  delay(unsigned int loop) 

	RSEG  ?PR?_delay?COM
L?0058:
	USING	0
L?0059:
	MOV  	R7,#01H
	MOV  	R6,#00H
_delay:
	USING	0
			; SOURCE LINE # 162
;---- Variable 'loop?542' assigned to Register 'R6/R7' ----
; {  unsigned int i ;          //loop 为执行空指令的次数,改变它可一改变延时时长
			; SOURCE LINE # 163
;   for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
			; SOURCE LINE # 164
;---- Variable 'i?543' assigned to Register 'R4/R5' ----
	CLR  	A
	MOV  	R5,A
	MOV  	R4,A
?C0033:
	CLR  	C
	MOV  	A,R5
	SUBB 	A,R7
	MOV  	A,R4
	SUBB 	A,R6
	JNC  	?C0036
	INC  	R5
	CJNE 	R5,#00H,?C0055
	INC  	R4
?C0055:
	SJMP 	?C0033
;  }
			; SOURCE LINE # 165
?C0036:
	RET  	
; END OF _delay

; 
; 
; /*******************************I2C开始*****************************/
; void Start_I2c()

	RSEG  ?PR?Start_I2c?COM
Start_I2c:
	USING	0
			; SOURCE LINE # 169
; {
			; SOURCE LINE # 170
;     SDA=1;
			; SOURCE LINE # 171
	SETB 	SDA
;     delay(1);
			; SOURCE LINE # 172
	LCALL	L?0058
;     SCL=1;
			; SOURCE LINE # 173
	SETB 	SCL
;     delay(3);
			; SOURCE LINE # 174
	MOV  	R7,#03H
	LCALL	_delay
;     SDA=0;
			; SOURCE LINE # 175
	CLR  	SDA
;     delay(3);
			; SOURCE LINE # 176
	LCALL	_delay
;     SCL=0;
			; SOURCE LINE # 177
	CLR  	SCL
;     delay(1);
			; SOURCE LINE # 178
	MOV  	R7,#01H
	LJMP 	_delay
; END OF Start_I2c

; }
; 
; 
; 
; /*********************************I2C结束*****************************/
; void Stop_I2c()

	RSEG  ?PR?Stop_I2c?COM
Stop_I2c:
	USING	0
			; SOURCE LINE # 184
; { 
			; SOURCE LINE # 185
;     SDA=0;
			; SOURCE LINE # 186
	CLR  	SDA
;     delay(1);
			; SOURCE LINE # 187
	LCALL	L?0058
;     SCL=1;
			; SOURCE LINE # 188
	SETB 	SCL
;     delay(3);
			; SOURCE LINE # 189
	MOV  	R7,#03H
	LCALL	_delay
;     SDA=1;
			; SOURCE LINE # 190
	SETB 	SDA
;     delay(1);
			; SOURCE LINE # 191
	MOV  	R7,#01H
	LJMP 	_delay
; END OF Stop_I2c

; 
; }
; 
; 
; /*********************************I2C写一个字节************************/
; void SendB(uchar c)

	RSEG  ?PR?_SendB?COM
_SendB:
	USING	0
			; SOURCE LINE # 197
;---- Variable 'ack?846' assigned to Register 'R1' ----
;---- Variable 'c?844' assigned to Register 'R3' ----
	MOV  	R3,AR7
; {
			; SOURCE LINE # 198
;     uchar BitCnt,ack;
;     for(BitCnt=0;BitCnt<8;BitCnt++)
			; SOURCE LINE # 200
;---- Variable 'BitCnt?845' assigned to Register 'R2' ----
	CLR  	A
	MOV  	R2,A
?C0039:
;     {
			; SOURCE LINE # 201
;       if((c<<BitCnt)&0x80)SDA=1;
			; SOURCE LINE # 202
	MOV  	A,R3
	MOV  	R0,AR2
	INC  	R0
	SJMP 	?C0057
?C0056:
	CLR  	C
	RLC  	A
?C0057:
	DJNZ 	R0,?C0056
	JNB  	ACC.7,?C0042
	SETB 	SDA
	SJMP 	?C0043
?C0042:
;       else SDA=0;
			; SOURCE LINE # 203
	CLR  	SDA
?C0043:
;       delay(2);
			; SOURCE LINE # 204
	MOV  	R7,#02H
	MOV  	R6,#00H
	LCALL	_delay
;       SCL=1;
			; SOURCE LINE # 205
	SETB 	SCL
;       delay(5);
			; SOURCE LINE # 206
	MOV  	R7,#05H
	LCALL	_delay
;       SCL=0;
			; SOURCE LINE # 207
	CLR  	SCL
;       delay(2);
			; SOURCE LINE # 208
	MOV  	R7,#02H
	LCALL	_delay
; 
;     }
			; SOURCE LINE # 210
	INC  	R2
	CJNE 	R2,#08H,?C0039
?C0040:
;       delay(1);
			; SOURCE LINE # 211
	LCALL	L?0059
;       SDA=1;
			; SOURCE LINE # 212
	SETB 	SDA
;       delay(5);  
			; SOURCE LINE # 213
	MOV  	R7,#05H
	LCALL	_delay
;       SCL=1;
			; SOURCE LINE # 214
	SETB 	SCL
;       delay(1);
			; SOURCE LINE # 215
	MOV  	R7,#01H
	LCALL	_delay
;       if(SDA==1)ack=0;
			; SOURCE LINE # 216
	JNB  	SDA,?C0044
	CLR  	A
	MOV  	R1,A
	SJMP 	?C0045
?C0044:
;       else ack=1;
			; SOURCE LINE # 217
	MOV  	R1,#01H
?C0045:
;       SCL=0;
			; SOURCE LINE # 218
	CLR  	SCL
;       delay(1);
			; SOURCE LINE # 219
	MOV  	R7,#01H
	MOV  	R6,#00H
	LJMP 	_delay
; END OF _SendB

; 
; }
; 
; /******************************I2C读取一个字节****************************/   
; uchar RcvB()

	RSEG  ?PR?RcvB?COM
RcvB:
	USING	0
			; SOURCE LINE # 224
; {
			; SOURCE LINE # 225
;      uchar retc;
;      uchar BitCnt;
;      retc=0;
			; SOURCE LINE # 228
;---- Variable 'retc?947' assigned to Register 'R3' ----
	CLR  	A
	MOV  	R3,A
;      SDA=1;
			; SOURCE LINE # 229
	SETB 	SDA
;      for(BitCnt=0;BitCnt<8;BitCnt++)
			; SOURCE LINE # 230
;---- Variable 'BitCnt?948' assigned to Register 'R2' ----
	MOV  	R2,A
?C0047:
;      {
			; SOURCE LINE # 231
;         delay(1);
			; SOURCE LINE # 232
	LCALL	L?0059
;         SCL=0;
			; SOURCE LINE # 233
	CLR  	SCL
;         delay(5);
			; SOURCE LINE # 234
	MOV  	R7,#05H
	LCALL	_delay
;         SCL=1;
			; SOURCE LINE # 235
	SETB 	SCL
;         delay(2);
			; SOURCE LINE # 236
	MOV  	R7,#02H
	LCALL	_delay
;         retc=retc<<1;
			; SOURCE LINE # 237
	MOV  	A,R3
	ADD  	A,ACC
	MOV  	R3,A
;         if(SDA==1)retc=retc+1;
			; SOURCE LINE # 238
	JNB  	SDA,?C0050
	INC  	R3
?C0050:
;         delay(1);
			; SOURCE LINE # 239
	LCALL	L?0059
;      }
			; SOURCE LINE # 240
	INC  	R2
	CJNE 	R2,#08H,?C0047
?C0048:
;      SCL=0;
			; SOURCE LINE # 241
	CLR  	SCL
;         delay(1);  
			; SOURCE LINE # 242
	LCALL	L?0059
;      return(retc);
			; SOURCE LINE # 243
	MOV  	R7,AR3
; }
			; SOURCE LINE # 244
?C0051:
	RET  	
; END OF RcvB

; 
; /*********************************I2C应答*********************************/  
; void Ack_I2c(bit a)

	RSEG  ?PR?Ack_I2c?COM
Ack_I2c:
	USING	0
			; SOURCE LINE # 247
; {
			; SOURCE LINE # 248
;     if(a==0)SDA=0;
			; SOURCE LINE # 249
	JB   	a?1049,?C0052
	CLR  	SDA
	SJMP 	?C0053
?C0052:
;     else SDA=1;
			; SOURCE LINE # 250
	SETB 	SDA
?C0053:
;         delay(1);
			; SOURCE LINE # 251
	LCALL	L?0059
;     SCL=1;    
			; SOURCE LINE # 252
	SETB 	SCL
;         delay(2);
			; SOURCE LINE # 253
	INC  	R7
	LCALL	_delay
;     SCL=0;
			; SOURCE LINE # 254
	CLR  	SCL
;         delay(1);
			; SOURCE LINE # 255
	DEC  	R7
	LJMP 	_delay
; END OF Ack_I2c

	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -