PIC单片机的AT24C64通讯设计

发布者:独行于世最新更新时间:2020-01-08 来源: eefocus关键字:PIC单片机  AT24C64  通讯设计 手机看文章 扫描二维码
随时随地手机看文章

该程序实现的功能是:

将I2C_A,I2C_B.。...I2C_K内容写入EEPROM


同时在EEPROM中读出数据从新写入各个寄存器

PIC单片机的AT24C64通讯设计
 

LISTP=16C74B

#include

ERRORLEVEL-302

I2C_AEQU0X20

I2C_BEQU0X21

I2C_CEQU0X22

I2C_DEQU0X23

I2C_EEQU0X24

I2C_FEQU0X25

I2C_GEQU0X26

REG1EQU0X2B

REG2EQU0X2C

COUNTEQU0X71;I2C

BCOUNTEQU0X72;I2C

TXBUFEQU0X73;I2C

RXBUFEQU0X74;I2C

BUSCONEQU0X75;I2C

BUSSTAEQU0X76;I2C

I2CBUFEQU0X77;I2C

SLAVEADDREQU0XA0;I2C

DATAADDRHEQU0X01;I2C

DATAADDRLEQU0X00;I2C

;---------------------------------------

;BUSCON

;---------------------------------------

SLAVE_RWEQU7

LAST_BYTE_RXEQU6

SLAVE_ACTIVEEQU5

TIME_OUTEQU4

;---------------------------------------

;BUSSTA

;---------------------------------------

BUS_BUSYEQU7

TX_PROGRESSEQU6

RX_PROGRESSEQU5

TX_SUCCESSEQU4

RX_SUCCESSEQU3

FATAL_ERROREQU2;SLAVEEEPROM

ABORTEQU1

ACK_ERROREQU0

;---------------------------------------

R_NOT_WEQU0

TRUEEQU1

FALSEEQU0

SDAEQU0X04;I2C

SCLEQU0X03;I2C

;=======================================

ORG0X00

GOTOSTART

ORG0X20

STARTBCFSTATUS,RP1

BCFSTATUS,RP0

CLRFRA

CLRFRB

CLRFRC

CLRFRD

CLRFRE

BSFSTATUS,RP0

CLRFTRISA

CLRFTRISB

CLRFTRISC

CLRFTRISD

CLRFTRISE

MOVLW0X02

MOVWFI2C_A

MOVLW0X04

MOVWFI2C_B

MOVLW0X03

MOVWFI2C_C

MOVLW0X03

MOVWFI2C_D

MOVLW0X05

MOVWFI2C_E

MOVLW0X06

MOVWFI2C_F

MOVLW0X04

MOVWFI2C_G

;=======================================

START1

CALLI2CBUS_INIT

CALLREGTOI2CBUF

CALLI2CWRITE

CALLCLRI2CBUF

CALLD10

CALLI2CREAD

CALLI2CBUFTOREG

GOTOSTART1

;=======================================

;CLRI2CBUF

;---------------------------------------

CLRI2CBUF

BCFSTATUS,RP0

MOVLWI2CBUF

MOVWFFSR

MOVLW0X08

MOVWFCOUNT

CLRLOOPCLRFINDF

INCFFSR,F

DECFSZCOUNT,F

GOTOCLRLOOP

RETURN

;---------------------------------------

;将各个REGSTER数据写入I2CBUF缓冲区

;---------------------------------------

REGTOI2CBUF

BCFSTATUS,RP0

MOVLWI2CBUF

MOVWFFSR

MOVFI2C_A,W

MOVWFINDF

INCFFSR,F

MOVFI2C_B,W

MOVWFINDF

INCFFSR,F

MOVFI2C_C,W

MOVWFINDF

INCFFSR,F

MOVFI2C_D,W

MOVWFINDF

INCFFSR,F

MOVFI2C_E,W

MOVWFINDF

INCFFSR,F

MOVFI2C_F,W

MOVWFINDF

INCFFSR,F

MOVFI2C_G,W

MOVWFINDF

RETURN

;---------------------------------------

;将I2CBUF缓冲区数据写入各个REGSTER

;---------------------------------------

I2CBUFTOREG

BCFSTATUS,RP0

MOVLWI2CBUF

MOVWFFSR

MOVFINDF,W

MOVWFI2C_A

INCFFSR,F

MOVFINDF,W

MOVWFI2C_B

INCFFSR,F

MOVFINDF,W

MOVWFI2C_C

INCFFSR,F

MOVFINDF,W

MOVWFI2C_D

INCFFSR,F

MOVFINDF,W

MOVWFI2C_E

INCFFSR,F

MOVFINDF,W

MOVWFI2C_F

INCFFSR,F

MOVFINDF,W

MOVWFI2C_G

RETURN

;=======================================

;将I2CBUF缓冲区内的数据写入EEPROM

;=======================================

I2CWRITE

CALLI2CSTART

BTFSSBUSSTA,BUS_BUSY

GOTOTX_FAIL

BCFBUSCON,SLAVE_RW

CALLTX_SLAVE_ADDR

BTFSSBUSSTA,TX_SUCCESS;SUCESSFULL?

GOTOTX_FAIL

CALLTX_DATA_ADDR

BTFSSBUSSTA,TX_SUCCESS

GOTOTX_FAIL

MOVLWI2CBUF

MOVWFFSR

MOVLW07

MOVWFCOUNT

T_BYTE_LOOP

MOVFINDF,W

MOVWFTXBUF

CALLI2CTXB

BTFSSBUSSTA,TX_SUCCESS

GOTOTX_FAIL

INCFFSR,F

DECFSZCOUNT,F

GOTOT_BYTE_LOOP

GOTOTX_PASS

TX_FAILCALLI2CSTOP

BCFBUSSTA,TX_PROGRESS

BCFBUSSTA,TX_SUCCESS

RETLWFALSE

TX_PASS

CALLI2CSTOP

BCFBUSSTA,TX_PROGRESS

RETLWTRUE

;---------------------------------------

;从EEPROM中读出数据到I2CBUF寄存器

;---------------------------------------

I2CREADBCFSTATUS,RP0

BCFBUSSTA,RX_SUCCESS

CALLI2CSTART

BTFSSBUSSTA,BUS_BUSY

GOTORX_FAIL

BCFBUSCON,SLAVE_RW

CALLTX_SLAVE_ADDR

BTFSSBUSSTA,TX_SUCCESS

GOTORX_FAIL

CALLTX_DATA_ADDR

BTFSSBUSSTA,TX_SUCCESS

GOTORX_FAIL

CALLI2CSTART

BSFBUSCON,SLAVE_RW

CALLTX_SLAVE_ADDR

BTFSSBUSSTA,TX_SUCCESS

GOTORX_FAIL

BCFBUSSTA,LAST_BYTE_RX

MOVLWI2CBUF

MOVWFFSR

MOVLW07

MOVWFCOUNT

R_BYTE_LOOP

MOVLW0X01

XORWFCOUNT,W

BTFSCSTATUS,Z

BSFBUSSTA,LAST_BYTE_RX

CALLI2CRXB

BTFSSBUSSTA,RX_SUCCESS

GOTORX_FAIL

MOVFRXBUF,W

MOVWFINDF

INCFFSR,F

DECFSZCOUNT,F

GOTOR_BYTE_LOOP

GOTORX_PASS

RX_FAILCALLI2CSTOP

BCFBUSSTA,RX_PROGRESS

BCFBUSSTA,RX_SUCCESS

RETLWFALSE

RX_PASSCALLI2CSTOP

BCFSTATUS,RP0

BCFBUSSTA,TX_PROGRESS

BCFBUSSTA,RX_PROGRESS

BSFBUSSTA,RX_SUCCESS

RETLWTRUE

;=======================================

;I2C初始化

;=======================================

I2CBUS_INIT

BCFSTATUS,RP0

MOVFRC,W

ANDLW0X18

MOVWFRC

CLRFBUSSTA

CLRFBUSCON

RETURN

;=======================================

;传送设备地址

;入口:BUSCON

;出口:BUSSTA

;=======================================

TX_SLAVE_ADDR

BCFSTATUS,RP0

BCFBUSSTA,ACK_ERROR

MOVLWSLAVEADDR

MOVWFTXBUF

BTFSCBUSCON,SLAVE_RW

BSFTXBUF,R_NOT_W

CALLI2CTXB

BTFSCBUSSTA,TX_SUCCESS

GOTOTXADDR_SUCCESS

CLRWDT

BTFSSBUSSTA,ACK_ERROR

CALLI2CSTOP

GOTOTXADDR_END

TXADDR_SUCCESS

CLRWDT

TXADDR_END

RETURN

;=======================================

;TX_DATA_ADDR发送写/读的地址

;=======================================

TX_DATA_ADDR

BCFSTATUS,RP0

MOVLWDATAADDRH

MOVWFTXBUF

CALLI2CTXB

BCFSTATUS,RP0

BTFSSBUSSTA,TX_SUCCESS

GOTOTX_DATA_ADDR_ERROR

MOVLWDATAADDRL

MOVWFTXBUF

CALLI2CTXB

BCFSTATUS,RP0

BTFSSBUSSTA,TX_SUCCESS

GOTOTX_DATA_ADDR_ERROR

GOTOTX_DATA_END

TX_DATA_ADDR_ERROR

BCFBUSSTA,TX_PROGRESS

BCFBUSSTA,TX_SUCCESS

BSFBUSSTA,ACK_ERROR

TX_DATA_END

RETURN

;=======================================

;向EEPROM输出一个8位数据,并检测EEPROM的ACK信号

;入口:TXBUF寄存器

;BUSSTA寄存器

;出口:EEPROM存储器

;BUSSTA寄存器

;======================================

I2CTXBBCFSTATUS,RP0

BSFBUSSTA,TX_PROGRESS

BCFBUSSTA,TX_SUCCESS

MOVLW0X08

MOVWFBCOUNT

TXLOOPCLRWDT

BSFSTATUS,RP0

BCFTRISC,SCL

NOP

BCFTRISC,SDA

BCFSTATUS,RP0

RLFTXBUF,F

BSFSTATUS,RP0

BTFSCSTATUS,C

BSFTRISC,SDA

NOP

BSFTRISC,SCL

NOP

NOP

BCFSTATUS,RP0

DECFSZBCOUNT,F

GOTOTXLOOP

;---------------------------------------

;检测是EEPROM否有ACK信号产生,产生为正常

;检测方法:

;1.将RC口的SCL.SDA分别设置为输出和输入状态

;2.延时2个指令周期,将SCL设置为高电平

;3.延时2个指令周期,检测RC口SDA的状态

;4.如果为高电平,设置错误状态,返回

;5.如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行

;---------------------------------------

BSFSTATUS,RP0

BCFTRISC,SCL

BSFTRISC,SDA

NOP

NOP

BSFTRISC,SCL

NOP

BCFSTATUS,RP0

BTFSCRC,SDA

GOTOTX_ERR

BSFSTATUS,RP0

BCFTRISC,SCL

BCFSTATUS,RP0

BCFBUSSTA,TX_PROGRESS

BSFBUSSTA,TX_SUCCESS

BCFBUSSTA,ACK_ERROR

GOTOTX_END

TX_ERRBCFBUSSTA,TX_PROGRESS

BCFBUSSTA,TX_SUCCESS

BSFBUSSTA,ACK_ERROR

TX_ENDRETURN

;=======================================

;从EEPROM中读出8位的数据,并发送发送ACK信号

;入口:EEPROM存储器

;BUSCON寄存器

;出口:RXBUF寄存器

;BUSSTA寄存器

;=======================================

I2CRXBBCFSTATUS,RP0

BSFBUSSTA,RX_PROGRESS

BCFBUSSTA,RX_SUCCESS

MOVLW0X08

MOVWFBCOUNT

RXLOOPCLRWDT

BSFSTATUS,RP0

BCFTRISC,SCL;定义TRISC为输出

BSFTRISC,SDA;定义TRISC为输入

NOP

NOP

BSFTRISC,SCL;TRISC输出高电平

NOP

BCFSTATUS,RP0

BCFSTATUS,C

BTFSCRC,SDA;原指令为BTFSCTRISC,SDA

BSFSTATUS,C

RLFRXBUF,F

DECFSZBCOUNT,F

GOTORXLOOP

;---------------------------------------

;发送ACK信号到EEPROM

;判断接收的是否为最后一个字节

;LAST_BYTE_RX为1,是SDA发送一个高电平,结束

;LAST_BYTE_RX为0,不是SDA发送一个低电平ACK,继续接收

;---------------------------------------

BSFSTATUS,RP0

BCFTRISC,SCL

BCFTRISC,SDA

BTFSCBUSCON,LAST_BYTE_RX;检测是否是最后一个字节

BSFTRISC,SDA;是最后一个字节

NOP;发送ACK信号

BSFTRISC,SCL

NOP

NOP

NOP

NOP

BCFTRISC,SCL

BCFSTATUS,RP0

BCFBUSSTA,RX_PROGRESS

BSFBUSSTA,RX_SUCCESS

RETURN

;=======================================

;I2C开始信号

;输入:无

;输出:BUFSSTA

;=======================================

I2CSTART

BSFSTATUS,RP0

BSFTRISC,SDA;1US

NOP;1US

BSFTRISC,SCL;1US

NOP

NOP

BCFTRISC,SDA

NOP

NOP

BCFSTATUS,RP0

BSFBUSSTA,BUS_BUSY

RETURN

;=======================================

;I2C结束信号

;输入:无

;输出:BUSSTA

;=======================================

I2CSTOP

BSFSTATUS,RP0

BCFTRISC,SCL

BCFTRISC,SDA

BSFTRISC,SCL

NOP

NOP

BSFTRISC,SDA

NOP

BCFSTATUS,RP0

BCFBUSSTA,BUS_BUSY

RETURN

;=======================================

;D10@

;cLOCkin4MHz

;delay10ms

;=======================================

D10MOVLW0X0D

MOVWFREG1

LOOP2MOVLW0XFF

MOVWFREG2

LOOP1DECFSZREG2,f

GOTOLOOP1

DECFSZREG1,f

GOTOLOOP2

RETURN

;=======================================

I2CERRCLRWDT

NOP

NOP

NOP

RETURN

END

关键字:PIC单片机  AT24C64  通讯设计 引用地址:PIC单片机的AT24C64通讯设计

上一篇:PIC单片机警报声程序设计
下一篇:PIC单片机INT0中断的原理

推荐阅读最新更新时间:2024-11-02 19:58

PIC单片机用CCP1模块产生10位PWM波形程序
//该程序用于使CCP1模块产生分辨率为10位的PWM波形,占空比为50% #include p18f452.h void CCP1NIT(void) { CCPR1L=0x7f; CCP1CON=0x3c; //设置CCP1模块为PWM工作方式,且其工作 //循环的低2位为11,高8位为01111111=7F //高电平时间=(CCPR1L:CCP1CON 5:4 )*Tosc*(TMR2预分频) INTCON=0x00; //禁止总中断和外围中断 PR2=0xff; //设置PWM的工作周期=(PR2+1)*4*Tosc*(TMR2预分频) TRISC=0xfb; //设置CCP1引脚为输出方
[单片机]
PIC单片机与液晶显示模块DMF5001N的接口应用
  DMF5001N图形液晶显示模块由一块160×128点阵单屏结构的液晶显示器件、两片T6961B、两片T6A39、一片T6963C及其8KRAM以及配套电路组成。T6963C有一内置字符器CGROM,共有128个5×7点阵ASCII字符;它有64K的显示RAM,用户可在其中方便地设置文本、图形和用户自定义的显示数据缓冲区。从而DMF5001N不仅可显示汉字,还可显示ASCII字符和各种曲线;它可以选择文本与图形之间的逻辑“与”、“或”、“异或”等组合,可以实现反显、闪烁、滚屏、翻页及动画等多种显示功能,还具有多种光标显示功能。因此可将它与单片机连接构成功能强、结构简单、人机界面友好的各种智能仪表和控制系统。   PIC16
[单片机]
<font color='red'>PIC单片机</font>与液晶显示模块DMF5001N的接口应用
PIC单片机的数制转换
如果使用PICC编译器对PIC单片机的数制进行转换,我认为嵌套汇编是最好的办法,这样可以节省更多的空间,相对PIC一般的小容量芯片来说是最好的,下面是我做的从BCD转到BIN和从BIN转到BCD的程序。本程序使用时还有个限制,那就是BINTOBCD的二进制数要小于0x64,这样转换出来的数据才能到99以内,另外一个就BCDTOBIN最好有个数据判断功能。可能写的不是很标准,请高手指正。 另外一个是数据的反转,比如高位在前反转到低位在前,我也认为这样的程序最好使用汇编,当然我没有看编译器编译出来的效率,估计会占用更多的FLASH。 下面是数制转换的程序: //在使用前要定义几个全局变量 volatile unchar FDATA
[单片机]
PIC单片机之关于超大数组问题
关于超大数组问题: 本实验用的编译器是xc16-gcc.exe,集成开发环境是MPLAB IDE v8.92,当前的编译器配置如下: -g -Wall -mlarge-code -mlarge-data -Os -fno-ivopts 如下图: 其中这里有一个超大的数组: 这时候编译会有这样的一个错误: 从提示可以知道,这是一个数据超出的错误,但是这里是超出了数据段,而不是说超出了芯片的flash,我们可以这样查看是否超过了flash,去掉这个数组编译看看占用了多少flash,如下: 也就是说占用的flash空间是:81459+7674=89133,但是单片机的flash却是这样的: 所以即是加上
[单片机]
<font color='red'>PIC单片机</font>之关于超大数组问题
关于PIC单片机的14个问题及解答
关于PIC单片机的14个问题及解答 对于一个高可靠性的系统设计,晶体的选择非常重要,尤其设计带有睡眠唤醒(往往用低电压以求低功耗)的系统。这是因为低供电电压使提供给晶体的激励功率减少,造成晶体起振很慢或根本就不能起振。这一现象在上电复位时并不特别明显,原因时上电时电路有足够的扰动,很容易建立振荡。在睡眠唤醒时,电路的扰动要比上电时小得多,起振变得很不容易。在振荡回路中,晶体既不能过激励(容易振到高次谐波上)也不能欠激励(不容易起振)。晶体的选择至少必须考虑:谐振频点、负载电容、激励功率、温度特性、长期稳定性。 2、如何判断电路中晶振是否被过分驱动? 电阻RS常用来防止晶振被过分驱动。过分驱动晶振会渐渐损耗减少晶振的接触电
[单片机]
关于<font color='red'>PIC单片机</font>的14个问题及解答
利用PIC单片机的蓄电池充电智能管理器设计实例
为了在蓄电池充满电后能够自动断电,利用PIC单片机设计了蓄电池充电专用管理器。该管理器具有自我学习的功能,智能记忆蓄电池满充状态,能适应现有的各种蓄电池充电器,对蓄电池进行智能充电,最大限度地保护电池,延长使用寿命。在无人看管的情况下,蓄电池充满电后自动断电,有效避免火灾隐患和电器故障的发生,也能节约宝贵的电能。 现有的蓄电池充电器中有很多质量低劣的不合格产品,有的劣质充电器实际上就是一个没有安全保证的简易变压器,大部分充电器在蓄电池充满电后不进行智能断电而长期处于浮充状态,对电池的寿命会有一定的影响;现有的充电管理器普遍不具备自我学习功能,无法判断电池的充电状态,不能在蓄电池已充满电的情况下智能的切断电源。本文设计一种蓄电池充电
[电源管理]
利用<font color='red'>PIC单片机</font>的蓄电池充电智能管理器<font color='red'>设计</font>实例
PIC单片机与51单片机的区别
(1)总线结构:MCS-51单片机的总线结构是冯-诺依曼型,计算机在同一个存储空间取指令和数据,两者不能同时进行;而PIC单片机的总线结构是哈佛结构,指令和数据空间是完全分开的,一个用于指令,一个用于数据,由于可以对程序和数据同时进行访问,所以提高了数据吞吐率。正因为在PIC单片机中采用了哈佛双总线结构,所以与常见的微控制器不同的一点是:程序和数据总线可以采用不同的宽度。数据总线都是8位的,但指令总线位数分别位12、14、16位。 (2)流水线结构:MCS-51单片机的取指和执行采用单指令流水线结构,即取一条指令,执行完后再取下一条指令;而PIC的取指和执行采用双指令流水线结构,当一条指令被执行时,允许下一条指令同时被取出,这样
[单片机]
基于PIC单片机的墨斗操作台系统的设计
  引言   随着科技的发展,印刷行业开始从传统的模拟生产转向数字化生产,墨斗作为胶印机的核心着色装置,其控制精度对胶印机的生产质量和自动化水平起着非常重要的作用。传统的墨斗采用手动调整的方式,使得胶印机的生产质量较差,生产准备时间长,资源浪费严重。一种由墨斗操作台控制系统、电机控制系统和上位机系统组成的墨斗控制系统在国外印刷行业得到了广泛应用,这种新的墨斗控制系统能大大提高墨斗的控制精度,并缩短生产准备时间、降低生产成本。本文所描述的墨斗操作台控制系统就是在跟踪国际先进技术的基础上,设计符合国内行情的产品,对提高国产胶印机的印刷质量和自动化水平有着重要意义。   1 墨斗操作台控制系统介绍   一台胶印机的墨斗系统通常由
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved