;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;功能说明:24c02的读写控制 ;文件名:atw24c02.ASM ;mcu: atw8p53/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