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

📄 iic_master.s

📁 hao da jia lai fen xiang
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module iic_master.c
	.area text(rom, con, rel)
	.dbfile D:\mega16\drive\iic_master.c
	.dbfunc e IICRead _IICRead fc
;              i -> R22
;          NByte -> y+4
;           Addr -> R22
;            Ret -> R20,R21
	.even
_IICRead::
	xcall push_gset2
	mov R22,R18
	movw R20,R16
	.dbline -1
	.dbline 52
; /*********************************************************************************************************
; **                                             Small RTOS(51)
; **                                   The Real-Time Kernel(For Keil c51)
; **
; **                                  (c) Copyright 2002-2003, chenmingji
; **                                           All Rights Reserved
; **
; **                                                  V1.12.1
; **
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文   件   名: IIC_Master.c
; **创   建   人: 陈明计
; **最后修改日期:  2002年12月3日
; **描        述: Small RTOS IIC总线主器件驱动程序源文件,也可以在不使用
; **              Small RTOS的情况下使用(标准51CPU12MHz时100KHz IIc总线
; **              仿真)
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 陈明计
; ** 版  本: V1.00
; ** 日 期: 2003年2月28日
; ** 描 述: 原始版本
; **
; **------------------------------------------------------------------------------------------------------
; ** 修改人:
; ** 版  本:
; ** 日 期:
; ** 描 述:
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人:
; ** 日 期:
; ** 描 述:
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; #include "config.h"
; 
; #define IIC_delay() delay_1us();delay_1us();
; /*********************************************************************************************************
; ** 函数名称: IICRead
; ** 功能描述: 从IIC总线读取数据
; ** 输 入: Ret:存储读取的数据
; **         Addr:IIC从器件地址
; **         Nbyte:读取的字节数目
; ** 输 出: TRUE:成功
; **         FALSE:失败
; ** 全局变量: 无
; ** 调用模块: 无
; ********************************************************************************************************/
; uchar IICRead(uchar *Ret,uchar Addr,uchar NByte)
; {
	.dbline 55
; 	uchar i;
; 
; 	Addr = Addr | 0x01;
	ori R22,1
	.dbline 56
; 	if (IICStart() == FALSE)
	xcall _IICStart
	cpi R16,2
	brne L2
	.dbline 57
; 	{
	.dbline 58
; 		return FALSE;
	ldi R16,2
	xjmp L1
L2:
	.dbline 61
; 	}
; 
; 	if(IICSend(Addr) == FALSE)
	mov R16,R22
	xcall _IICSend
	cpi R16,2
	brne L4
	.dbline 62
; 	{
	.dbline 63
; 		return FALSE;
	ldi R16,2
	xjmp L1
L4:
	.dbline 65
; 	}
; 	i = NByte - 1;
	ldd R22,y+4
	subi R22,1
	.dbline 66
; 	if (i != 0)
	breq L6
	.dbline 67
; 	{
L8:
	.dbline 69
; 		do
; 		{
	.dbline 70
; 			*Ret++ = IICReceive();
	xcall _IICReceive
	movw R30,R20
	st Z+,R16
	movw R20,R30
	.dbline 71
; 			IIC_ACK();
	xcall _IIC_ACK
	.dbline 72
L9:
	.dbline 72
; 		} while (--i != 0);
	mov R24,R22
	subi R24,1
	mov R22,R24
	tst R24
	brne L8
	.dbline 73
; 	}
L6:
	.dbline 74
; 	*Ret = IICReceive();
	xcall _IICReceive
	movw R30,R20
	std z+0,R16
	.dbline 75
; 	IIC_NO_ACK();
	xcall _IIC_NO_ACK
	.dbline 76
; 	IICStop();
	xcall _IICStop
	.dbline 77
; 	return TRUE;
	ldi R16,1
	.dbline -2
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 22 c
	.dbsym l NByte 4 c
	.dbsym r Addr 22 c
	.dbsym r Ret 20 pc
	.dbend
	.dbfunc e IICWrite _IICWrite fc
;              i -> R20
;          NByte -> y+4
;           Data -> R22,R23
;           Addr -> R20
	.even
_IICWrite::
	xcall push_gset2
	movw R22,R18
	mov R20,R16
	.dbline -1
	.dbline 92
; }
; 
; /*********************************************************************************************************
; ** 函数名称: IICWrite
; ** 功能描述: 往IIC总线写数据
; ** 输 入: Addr:IIC从器件地址
; **         Data:存储将要写的数据
; **         Nbyte:写的字节数目
; ** 输 出: TRUE:成功
; **         FALSE:失败
; ** 全局变量: 无
; ** 调用模块: 无
; ********************************************************************************************************/
; uchar IICWrite(uchar Addr,uchar *Data,uchar NByte)
; {
	.dbline 95
; 	uchar i;
; 
; 	Addr = Addr & 0xfe;
	andi R20,254
	.dbline 96
; 	if (IICStart() == FALSE)
	xcall _IICStart
	cpi R16,2
	brne L12
	.dbline 97
; 	{
	.dbline 98
; 		return FALSE;
	ldi R16,2
	xjmp L11
L12:
	.dbline 100
; 	}
; 	if (IICSend(Addr) == FALSE)
	mov R16,R20
	xcall _IICSend
	cpi R16,2
	brne L14
	.dbline 101
; 	{
	.dbline 102
; 		return FALSE;
	ldi R16,2
	xjmp L11
L14:
	.dbline 104
; 	}
; 	i = NByte;
	ldd R20,y+4
L16:
	.dbline 106
; 	do
; 	{
	.dbline 107
; 		if (IICSend(*Data++) == FALSE)
	movw R30,R22
	ld R16,Z+
	movw R22,R30
	xcall _IICSend
	cpi R16,2
	brne L19
	.dbline 108
; 		{
	.dbline 109
; 			return FALSE;
	ldi R16,2
	xjmp L11
L19:
	.dbline 111
L17:
	.dbline 111
; 		}
; 	} while (--i !=0 );
	mov R24,R20
	subi R24,1
	mov R20,R24
	tst R24
	brne L16
	.dbline 112
; 	IICStop();
	xcall _IICStop
	.dbline 113
; 	return TRUE;
	ldi R16,1
	.dbline -2
L11:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym l NByte 4 c
	.dbsym r Data 22 pc
	.dbsym r Addr 20 c
	.dbend
	.dbfunc e IICInit _IICInit fV
	.even
_IICInit::
	.dbline -1
	.dbline 125
; }
; 
; /*********************************************************************************************************
; ** 函数名称: IICInit
; ** 功能描述: IIC总线初始化
; ** 输 入: 无
; ** 输 出: 无
; ** 全局变量: 无
; ** 调用模块: 无
; ********************************************************************************************************/
; void IICInit(void)
; {
	.dbline 126
; 	IIC_SDA_O;
	sbi 0x14,1
	.dbline 127
; 	IIC_SCL_O;
	sbi 0x14,0
	.dbline 128
; 	IIC_SCL_L;
	cbi 0x15,0
	.dbline 129
; 	IICStop();
	xcall _IICStop
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e IICStart _IICStart fc
	.even
_IICStart::
	.dbline -1
	.dbline 142
; }
; 
; /*********************************************************************************************************
; ** 函数名称: IICStart
; ** 功能描述: 发送IIC启动信号
; ** 输 入: 无
; ** 输 出: TRUE:成功
; **         FALSE:失败
; ** 全局变量: 无
; ** 调用模块: 无
; ********************************************************************************************************/
; uchar IICStart(void)
; {
	.dbline 143
; 	IIC_SDA_I;
	cbi 0x14,1
	.dbline 144
; 	IIC_SDA_H;
	sbi 0x15,1
	.dbline 145
; 	IIC_SCL_H;
	sbi 0x15,0
	.dbline 146
; 	if (IIC_DATA)
	sbis 0x13,1
	rjmp L23
	.dbline 147
; 	{
	.dbline 148
; 		IIC_SDA_O;
	sbi 0x14,1
	.dbline 149
; 		IIC_SDA_L;
	cbi 0x15,1
	.dbline 150
; 		IIC_delay();
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	nop
	.dbline 150
	.dbline 151
; 		IIC_SCL_L;
	cbi 0x15,0
	.dbline 152
; 		IIC_SDA_H;
	sbi 0x15,1
	.dbline 153
; 		return TRUE;
	ldi R16,1
	xjmp L22
L23:
	.dbline 156
; 	}
; 	else
; 	{
	.dbline 157
; 		return FALSE;
	ldi R16,2
	.dbline -2
L22:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e IICStop _IICStop fV
	.even
_IICStop::
	.dbline -1
	.dbline 170
; 	}
; }
; 
; /*********************************************************************************************************
; ** 函数名称: IICStop
; ** 功能描述: 发送IIC结束信号
; ** 输 入: 无
; ** 输 出: 无
; ** 全局变量: 无
; ** 调用模块: 无
; ********************************************************************************************************/
; void IICStop(void)
; {
	.dbline 171
; 	IIC_SDA_O;
	sbi 0x14,1
	.dbline 172
; 	IIC_SDA_L;
	cbi 0x15,1
	.dbline 173
; 	IIC_delay();
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	nop
	.dbline 173
	.dbline 174
; 	IIC_delay();
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	nop
	.dbline 174
	.dbline 175
; 	IIC_SCL_H;
	sbi 0x15,0
	.dbline 176
; 	IIC_SDA_H;
	sbi 0x15,1
	.dbline 177
; 	IIC_delay();
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	nop
	.dbline 177
	.dbline 178
; 	IIC_delay();
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	nop
	.dbline 178
	.dbline 179
; 	IIC_delay();
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	nop
	.dbline 179
	.dbline 180
; 	IIC_SCL_L;
	cbi 0x15,0
	.dbline -2
L25:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e IIC_ACK _IIC_ACK fV
	.even
_IIC_ACK::
	.dbline -1
	.dbline 192
; }
; 
; /*********************************************************************************************************
; ** 函数名称: IIC_ACK
; ** 功能描述: 发送IIC应答信号
; ** 输 入: 无
; ** 输 出: 无
; ** 全局变量: 无
; ** 调用模块: 无
; ********************************************************************************************************/
; void IIC_ACK(void)
; {
	.dbline 193
; 	IIC_SDA_O;
	sbi 0x14,1
	.dbline 194
; 	IIC_SDA_L;
	cbi 0x15,1
	.dbline 195
; 	IIC_delay();
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	nop
	.dbline 195
	.dbline 196
; 	IIC_delay();
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	nop
	.dbline 196
	.dbline 197
; 	IIC_SCL_H;
	sbi 0x15,0
	.dbline 198
; 	IIC_delay();
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	nop
	.dbline 198
	.dbline 199
; 	IIC_delay();
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	nop
	.dbline 199
	.dbline 200
; 	IIC_delay();
	nop
	.dbline 200
	nop
	.dbline 200
	nop
	.dbline 200
	nop
	.dbline 200
	nop
	.dbline 200

⌨️ 快捷键说明

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