当前位置: 网站首页 > 技术应用 > 单片机应用 > 应用范例

MCU与24C02通讯范例

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能说明:24c02的读写控制
;文件名:atw24c02.ASM
;mcu:	8p53/56
eeprom:	24lc02
fsys:	4MHZ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
c	equ	00h
z	equ	02h	;零标志位
indf	equ	00h	;间接寻址
tmr0	equ	01h	;定时器0
pcl	equ	02h	;程序记数器
status	wqu	03h	;状态寄存器
fsr	equ	04h	;间接寻址地址寄存器
porta	equ	05h	;端口控制寄存器
portb	equ	06h	;端口控制寄存器
pcon	equ	08h	;电源控制寄存器
wucon	equ	09h	;唤醒/电平变化中断控制寄存器
pchbuf	equ	0ah	;程序高位记数器
pdcon	equ	0bh	;下拉电阻
odcon	equ	0ch	;开漏极输出
phcon	equ	0dh	;上拉电阻
int_en	equ	0eh	;中断控制
intflag	equ	0fh	;中断标志

count	equ	010h	;数据个数
temp	equ	013h	;临时寄存器
temp1	equ	014h	;临时寄存器
address	equ	015h	;地址
data0	equ	016h	;数据

scl	equ	7	;时钟
sda	equ	6	;数据

flag	equ	03fh	;标志寄存器
error	equ	0	;错误标志位
;====================================================
;====================================================
;====================================================
	org	00h
	call	initial	;初始化IC
	goto	main
	org	08h
	retfie		;退出中断
main:
	clrr	flag	;清除标志寄存器
	movia	00h	;写入地址
	movar	address
	movia	a5h	;写入数据
	movar	data0
	call	write24c02;写数据
	call	delay10ms	;确保数据已写入
	call	read_24c02	;读取数据
	call	aknow_end_out	;如果续读数据发送aknow_out
	call	stop		;结束读数据
	movr	data0,0
	subar	temp,0
	btrss	status,2
	goto	main
complete:
	goto	complete	;写入完成
;========================================================
;========================================================
;========================================================
write24c02:
	bcr	flag,error	;清标志位
	call	start		;发送启动写信号
	movia	0a0h		;发送IC地址
	movar	temp
	call	byte_write
	call	aknowledge
	btrsc	flag,error	;检测确认信号
	goto	write24c02	;失败的话重新发送
	movr	address,0
	movar	temp		;发送地址
	call	byte_write
	call	aknowledge
	btrsc	flag,error
	goto	write24c02
	movr	data0,0
	movar	temp
	call	byte_write
	call	aknowledge
	btrsc	flag,error	;检测确认信号
	goto	write24c02
	call	stop
	return
;=======================================================
;=======================================================
;========================================================
read_24c02:
	call	start	;发送启动写24c02的信号
	movia	0a0h	;发送IC的地址
	movar	temp
	call	byte_write
	call	aknowledge
	btrsc	flag,error	;检测确认信号
	goto	read_24c02	;失败的话重新发送
	movr	address,0	;发送地址
	movar	temp
	call	byte_write
	call	aknowledge
	btrsc	flag,error	;检测确认信号
	goto	read_24c02	;失败的话重新发送
	call	start
	movia	0a1h		;发送读字节命令
	movar	temp
	call	byte_write
	call	aknowledge
	btrsc	flag,error	;检测确认信号
	goto	read_24c02	;失败的话重新发送
	call	byte_read	;启动读数据
	return
;==========================================================
;==========================================================
;==========================================================
byte_read:
	movia	08h
	movar	count
	movia	040h
	iost	portb
read_start:
	bcr	portb,scl
	call	delay5us
read_out:
	bsr	portb,scl
	bcr	status,c
	btrsc	portb,sda
	bsr	status,c
	rlr	temp,1
	decrsz	count,1
	goto	read_start
	movia	00h
	iost	portb
	bcr	portb,scl
	return
;============================================================
;============================================================
;============================================================
aknow_out:
	bcr	portb,sda
	nop
	nop
	nop
	nop
	bsr	portb,scl
	nop
	nop
	return
;============================================================
;============================================================
aknow_end_out:
	bcr	portb,scl
	bsr	portb,sda
	movia	00h
	iost	portb
	nop
	nop
	bsr	portb,scal
	nop
	nop
	return
;=============================================================
;=============================================================
aknowledge:
	movia	040h
	iost	portb
	bsr	portb,scl
	call	delay5us
	btrsc	portb,sda
	bsr	flag,error
	movia	00h
	iost	portb
	bcr	portb,scl
	return
;=============================================================
;=============================================================
;=============================================================
byte_write:
	movia	08h
	movar	count
write_start:
	btrss	temp,7
	goto	write0
	bsr	portb,sda
	goto	write_count
write0:
	bcr	portb,sda
write_count:
	rlr 	temp,1
	bsr	portb,scl
	call	delay5us
	bcr	portb,scl
	decrsz	count,1
	goto	write_start
	return
;=============================================================
;=============================================================
;============================================================
start:
	bcr	portb,scl
	bcr	portb,sda
	call	delay5us
	bsr	portb,sda
	call	delay5us
	bsr	portb,scl
	call	delay5us
	bcr	portb,sda
	call	delay5us
	bcr	portb,scl
	return
;=============================================================
;=============================================================
stop:
	bcr	portb,scl
	bcr	portb,sda
	call	delay5us
	bsr	portb,scl
	call	delay5us
	bsr	portb,sda
	call	delay5us
	bcr	portb,scl
	return
;=============================================================
;=============================================================
;=============================================================
delay10ms:
	clrr	temp
	movia	09h
	movar	temp1
delay10ms1:
	nop
	decrsz	temp,1
	goto	delay10ms1
	decrsz	temp1,1
	goto	delay10ms1
	return
;=============================================================
;=============================================================
delay5us:
	nop
	return
;==============================================================
;==============================================================
;==============================================================
initial:
	movia	020h	;打开LVDT
	movar	pcon
	movia	00h	;关闭portb口电平变化唤醒
	movar	wucon
	movia	0ffh
	movar	pdcon	;关闭下拉电阻
	movia	00h
	movar	odcon	;关闭开漏极输出
	movia	0ffh
	movar	phcon	;关闭上拉电阻
	movia	00h
	option
	movia	00h
	iost	porta
	movia	00h
	iost	portb
	movia	00h
	movar	porta
	movia	00h
	movar	portb
	movia	00h
	movar	int_en
	clrr	flag
	return
	
	
点击次数:  【关闭
  • 壹零零单片机©版权所有 2008-2023 粤ICP备17151077号

Powered by  xinfuke  5.2.5 ©2008-2024  www.100mcu.com