亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? i2c.inc

?? keilc關于LM75A溫度計的使用例程
?? INC
字號:
;*************************************************************************
;	I2C.INC
;	標準80C51單片機模擬I2C總線的主機程序頭文件
;	Copyright (c) 2006,廣州周立功單片機發展有限公司
;	All rights reserved.
;	本程序僅供學習參考,不提供任何可靠性方面的擔保;請勿用于商業目的
;*************************************************************************


;*************************************************************************
;模擬I2C總線的引腳定義
;*************************************************************************
I2C_SCL	BIT	P3.4
I2C_SDA	BIT	P3.5


;*************************************************************************
;定義I2C總線時鐘的延時值,要根據實際情況修改,取值1~255
;SCL信號周期約為(I2C_DELAY_VALUE*4+12)個機器周期
;*************************************************************************
I2C_DELAY_VALUE	EQU	5


;*************************************************************************
;定義I2C總線停止后在下一次開始之前的等待時間,取值1~65535
;等待時間約為(I2C_STOP_WAIT_VALUE*8)個機器周期
;對于多數器件取值為1即可;但對于某些器件來說,較長的延時是必須的
;*************************************************************************
I2C_STOP_WAIT_VALUE	EQU	1


;*************************************************************************
;定義延時變量,用于宏I2C_Delay()
;*************************************************************************
;unsigned char data I2C_Delay_t;
I2C_Delay_t	DATA	GLOBAL_IRAM	;在主文件里要用SET定義GLOBAL_IRAM的初值
GLOBAL_IRAM	SET	GLOBAL_IRAM+1


;*************************************************************************
;宏定義:I2C_Delay
;功能:延時,模擬I2C總線專用
;*************************************************************************
I2C_Delay	MACRO
		MOV	I2C_Delay_t, #I2C_DELAY_VALUE
		DJNZ	I2C_Delay_t, $
		ENDM


;*************************************************************************
;函數:I2C_Init()
;功能:I2C總線初始化,使總線處于空閑狀態
;說明:在main()函數的開始處,通常應當要執行一次本函數
;*************************************************************************
;void I2C_Init()
I2C_Init:
;{
;	I2C_SCL = 1;
;	I2C_Delay();
;	I2C_SDA = 1;
;	I2C_Delay();
	SETB	I2C_SCL
	I2C_Delay
	SETB	I2C_SDA
	I2C_Delay
;}
	RET


;*************************************************************************
;函數:I2C_Start()
;功能:產生I2C總線的起始狀態
;說明:
;	SCL處于高電平期間,當SDA出現下降沿時啟動I2C總線
;	不論SDA和SCL處于什么電平狀態,本函數總能正確產生起始狀態
;	本函數也可以用來產生重復起始狀態
;	本函數執行后,I2C總線處于忙狀態
;*************************************************************************
;void I2C_Start()
;{
I2C_Start:
;	I2C_SDA = 1;
;	I2C_Delay();
;	I2C_SCL = 1;
;	I2C_Delay();
;	I2C_SDA = 0;
;	I2C_Delay();
;	I2C_SCL = 0;
;	I2C_Delay();
	SETB	I2C_SDA
	I2C_Delay
	SETB	I2C_SCL
	I2C_Delay
	CLR	I2C_SDA
	I2C_Delay
	CLR	I2C_SCL
	I2C_Delay
;}
	RET


;*************************************************************************
;函數:I2C_Write()
;功能:向I2C總線寫1個字節的數據
;參數:
;	dat:要寫到總線上的數據
;*************************************************************************
;void I2C_Write(unsigned char dat)
;dat = R7
I2C_Write:
;{
;	unsigned char t = 8;
;	分配:t = R1
	MOV	R1, #8
	MOV	A, R7
;	do
I2C_Write_do:
;	{
;		I2C_SDA = (bit)(dat & 0x80);
;		dat <<= 1;
		MOV	C, ACC.7
		MOV	I2C_SDA, C
		ADD	A, ACC
;		I2C_SCL = 1;
;		I2C_Delay();
;		I2C_SCL = 0;
;		I2C_Delay();
		SETB	I2C_SCL
		I2C_Delay
		CLR	I2C_SCL
		I2C_Delay
;	} while ( --t != 0 );
	DJNZ	R1, I2C_Write_do
;}
	RET


;*************************************************************************
;函數:I2C_Read()
;功能:從從機讀取1個字節的數據
;返回:讀取的一個字節數據
;*************************************************************************
;unsigned char I2C_Read()
;返回值 = ACC
I2C_Read:
;{
;	unsigned char dat;
;	unsigned char t = 8;
;	分配:dat = ACC
;	分配:t = R1
	MOV	R1, #8
;	I2C_SDA = 1;	//在讀取數據之前,要把SDA拉高
	SETB	I2C_SDA
;	do
I2C_Read_do:
;	{
;		I2C_SCL = 1;
;		I2C_Delay();
;		dat <<= 1;
;		if ( I2C_SDA ) dat |= 0x01;
		SETB	I2C_SCL
		I2C_Delay
		ADD	A, ACC
		JNB	I2C_SDA, I2C_Read_endif
		INC	A
I2C_Read_endif:
;		I2C_SCL = 0;
;		I2C_Delay();
		CLR	I2C_SCL
		I2C_Delay
;	} while ( --t != 0 );
	DJNZ	R1, I2C_Read_do
;	return dat;
;}
	RET


;*************************************************************************
;函數:I2C_GetAck()
;功能:讀取從機應答位
;返回:
;	0:從機應答
;	1:從機非應答
;說明:
;	從機在收到每個字節的數據后,要產生應答位
;	從機在收到最后1個字節的數據后,一般要產生非應答位
;*************************************************************************
;bit I2C_GetAck()
;返回值 = CY
I2C_GetAck:
;{
;	bit ack;
;	分配:ack = CY
;	I2C_SDA = 1;
;	I2C_Delay();
;	I2C_SCL = 1;
;	I2C_Delay();
;	ack = I2C_SDA;
;	I2C_SCL = 0;
;	I2C_Delay();
	SETB	I2C_SDA
	I2C_Delay
	SETB	I2C_SCL
	I2C_Delay
	MOV	C, I2C_SDA
	CLR	I2C_SCL
	I2C_Delay
;	return ack;
;}
	RET


;*************************************************************************
;函數:I2C_PutAck()
;功能:主機產生應答位或非應答位
;參數:
;	ack=0:主機產生應答位
;	ack=1:主機產生非應答位
;說明:
;	主機在接收完每一個字節的數據后,都應當產生應答位
;	主機在接收完最后一個字節的數據后,應當產生非應答位
;*************************************************************************
;void I2C_PutAck(bit ack)
;ack = 0x20.0
I2C_PutAck:
;{
;	I2C_SDA = ack;
;	I2C_Delay();
;	I2C_SCL = 1;
;	I2C_Delay();
;	I2C_SCL = 0;
;	I2C_Delay();
	MOV	C, 0x20.0
	MOV	I2C_SDA, C
	I2C_Delay
	SETB	I2C_SCL
	I2C_Delay
	CLR	I2C_SCL
	I2C_Delay
;}
	RET


;*************************************************************************
;函數:I2C_Stop()
;功能:產生I2C總線的停止狀態
;說明:
;	SCL處于高電平期間,當SDA出現上升沿時停止I2C總線
;	不論SDA和SCL處于什么電平狀態,本函數總能正確產生停止狀態
;	本函數執行后,I2C總線處于空閑狀態
;*************************************************************************
;void I2C_Stop()
I2C_Stop:
;{
;	unsigned int t;
;	分配:t = (R0,R1)
;	I2C_SDA = 0;
;	I2C_Delay();
;	I2C_SCL = 1;
;	I2C_Delay();
;	I2C_SDA = 1;
;	I2C_Delay();
	CLR	I2C_SDA
	I2C_Delay
	SETB	I2C_SCL
	I2C_Delay
	SETB	I2C_SDA
	I2C_Delay
;	t = I2C_STOP_WAIT_VALUE;
	MOV	R0, #HIGH(I2C_STOP_WAIT_VALUE)
	MOV	R1, #LOW(I2C_STOP_WAIT_VALUE)
;	while ( --t != 0 );	//在下一次產生Start之前,要加一定的延時
I2C_Stop_while:
	DJNZ_W	R0,R1, I2C_Stop_while	;宏DJNZ_W的定義見Branch.INC
;}
	RET


;*************************************************************************
;函數:I2C_Puts()
;功能:主機通過I2C總線向從機發送多個字節的數據
;參數:
;	SlaveAddr:從機地址(高7位是從機地址,最低位是寫標志0)
;	SubAddr:從機的子地址
;	Size:數據的字節數
;	*dat:要發送的數據
;返回:
;	0:發送成功
;	1:在發送過程中出現異常
;*************************************************************************
;bit I2C_Puts(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
;SlaveAddr = R7
;SubAddr = R6
;Size = R5
;*dat = (0x08,0x09,0x0A)
I2C_Puts:
;{
;//檢查長度
;	if ( Size == 0 ) return 0;
	CJNE	R5, #0, I2C_Puts_endif1
	CLR	C
	RET
I2C_Puts_endif1:
;//確保從機地址最低位是0
;	SlaveAddr &= 0xFE;
	ANL	0x07, #0xFE
;//啟動I2C總線
;	I2C_Start();
	LCALL	I2C_Start
;//發送從機地址
;	I2C_Write(SlaveAddr);
	LCALL	I2C_Write
;	if ( I2C_GetAck() )
	LCALL	I2C_GetAck
	JNC	I2C_Puts_endif2
;	{
;		I2C_Stop();
		LCALL	I2C_Stop
;		return 1;
		SETB	C
		RET
;	}
I2C_Puts_endif2:
;//發送子地址
;	I2C_Write(SubAddr);
	MOV	A, R6
	MOV	R7, A
	LCALL	I2C_Write
;	if ( I2C_GetAck() )
	LCALL	I2C_GetAck
	JNC	I2C_Puts_endif3
;	{
;		I2C_Stop();
		LCALL	I2C_Stop
;		return 1;
		SETB	C
		RET
;	}
I2C_Puts_endif3:
;//發送數據
;	do
I2C_Puts_do:
;	{
;		I2C_Write(*dat++);
		MOV	R1, 0x08
		MOV	DPH, 0x09
		MOV	DPL, 0x0A
		LCALL	BytePtrLD	;函數BytePtrLD()的定義見Pointer.INC
		MOV	R7, A
		LCALL	I2C_Write
		INC_W	0x09,0x0A	;宏INC_W的定義見Calc.INC
;		if ( I2C_GetAck() )
		LCALL	I2C_GetAck
		JNC	I2C_Puts_endif4
;		{
;			I2C_Stop();
			LCALL	I2C_Stop
;			return 1;
			SETB	C
			RET
;		}
I2C_Puts_endif4:
;	} while ( --Size != 0 );
	DJNZ	R5, I2C_Puts_do
;//發送完畢,停止I2C總線,并返回結果
;	I2C_Stop();
	LCALL	I2C_Stop
;	return 0;
	CLR	C
;}
	RET


;*************************************************************************
;函數:I2C_Put()
;功能:主機通過I2C總線向從機發送1個字節的數據
;參數:
;	SlaveAddr:從機地址(高7位是從機地址,最低位是寫標志0)
;	SubAddr:從機的子地址
;	dat:要發送的數據
;返回:
;	0:發送成功
;	1:在發送過程中出現異常
;*************************************************************************
;bit I2C_Put(unsigned char SlaveAddr, unsigned char SubAddr, char dat)
;SlaveAddr = R7
;SubAddr = R6
;dat = R5
I2C_Put:
;{
	PUSH	0x08
	PUSH	0x09
	PUSH	0x0A
;	return I2C_Puts(SlaveAddr,SubAddr,1,&dat);
	MOV	0x08, #PtrTypeIDATA	;PtrTypeIDATA的定義見Pointer.INC
	MOV	0x09, #0
	PUSH	0x05
	MOV	0x0A, SP
	MOV	R5, #1
	LCALL	I2C_Puts
	DEC	SP
	POP	0x0A
	POP	0x09
	POP	0x08
;}
	RET


;*************************************************************************
;函數:I2C_Gets()
;功能:主機通過I2C總線從從機接收多個字節的數據
;參數:
;	SlaveAddr:從機地址(高7位是從機地址,最低位是讀標志1)
;	SubAddr:從機的子地址
;	Size:數據的字節數
;	*dat:保存接收到的數據
;返回:
;	0:接收成功
;	1:在接收過程中出現異常
;*************************************************************************
;bit I2C_Gets(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
;SlaveAddr = R7
;SubAddr = R6
;Size = R5
;*dat = (0x08,0x09,0x0A)
I2C_Gets:
;{
;//檢查長度
;	if ( Size == 0 ) return 0;
	CJNE	R5, #0, I2C_Gets_endif1
	;注:CJNE執行后,CY會自動清0
	RET
I2C_Gets_endif1:
;//確保從機地址最低位是0
;	SlaveAddr &= 0xFE;
	ANL	0x07, #0xFE
;//啟動I2C總線
;	I2C_Start();
	LCALL	I2C_Start
;//發送從機地址
;	I2C_Write(SlaveAddr);
	LCALL	I2C_Write
;	if ( I2C_GetAck() )
	LCALL	I2C_GetAck
	JNC	I2C_Gets_endif2
;	{
;		I2C_Stop();
		LCALL	I2C_Stop
;		return 1;
		SETB	C
		RET
;	}
I2C_Gets_endif2:
;//發送子地址
;	I2C_Write(SubAddr);
	PUSH	0x07
	MOV	A, R6
	MOV	R7, A
	LCALL	I2C_Write
	POP	0x07
;	if ( I2C_GetAck() )
	LCALL	I2C_GetAck
	JNC	I2C_Gets_endif3
;	{
;		I2C_Stop();
		LCALL	I2C_Stop
;		return 1;
		SETB	C
		RET
;	}
I2C_Gets_endif3:
;//發送重復起始條件
;	I2C_Start();
	LCALL	I2C_Start
;//發送從機地址
;	SlaveAddr |= 0x01;
	INC	R7
;	I2C_Write(SlaveAddr);
	LCALL	I2C_Write
;	if ( I2C_GetAck() )
	LCALL	I2C_GetAck
	JNC	I2C_Gets_endif4
;	{
;		I2C_Stop();
		LCALL	I2C_Stop
;		return 1;
		SETB	C
		RET
;	}
I2C_Gets_endif4:
;//接收數據
;	for (;;)
I2C_Gets_for:
;	{
;		*dat++ = I2C_Read();
		LCALL	I2C_Read
		MOV	R1, 0x08
		MOV	DPH, 0x09
		MOV	DPL, 0x0A
		LCALL	BytePtrST	;函數BytePtrST()的定義見Pointer.INC
		INC_W	0x09,0x0A	;宏INC_W的定義見Calc.INC
;		if ( --Size == 0 )
		DJNZ	R5, I2C_Gets_endif5
;		{
;			I2C_PutAck(1);
			PUSH	0x20
			SETB	0x20.0
			LCALL	I2C_PutAck
			POP	0x20
;			break;
			SJMP	I2C_Gets_endfor
;		}
I2C_Gets_endif5:
;		I2C_PutAck(0);
		PUSH	0x20
		CLR	0x20.0
		LCALL	I2C_PutAck
		POP	0x20
;	}
	SJMP	I2C_Gets_for
I2C_Gets_endfor:
;//接收完畢,停止I2C總線,并返回結果
;	I2C_Stop();
	LCALL	I2C_Stop
;	return 0;
	CLR	C
;}
	RET


;*************************************************************************
;函數:I2C_Get()
;功能:主機通過I2C總線從從機接收1個字節的數據
;參數:
;	SlaveAddr:從機地址(高7位是從機地址,最低位是讀標志1)
;	SubAddr:從機的子地址
;	*dat:保存接收到的數據
;返回:
;	0:接收成功
;	1:在接收過程中出現異常
;*************************************************************************
;bit I2C_Get(unsigned char SlaveAddr, unsigned char SubAddr, char *dat)
;SlaveAddr = R7
;SubAddr = R6
;*dat = (0x08,0x09,0x0A)
I2C_Get:
;{
	PUSH	0x05
;	return I2C_Gets(SlaveAddr,SubAddr,1,dat);
	MOV	R5, #1
	LCALL	I2C_Gets
	POP	0x05
;}
	RET

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99精品国产一区二区三区不卡| 91精选在线观看| 欧美日韩免费视频| 国产精品无圣光一区二区| 舔着乳尖日韩一区| 91麻豆精品秘密| 国产视频911| 视频在线观看一区二区三区| 97se亚洲国产综合自在线不卡| 精品国产精品网麻豆系列| 午夜精彩视频在线观看不卡| 91麻豆123| 亚洲欧洲日韩在线| 成人一区二区三区| 久久久久综合网| 国产一区二区视频在线| 91精品欧美久久久久久动漫| 一区二区三区免费观看| 91免费看`日韩一区二区| 欧美激情综合五月色丁香 | 中文字幕一区二| 国产一区二区三区四区五区入口 | 久久这里只精品最新地址| 日韩中文字幕亚洲一区二区va在线 | www.亚洲精品| 国产精品美女久久久久久久网站| 国产精一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av | 亚洲精品国产品国语在线app| 国产.精品.日韩.另类.中文.在线.播放| 日韩欧美电影一二三| 欧美aaaaaa午夜精品| 日韩三级.com| 国产麻豆日韩欧美久久| 国产欧美精品国产国产专区| 国产伦理精品不卡| 国产精品乱人伦| 91小视频免费观看| 夜色激情一区二区| 欧美日本在线观看| 男男视频亚洲欧美| 欧美精品一区二区三区很污很色的 | 欧美日韩精品综合在线| 日本中文一区二区三区| 日韩欧美激情四射| 国产成人午夜片在线观看高清观看| 久久蜜桃av一区精品变态类天堂| 国产毛片精品视频| 亚洲人成人一区二区在线观看| 色噜噜狠狠成人网p站| 亚洲超碰精品一区二区| 亚洲精品在线三区| 99久久精品国产观看| 亚洲国产视频一区二区| 欧美一区二区黄色| 成人污污视频在线观看| 亚洲精品欧美激情| 日韩欧美区一区二| 91性感美女视频| 免费视频最近日韩| 国产精品免费久久| 宅男在线国产精品| 国产99精品在线观看| 亚洲图片欧美色图| 久久人人97超碰com| 欧洲av一区二区嗯嗯嗯啊| 美女视频第一区二区三区免费观看网站 | 中文字幕一区二区三区在线观看| 欧美性感一类影片在线播放| 久久99精品久久久久婷婷| 亚洲天堂成人在线观看| 日韩免费高清电影| 在线观看视频一区| 国产高清视频一区| 日韩av一区二区三区| 最近中文字幕一区二区三区| 日韩天堂在线观看| 欧美特级限制片免费在线观看| 国产乱对白刺激视频不卡| 亚洲电影一级片| 亚洲欧美一区二区在线观看| 精品久久久久久久人人人人传媒 | 成人av在线播放网站| 免费看日韩a级影片| 亚洲美女屁股眼交3| 久久综合999| 91精品国产色综合久久不卡蜜臀| 91免费国产在线| 国产精品18久久久久久久网站| 偷拍一区二区三区| 国产精品久久久久久久久搜平片| 91精品国产综合久久精品麻豆| 色婷婷综合五月| 丁香天五香天堂综合| 蜜桃精品视频在线| 水蜜桃久久夜色精品一区的特点| 亚洲三级在线免费| 日韩理论在线观看| 国产欧美一二三区| 国产性天天综合网| 久久久久亚洲蜜桃| 精品久久久久久久一区二区蜜臀| 欧美一区二区三区四区五区| 欧美日韩国产中文| 欧美日韩国产一二三| 欧美午夜精品理论片a级按摩| av午夜一区麻豆| 成人av在线网| 不卡电影一区二区三区| 成人激情视频网站| 本田岬高潮一区二区三区| 成人性生交大片免费看视频在线| 激情成人综合网| 国产精品77777竹菊影视小说| 国产一区二区三区高清播放| 国产美女久久久久| 高清成人免费视频| av一区二区不卡| 91蜜桃在线免费视频| 欧美亚洲国产一区二区三区| 欧美日韩国产在线播放网站| 欧美高清视频不卡网| 久久青草欧美一区二区三区| 久久五月婷婷丁香社区| 久久蜜桃一区二区| 国产精品初高中害羞小美女文| 亚洲欧洲在线观看av| 亚洲自拍偷拍网站| 视频一区免费在线观看| 看国产成人h片视频| 国产一区高清在线| 99v久久综合狠狠综合久久| 欧美午夜片在线观看| 日韩视频一区二区在线观看| 久久久久88色偷偷免费| 综合久久久久综合| 日韩av高清在线观看| 国产精品亚洲视频| 色播五月激情综合网| 欧美v日韩v国产v| 国产精品第一页第二页第三页 | 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美精品久久久久久久久老牛影院 | 亚洲国产精品一区二区久久| 日韩电影在线观看一区| 国产麻豆视频精品| 欧美亚洲综合在线| 久久久美女毛片| 亚洲一区二区三区在线| 国产真实乱对白精彩久久| 成人app网站| 91.com在线观看| 国产日韩欧美一区二区三区乱码 | 国产在线不卡一卡二卡三卡四卡| 成人av网在线| 制服丝袜亚洲播放| 日本一区二区高清| 日韩激情一区二区| 91碰在线视频| 精品免费国产二区三区| 亚洲精品国产精华液| 国产精品888| 日韩欧美一二区| 一区二区三区日韩精品视频| 国产成人午夜99999| 91 com成人网| 亚洲男人的天堂一区二区| 韩国成人在线视频| 欧美高清hd18日本| 亚洲欧美日韩中文字幕一区二区三区 | 日韩av不卡一区二区| 色综合天天综合狠狠| 国产欧美日韩综合精品一区二区| 亚洲大片在线观看| 91麻豆文化传媒在线观看| 国产日韩av一区| 经典三级在线一区| 在线观看91av| 一区二区国产盗摄色噜噜| 高清免费成人av| 国产女人18水真多18精品一级做| 三级在线观看一区二区 | 色综合天天性综合| 日本一区二区三级电影在线观看| 丝瓜av网站精品一区二区| 欧美日韩亚洲综合一区二区三区| 国产精品人成在线观看免费| 国产剧情一区二区三区| 欧美成人福利视频| 日韩avvvv在线播放| 欧美日韩第一区日日骚| 亚洲18女电影在线观看| 精品视频1区2区3区| 亚洲1区2区3区4区| 欧美情侣在线播放| 日韩专区在线视频| 91精品国产乱码久久蜜臀| 日韩精品1区2区3区| 91精品在线一区二区| 免费不卡在线观看|