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

📄 hard_i2c.s

📁 meg16 的所有功能实例
💻 S
📖 第 1 页 / 共 2 页
字号:
	sbi 0x12,6
	.dbline 180
	.dbline 181
;  DISP_DATA[3]=i2c_Read(0x02);
	ldi R16,2
	xcall _i2c_Read
	sts _DISP_DATA+3,R16
	.dbline 183
; 
;  for(;;)
L23:
	.dbline 184
	.dbline 186
	.dbline 183
	.dbline 183
	xjmp L23
X2:
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e I2C_Ini _I2C_Ini fV
	.even
_I2C_Ini::
	.dbline -1
	.dbline 193
; 	{ 
; 	
; 	}
; }
; 
; 
; //=======================================================================
; //初始化端口
; void I2C_Ini(void)
; {
	.dbline 194
; 	i2c_ddr|=(1<<SCL);			//SCK为输出
	sbi 0x14,0
	.dbline 195
; 	i2c_ddr|=(1<<SDA);		    //SDA为双向的,先设置为输出
	sbi 0x14,1
	.dbline -2
L27:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e i2c_Write _i2c_Write fc
;         number -> R20
;          Wdata -> R22
;     RomAddress -> R10
	.even
_i2c_Write::
	xcall push_gset3
	mov R22,R18
	mov R10,R16
	.dbline -1
	.dbline 206
; 
; 
; }
; 
; /******************************************
;                 I2C总线写一个字节
; 			    返回1:写成功
; 				返回非1:写失败
; *******************************************/
; unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata) 
; {unsigned char number=10;
	.dbline 206
	ldi R20,10
	xjmp L30
L29:
	.dbline 208
;  while(number--)
; 	  {
	.dbline 209
; 	  Start();//I2C启动
	ldi R24,164
	out 0x36,R24
	.dbline 210
L32:
	.dbline 210
L33:
	.dbline 210
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L32
	.dbline 210
	.dbline 210
	.dbline 211
; 	  if(TestAck()!=START) continue;//ACK
	in R24,0x1
	andi R24,248
	cpi R24,8
	breq L35
	.dbline 211
	xjmp L30
L35:
	.dbline 212
; 	  Write8Bit(wr_device_add);//写I2C从器件地址和写方式
	.dbline 212
	ldi R24,160
	out 0x3,R24
	.dbline 212
	ldi R24,132
	out 0x36,R24
	.dbline 212
	.dbline 212
	.dbline 213
L37:
	.dbline 213
L38:
	.dbline 213
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L37
	.dbline 213
	.dbline 213
	.dbline 215
; 	  
; 	  if(TestAck()!=MT_SLA_ACK)
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L40
	.dbline 216
; 	  {putchar(0);
	.dbline 216
	clr R16
	clr R17
	xcall _putchar
	.dbline 217
; 	   continue;//ACK
	xjmp L30
L40:
	.dbline 219
; 	  }
; 	  Write8Bit(RomAddress);//写24C02的ROM地址
	.dbline 219
	out 0x3,R10
	.dbline 219
	ldi R24,132
	out 0x36,R24
	.dbline 219
	.dbline 219
	.dbline 220
L42:
	.dbline 220
L43:
	.dbline 220
; 	  Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L42
	.dbline 220
	.dbline 220
	.dbline 221
; 	  if(TestAck()!=MT_DATA_ACK) continue;//ACK
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L45
	.dbline 221
	xjmp L30
L45:
	.dbline 222
; 	  Write8Bit(Wdata);//写数据到24C02的ROM
	.dbline 222
	out 0x3,R22
	.dbline 222
	ldi R24,132
	out 0x36,R24
	.dbline 222
	.dbline 222
	.dbline 223
L47:
	.dbline 223
L48:
	.dbline 223
	in R2,0x36
	sbrs R2,7
	rjmp L47
	.dbline 223
	.dbline 223
	.dbline 224
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L31
	.dbline 224
	.dbline 225
L30:
	.dbline 207
	mov R2,R20
	clr R3
	subi R20,1
	tst R2
	brne L29
L31:
	.dbline 227
; 	  Wait();
; 	  if(TestAck()!=MT_DATA_ACK) continue;//ACK
; 	  break;
; 	  }
; 	  Stop();//I2C停止
	ldi R24,148
	out 0x36,R24
	.dbline 228
;  	  Delay_ms(10);//延时10ms等EEPROM写完
	ldi R16,10
	ldi R17,0
	xcall _Delay_ms
	.dbline 229
; 	  return 1;
	ldi R16,1
	.dbline -2
L28:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r number 20 c
	.dbsym r Wdata 22 c
	.dbsym r RomAddress 10 c
	.dbend
	.dbfunc e i2c_Read _i2c_Read fc
;         number -> R22
;           temp -> R20
;              a -> R10
;     RomAddress -> R16
	.even
_i2c_Read::
	xcall push_gset3
	.dbline -1
	.dbline 236
; }
; /******************************************
;                I2C总线读一个字节
; 			   
; *******************************************/
; unsigned char i2c_Read(unsigned char RomAddress) 
;  {char a=0x00;
	.dbline 236
	clr R10
	.dbline 237
;   unsigned char temp=0;
	clr R20
	.dbline 238
;   unsigned char number=10;
	ldi R22,10
	xjmp L54
L53:
	.dbline 241
;   
;   while(number--)
; 	   {
	.dbline 242
; 	   Start();//I2C启动
	ldi R24,164
	out 0x36,R24
	.dbline 243
L56:
	.dbline 243
L57:
	.dbline 243
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L56
	.dbline 243
	.dbline 243
	.dbline 244
; 	   a=TestAck();
	in R24,0x1
	andi R24,248
	mov R10,R24
	.dbline 246
; 	  
; 	   if (a!=START) continue;//ACK	 
	cpi R24,8
	breq L59
	.dbline 246
	xjmp L54
L59:
	.dbline 248
; 	   
; 	   Write8Bit(wr_device_add);//写I2C从器件地址和写方式
	.dbline 248
	ldi R24,160
	out 0x3,R24
	.dbline 248
	ldi R24,132
	out 0x36,R24
	.dbline 248
	.dbline 248
	.dbline 249
L61:
	.dbline 249
L62:
	.dbline 249
; 	   Wait(); 
	in R2,0x36
	sbrs R2,7
	rjmp L61
	.dbline 249
	.dbline 249
	.dbline 251
;    	   
; 	   if (TestAck()!=MT_SLA_ACK) continue;//ACK
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L64
	.dbline 251
	xjmp L54
L64:
	.dbline 254
; 	  
; 
; 	   Write8Bit(RomAddress);//写STA013的ROM地址
	.dbline 254
	out 0x3,R16
	.dbline 254
	ldi R24,132
	out 0x36,R24
	.dbline 254
	.dbline 254
	.dbline 255
L66:
	.dbline 255
L67:
	.dbline 255
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L66
	.dbline 255
	.dbline 255
	.dbline 257
; 	   
; 	   if (TestAck()!=MT_DATA_ACK) continue;
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L69
	.dbline 257
	xjmp L54
L69:
	.dbline 258
; 	   Start();//I2C重新启动
	ldi R24,164
	out 0x36,R24
	.dbline 259
L71:
	.dbline 259
L72:
	.dbline 259
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L71
	.dbline 259
	.dbline 259
	.dbline 260
; 	   if (TestAck()!=RE_START)  continue;
	in R24,0x1
	andi R24,248
	cpi R24,16
	breq L74
	.dbline 260
	xjmp L54
L74:
	.dbline 262
; 	   
; 	   Write8Bit(rd_device_add);//写I2C从器件地址和读方式
	.dbline 262
	ldi R24,161
	out 0x3,R24
	.dbline 262
	ldi R24,132
	out 0x36,R24
	.dbline 262
	.dbline 262
	.dbline 263
L76:
	.dbline 263
L77:
	.dbline 263
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L76
	.dbline 263
	.dbline 263
	.dbline 265
; 	   
; 	   if(TestAck()!=MR_SLA_ACK)  continue;//ACK
	in R24,0x1
	andi R24,248
	cpi R24,64
	breq L79
	.dbline 265
	xjmp L54
L79:
	.dbline 266
; 	   Twi();//启动主I2C读方式
	ldi R24,132
	out 0x36,R24
	.dbline 268
L81:
	.dbline 268
L82:
	.dbline 268
; 	   
; 	   Wait();
	in R2,0x36
	sbrs R2,7
	rjmp L81
	.dbline 268
	.dbline 268
	.dbline 270
; 	   
; 	   if(TestAck()!=MR_DATA_NOACK) continue;//ACK	
	in R24,0x1
	andi R24,248
	cpi R24,88
	breq L84
	.dbline 270
	xjmp L54
L84:
	.dbline 271
	in R20,0x3
	.dbline 273
	xjmp L55
L54:
	.dbline 240
	mov R2,R22
	clr R3
	subi R22,1
	tst R2
	breq X3
	xjmp L53
X3:
L55:
	.dbline 275
; 	   temp=TWDR;//读取I2C接收数据
; 	   
; 	   break;
; 	   }
;        Stop();//I2C停止
	ldi R24,148
	out 0x36,R24
	.dbline 277
; 	   
; 	   return temp;
	mov R16,R20
	.dbline -2
L52:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r number 22 c
	.dbsym r temp 20 c
	.dbsym r a 10 c
	.dbsym r RomAddress 16 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\MYWORK~1\开发设计\EasyAVR\程序范例\Mega16例程\HARD_I~1\Hard_I2C.c
_DISP_NUM::
	.blkb 1
	.dbsym e DISP_NUM _DISP_NUM c

⌨️ 快捷键说明

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