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

📄 iic_drive.s

📁 hao da jia lai fen xiang
💻 S
字号:
	.module IIC_drive.C
	.area text(rom, con, rel)
	.dbfile D:\mega16\drive\IIC_drive.C
	.dbfunc e IIC_init _IIC_init fV
	.even
_IIC_init::
	.dbline -1
	.dbline 20
; /******************************************************************************/
; /*   用TWI口 读写IIC总线                                                      */
; /*       MEGA16   8M                                                          */
; /*       100K                                                                 */
; /******************************************************************************/
; 
; #include "config.h"
; 
; #define TW_START        0X08
; #define TW_SLA_ACK      0X18
; #define TW_SLA_NO_ACK   0X20
; #define TW_DATA_ACK     0X28
; #define TW_DATA_NO_ACK  0X30
; 
; 
; #define TW_STATE        (TWSR & 0XF8)
; 
; /******************************************************************************/
; void IIC_init(void)
; {
	.dbline 21
; 	TWCR= 0X00; //disable twi
	clr R2
	out 0x36,R2
	.dbline 22
; 	TWBR= 0x20; //set bit rate
	ldi R24,32
	out 0x0,R24
	.dbline 23
; 	TWSR= 0x00; //set prescale
	out 0x1,R2
	.dbline 24
; 	TWAR= 0x00; //set slave address
	out 0x2,R2
	.dbline 25
; 	TWCR= 0x00; //enable twi
	out 0x36,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e IIC_START _IIC_START fV
	.even
_IIC_START::
	.dbline -1
	.dbline 29
; }
; /******************************************************************************/
; void IIC_START(void)
; {
	.dbline 30
; 	TWCR = BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
	ldi R24,164
	out 0x36,R24
L3:
	.dbline 31
L4:
	.dbline 31
; 	while(!(TWCR & BIT(TWINT)));
	in R2,0x36
	sbrs R2,7
	rjmp L3
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e IIC_STOP _IIC_STOP fV
	.even
_IIC_STOP::
	.dbline -1
	.dbline 35
; }
; /******************************************************************************/
; void IIC_STOP(void)
; {
	.dbline 36
; 	TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
	ldi R24,148
	out 0x36,R24
L7:
	.dbline 37
L8:
	.dbline 37
; 	while(!(TWCR & BIT(TWINT)));
	in R2,0x36
	sbrs R2,7
	rjmp L7
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e IIC_send _IIC_send fV
;      IIC_state -> <dead>
;       IIC_data -> R16
	.even
_IIC_send::
	.dbline -1
	.dbline 41
; }
; /******************************************************************************/
; void IIC_send(unsigned char IIC_data)
; {
	.dbline 43
; 	unsigned char IIC_state;
; 	TWDR  = IIC_data;
	out 0x3,R16
	.dbline 44
; 	TWCR  = BIT(TWINT) | BIT(TWEN);
	ldi R24,132
	out 0x36,R24
L11:
	.dbline 45
L12:
	.dbline 45
; 	while(!(TWCR & TWINT));
	in R24,0x36
	andi R24,7
	breq L11
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbsym l IIC_state 1 c
	.dbsym r IIC_data 16 c
	.dbend
	.dbfunc e IIC_take _IIC_take fc
	.even
_IIC_take::
	.dbline -1
	.dbline 49
; }
; /******************************************************************************/
; unsigned char IIC_take(void)
; {
	.dbline 50
; 	TWCR |= BIT(TWINT) | BIT(TWEN) | BIT(TWEA);
	in R24,0x36
	ori R24,196
	out 0x36,R24
L15:
	.dbline 51
L16:
	.dbline 51
; 	while(!(TWCR & BIT(TWINT)));
	in R2,0x36
	sbrs R2,7
	rjmp L15
	.dbline 52
; 	return (TWDR);
	in R16,0x3
	.dbline -2
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e IIC_read _IIC_read fc
;         n_byte -> R20
;       IIC_data -> R22,R23
;    IIC_address -> R10
	.even
_IIC_read::
	xcall push_gset3
	movw R22,R18
	mov R10,R16
	ldd R20,y+6
	.dbline -1
	.dbline 56
; }
; /******************************************************************************/
; unsigned char IIC_read(unsigned char IIC_address,unsigned char *IIC_data,unsigned char n_byte)
; {
	.dbline 57
; 	IIC_address |= 0x01;
	mov R24,R10
	ori R24,1
	mov R10,R24
	.dbline 58
; 	IIC_START();
	xcall _IIC_START
	.dbline 59
; 	IIC_send(IIC_address);
	mov R16,R10
	xcall _IIC_send
	.dbline 60
; 	if(TW_STATE != TW_SLA_ACK)
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L22
	.dbline 61
; 	{
	.dbline 64
; //		IIC_STOP();
; //		return FALSE;
; 	}
	xjmp L22
L21:
	.dbline 66
; 	while(--n_byte)
; 	{
	.dbline 67
; 		*IIC_data++ = IIC_take();
	xcall _IIC_take
	movw R30,R22
	st Z+,R16
	movw R22,R30
	.dbline 68
; 		if(TW_STATE == TW_DATA_NO_ACK)
	in R24,0x1
	andi R24,248
	cpi R24,48
	brne L24
	.dbline 69
; 		{
	.dbline 72
; //			IIC_STOP();
; //			return FALSE;
; 		}
L24:
	.dbline 73
L22:
	.dbline 65
	mov R24,R20
	subi R24,1
	mov R20,R24
	tst R24
	brne L21
	.dbline 74
; 	}
; 	TWCR |= BIT(TWINT) | BIT(TWEN);
	in R24,0x36
	ori R24,132
	out 0x36,R24
L26:
	.dbline 75
L27:
	.dbline 75
; 	while(!(TWCR & BIT(TWINT)));
	in R2,0x36
	sbrs R2,7
	rjmp L26
	.dbline 76
; 	*IIC_data = TWDR;
	in R2,0x3
	movw R30,R22
	std z+0,R2
	.dbline 77
; 	if(TW_STATE == TW_DATA_NO_ACK)
	in R24,0x1
	andi R24,248
	cpi R24,48
	brne L29
	.dbline 78
; 	{
	.dbline 81
; //		IIC_STOP();
; //		return FALSE;
; 	}
L29:
	.dbline 82
; 	IIC_STOP();
	xcall _IIC_STOP
	.dbline 83
; 	return TRUE;
	ldi R16,1
	.dbline -2
L18:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r n_byte 20 c
	.dbsym r IIC_data 22 pc
	.dbsym r IIC_address 10 c
	.dbend
	.dbfunc e IIC_write _IIC_write fc
;         n_byte -> R20
;       IIC_data -> R22,R23
;    IIC_address -> R10
	.even
_IIC_write::
	xcall push_gset3
	movw R22,R18
	mov R10,R16
	ldd R20,y+6
	.dbline -1
	.dbline 87
; }
; /******************************************************************************/
; unsigned char IIC_write(unsigned char IIC_address,unsigned char *IIC_data,unsigned char n_byte)
; {
	.dbline 88
; 	IIC_address &= 0xfe;
	mov R24,R10
	andi R24,254
	mov R10,R24
	.dbline 89
; 	IIC_START();
	xcall _IIC_START
	.dbline 90
; 	IIC_send(IIC_address);
	mov R16,R10
	xcall _IIC_send
	.dbline 91
; 	if(TW_STATE != TW_SLA_ACK)
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L35
	.dbline 92
; 	{
	.dbline 95
; //		IIC_STOP();
; //		return FALSE;
; 	}
	xjmp L35
L34:
	.dbline 97
; 	while(n_byte--)
; 	{
	.dbline 98
; 		IIC_send(*IIC_data++);
	movw R30,R22
	ld R16,Z+
	movw R22,R30
	xcall _IIC_send
	.dbline 99
; 		if(TW_STATE != TW_DATA_ACK)
	in R24,0x1
	andi R24,248
	cpi R24,40
	breq L37
	.dbline 100
; 		{
	.dbline 103
; //			IIC_STOP();
; //			return FALSE;
; 		}
L37:
	.dbline 104
L35:
	.dbline 96
	mov R2,R20
	clr R3
	subi R20,1
	tst R2
	brne L34
	.dbline 105
; 	}
; 	IIC_STOP();
	xcall _IIC_STOP
	.dbline 106
; 	return TRUE;
	ldi R16,1
	.dbline -2
L31:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r n_byte 20 c
	.dbsym r IIC_data 22 pc
	.dbsym r IIC_address 10 c
	.dbend

⌨️ 快捷键说明

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