PIC16C74B单片机与AT24C64通讯程序

发布者:真诚友爱最新更新时间:2017-12-04 来源: eefocus关键字:PIC16C74B  单片机  AT24C64通讯 手机看文章 扫描二维码
随时随地手机看文章

;=======================================         
;PIC16C74B单片机与AT24C64通讯 
;该程序实现的功能是: 
;将I2C_A,I2C_B.....I2C_K内容写入EEPROM中 
;同时在EEPROM中读出数据从新写入各个寄存器

;======================================= 
        LIST  P=16C74B 
        #include 
        ERRORLEVEL  -302 
I2C_A    EQU      0X20     
I2C_B    EQU      0X21 
I2C_C    EQU      0X22 
I2C_D    EQU      0X23 
I2C_E    EQU      0X24 
I2C_F    EQU      0X25 
I2C_G    EQU      0X26     
REG1     EQU      0X2B 
REG2     EQU      0X2C 
COUNT    EQU      0X71            ;I2C 
BCOUNT   EQU      0X72            ;I2C 
TXBUF    EQU      0X73            ;I2C 
RXBUF    EQU      0X74            ;I2C 
BUSCON   EQU      0X75            ;I2C 
BUSSTA   EQU      0X76            ;I2C 
I2CBUF   EQU      0X77            ;I2C 
SLAVEADDR        EQU    0XA0      ;I2C 
DATAADDRH        EQU    0X01      ;I2C 
DATAADDRL        EQU    0X00      ;I2C 
;---------------------------------------     
;BUSCON 
;---------------------------------------     
SLAVE_RW        EQU       7 
LAST_BYTE_RX    EQU       6 
SLAVE_ACTIVE    EQU       5 
TIME_OUT        EQU       4 
;---------------------------------------     
;BUSSTA 
;--------------------------------------- 
BUS_BUSY          EQU       7 
TX_PROGRESS       EQU       6 
RX_PROGRESS       EQU       5 
TX_SUCCESS        EQU       4 
RX_SUCCESS        EQU       3 
FATAL_ERROR       EQU       2    ;SLAVE EEPROM  
ABORT             EQU      1 
ACK_ERROR         EQU       0 
;--------------------------------------- 
R_NOT_W  EQU       0            
TRUE     EQU       1 
FALSE    EQU       0 
SDA      EQU     0X04            ;I2C 
SCL      EQU     0X03            ;I2C 
;======================================= 
        ORG     0X00 
        GOTO    START 
        ORG     0X20 
START   BCF     STATUS,RP1 
        BCF     STATUS,RP0 
        CLRF    RA 
        CLRF    RB 
        CLRF    RC 
        CLRF    RD 
        CLRF    RE       
        BSF     STATUS,RP0 
        CLRF    TRISA 
        CLRF    TRISB                       
        CLRF    TRISC 
        CLRF    TRISD 
        CLRF    TRISE 
        MOVLW   0X02 
        MOVWF   I2C_A 
        MOVLW   0X04 
        MOVWF   I2C_B 
        MOVLW   0X03 
        MOVWF   I2C_C 
        MOVLW   0X03 
        MOVWF   I2C_D 
        MOVLW   0X05 
        MOVWF   I2C_E 
        MOVLW   0X06 
        MOVWF   I2C_F 
        MOVLW   0X04 
        MOVWF   I2C_G 
;=======================================         
START1   
        CALL   I2CBUS_INIT 
        CALL   REGTOI2CBUF 
        CALL   I2CWRITE 
        CALL   CLRI2CBUF 
        CALL   D10 
        CALL   I2CREAD       
        CALL   I2CBUFTOREG 
        GOTO   START1 
;=======================================     
;CLRI2CBUF 
;--------------------------------------- 
CLRI2CBUF 
        BCF        STATUS,RP0 
        MOVLW      I2CBUF 
        MOVWF      FSR 
        MOVLW      0X08 
        MOVWF      COUNT 
CLRLOOP CLRF       INDF 
        INCF       FSR,F 
        DECFSZ     COUNT,F 
        GOTO       CLRLOOP 
        RETURN 
;---------------------------------------     
;将各个REGSTER数据写入 I2CBUF 缓冲区 
;--------------------------------------- 
REGTOI2CBUF 
        BCF        STATUS,RP0 
        MOVLW      I2CBUF 
        MOVWF      FSR 
        MOVF       I2C_A,W 
        MOVWF      INDF 
        INCF       FSR,F 
        MOVF       I2C_B,W 
        MOVWF      INDF 
        INCF       FSR,F 
        MOVF       I2C_C,W 
        MOVWF      INDF 
        INCF       FSR,F 
        MOVF       I2C_D,W 
        MOVWF      INDF 
        INCF       FSR,F 
        MOVF       I2C_E,W 
        MOVWF      INDF 
        INCF       FSR,F 
        MOVF       I2C_F,W 
        MOVWF      INDF 
        INCF       FSR,F 
        MOVF       I2C_G,W 
        MOVWF      INDF 
        RETURN 
;--------------------------------------- 
;将 I2CBUF 缓冲区数据写入各个REGSTER  
;---------------------------------------         
I2CBUFTOREG 
        BCF        STATUS,RP0 
        MOVLW      I2CBUF 
        MOVWF      FSR 
        MOVF       INDF,W 
        MOVWF      I2C_A 
        INCF       FSR,F 
        MOVF       INDF,W 
        MOVWF      I2C_B 
        INCF       FSR,F 
        MOVF       INDF,W 
        MOVWF      I2C_C 
        INCF       FSR,F 
        MOVF       INDF,W 
        MOVWF      I2C_D 
        INCF       FSR,F 
        MOVF       INDF,W 
        MOVWF      I2C_E 
        INCF       FSR,F 
        MOVF       INDF,W 
        MOVWF      I2C_F 
        INCF       FSR,F 
        MOVF       INDF,W 
        MOVWF      I2C_G 
        RETURN 
;=======================================     
;将I2CBUF缓冲区内的数据写入EEPROM 
;======================================= 
I2CWRITE 
        CALL       I2CSTART 
        BTFSS      BUSSTA,BUS_BUSY 
        GOTO       TX_FAIL 
        BCF        BUSCON,SLAVE_RW 
        CALL       TX_SLAVE_ADDR 
        BTFSS      BUSSTA,TX_SUCCESS    ;SUCESSFULL? 
        GOTO       TX_FAIL 
        CALL       TX_DATA_ADDR 
        BTFSS      BUSSTA,TX_SUCCESS 
        GOTO       TX_FAIL 
        MOVLW      I2CBUF 
        MOVWF      FSR 
        MOVLW      07 
        MOVWF      COUNT 
T_BYTE_LOOP 
        MOVF       INDF,W 
        MOVWF      TXBUF 
        CALL       I2CTXB 
        BTFSS      BUSSTA,TX_SUCCESS 
        GOTO       TX_FAIL 
        INCF       FSR,F 
        DECFSZ     COUNT,F 
        GOTO       T_BYTE_LOOP 
        GOTO       TX_PASS 
TX_FAIL CALL       I2CSTOP 
        BCF        BUSSTA,TX_PROGRESS 
        BCF        BUSSTA,TX_SUCCESS 
        RETLW      FALSE 
TX_PASS 
        CALL       I2CSTOP 
        BCF        BUSSTA,TX_PROGRESS 
        RETLW      TRUE 
;---------------------------------------             
;从 EEPROM 中读出数据到 I2CBUF 寄存器 
;--------------------------------------- 
I2CREAD BCF        STATUS,RP0 
        BCF        BUSSTA,RX_SUCCESS 
        CALL       I2CSTART 
        BTFSS      BUSSTA,BUS_BUSY 
        GOTO       RX_FAIL 
        BCF        BUSCON,SLAVE_RW 
        CALL       TX_SLAVE_ADDR 
        BTFSS      BUSSTA,TX_SUCCESS    
        GOTO       RX_FAIL 
        CALL       TX_DATA_ADDR 
        BTFSS      BUSSTA,TX_SUCCESS 
        GOTO       RX_FAIL 
        CALL       I2CSTART 
        BSF        BUSCON,SLAVE_RW 
        CALL       TX_SLAVE_ADDR 
        BTFSS      BUSSTA,TX_SUCCESS  
        GOTO       RX_FAIL 
        BCF        BUSSTA,LAST_BYTE_RX 
        MOVLW      I2CBUF 
        MOVWF      FSR 
        MOVLW      07 
        MOVWF      COUNT  
R_BYTE_LOOP 
        MOVLW      0X01 
        XORWF      COUNT,W 
        BTFSC      STATUS,Z 
        BSF        BUSSTA,LAST_BYTE_RX 
        CALL       I2CRXB 
        BTFSS      BUSSTA,RX_SUCCESS 
        GOTO       RX_FAIL 
        MOVF       RXBUF,W      
        MOVWF      INDF 
        INCF       FSR,F 
        DECFSZ  COUNT,F 
        GOTO       R_BYTE_LOOP  
        GOTO       RX_PASS 
RX_FAIL CALL       I2CSTOP 
        BCF        BUSSTA,RX_PROGRESS 
        BCF        BUSSTA,RX_SUCCESS 
        RETLW      FALSE   
RX_PASS CALL       I2CSTOP 
           BCF        STATUS,RP0 
        BCF        BUSSTA,TX_PROGRESS 
        BCF        BUSSTA,RX_PROGRESS 
        BSF        BUSSTA,RX_SUCCESS 
        RETLW      TRUE 
;=======================================         
; I2C 初始化 
;======================================= 
I2CBUS_INIT 
        BCF        STATUS,RP0 
        MOVF       RC,W 
        ANDLW      0X18 
        MOVWF      RC 
        CLRF       BUSSTA 
        CLRF       BUSCON 
        RETURN          
;=======================================     
; 传送设备地址 
;入口:  BUSCON 
;出口:  BUSSTA 
;======================================= 
TX_SLAVE_ADDR 
        BCF        STATUS,RP0 
        BCF        BUSSTA,ACK_ERROR 
        MOVLW      SLAVEADDR 
        MOVWF      TXBUF 
        BTFSC      BUSCON,SLAVE_RW 
        BSF       TXBUF,R_NOT_W 
        CALL       I2CTXB            
        BTFSC      BUSSTA,TX_SUCCESS  
        GOTO       TXADDR_SUCCESS 
        CLRWDT 
        BTFSS      BUSSTA,ACK_ERROR 
        CALL       I2CSTOP 
        GOTO       TXADDR_END 
TXADDR_SUCCESS 
        CLRWDT 
TXADDR_END 
        RETURN 
;=======================================     
;TX_DATA_ADDR   发送写/读的地址 
;======================================= 
TX_DATA_ADDR 
        BCF        STATUS,RP0 
        MOVLW      DATAADDRH 
        MOVWF      TXBUF 
        CALL       I2CTXB 
        BCF        STATUS,RP0 
        BTFSS      BUSSTA,TX_SUCCESS 
        GOTO       TX_DATA_ADDR_ERROR 
        MOVLW      DATAADDRL 
        MOVWF      TXBUF 
        CALL       I2CTXB 
        BCF        STATUS,RP0 
        BTFSS      BUSSTA,TX_SUCCESS 
        GOTO       TX_DATA_ADDR_ERROR 
        GOTO       TX_DATA_END 
TX_DATA_ADDR_ERROR 
        BCF        BUSSTA,TX_PROGRESS 
        BCF        BUSSTA,TX_SUCCESS 
        BSF        BUSSTA,ACK_ERROR 
TX_DATA_END 
        RETURN 
;=======================================     
;向 EEPROM 输出一个8位数据,并检测EEPROM的ACK信号 
;入口:  TXBUF  寄存器 
;       BUSSTA 寄存器 
;出口:  EEPROM 存储器 
;       BUSSTA 寄存器 
 ;======================================     
I2CTXB  BCF        STATUS,RP0 
        BSF        BUSSTA,TX_PROGRESS 
        BCF        BUSSTA,TX_SUCCESS 
        MOVLW      0X08 
        MOVWF      BCOUNT 
TXLOOP  CLRWDT                 
        BSF        STATUS,RP0      
        BCF        TRISC,SCL  
        NOP     
        BCF        TRISC,SDA      
        BCF        STATUS,RP0     
        RLF        TXBUF,F        
        BSF        STATUS,RP0 
        BTFSC      STATUS,C 
        BSF        TRISC,SDA 
        NOP 
        BSF        TRISC,SCL 
        NOP 
        NOP 
        BCF        STATUS,RP0 
        DECFSZ     BCOUNT,F 
        GOTO       TXLOOP 
;--------------------------------------- 
;检测是EEPROM否有ACK信号产生,产生为正常 
;检测方法: 
;   1. 将RC口的SCL.SDA分别设置为输出和输入状态 
;   2. 延时2个指令周期,将SCL设置为高电平 
;   3. 延时2个指令周期,检测RC口SDA的状态 
;   4. 如果为高电平,设置错误状态,返回 
;   5. 如果为低电平,延时2个指令周期后,将RC口SCL设置为低电平,继续执行 
;--------------------------------------- 
        BSF        STATUS,RP0 
        BCF        TRISC,SCL 
        BSF        TRISC,SDA 
        NOP 
        NOP 
        BSF        TRISC,SCL 
        NOP 
        BCF        STATUS,RP0 
        BTFSC      RC,SDA 
        GOTO       TX_ERR 
        BSF        STATUS,RP0 
        BCF        TRISC,SCL 
        BCF        STATUS,RP0 
        BCF        BUSSTA,TX_PROGRESS 
        BSF        BUSSTA,TX_SUCCESS 
        BCF        BUSSTA,ACK_ERROR 
        GOTO       TX_END 
TX_ERR  BCF        BUSSTA,TX_PROGRESS 
        BCF        BUSSTA,TX_SUCCESS 
        BSF        BUSSTA,ACK_ERROR 
TX_END  RETURN 
;======================================= 
;从EEPROM中读出 8 位的数据,并发送发送ACK信号 
;入口:  EEPROM  存储器 
;       BUSCON  寄存器 
;出口:  RXBUF   寄存器 
;       BUSSTA  寄存器 
;======================================= 
I2CRXB  BCF        STATUS,RP0 
        BSF        BUSSTA,RX_PROGRESS 
        BCF        BUSSTA,RX_SUCCESS 
        MOVLW      0X08 
        MOVWF      BCOUNT 
RXLOOP  CLRWDT 
        BSF        STATUS,RP0 
        BCF        TRISC,SCL          ;定义TRISC为输出 
        BSF        TRISC,SDA          ;定义TRISC为输入        
        NOP               
        NOP 
        BSF        TRISC,SCL          ;TRISC输出高电平 
        NOP 
        BCF        STATUS,RP0 
        BCF        STATUS,C 
        BTFSC      RC,SDA             ;原指令为BTFSC TRISC,SDA 
        BSF        STATUS,C 
        RLF        RXBUF,F 
        DECFSZ     BCOUNT,F 
        GOTO       RXLOOP 
;--------------------------------------- 
;发送ACK信号到EEPROM 
;判断接收的是否为最后一个字节 
;LAST_BYTE_RX为1,是    SDA发送一个高电平,结束 
;LAST_BYTE_RX为0,不是  SDA发送一个低电平ACK,继续接收 
;--------------------------------------- 
        BSF        STATUS,RP0 
        BCF        TRISC,SCL       
        BCF        TRISC,SDA       
        BTFSC      BUSCON,LAST_BYTE_RX      ;检测是否是最后一个字节 
        BSF        TRISC,SDA                ;是最后一个字节 
        NOP                             ;发送ACK信号 
        BSF        TRISC,SCL 
        NOP 
        NOP 
        NOP 
        NOP 
        BCF        TRISC,SCL 
        BCF        STATUS,RP0 
        BCF        BUSSTA,RX_PROGRESS    
        BSF        BUSSTA,RX_SUCCESS 
        RETURN 
;======================================= 
;I2C 开始信号 
;输入:  无 
;输出:  BUFSSTA 
;======================================= 
I2CSTART 
        BSF     STATUS,RP0 
        BSF     TRISC,SDA    ;1US 
        NOP                     ;1US 
        BSF     TRISC,SCL       ;1US 
        NOP 
        NOP 
        BCF     TRISC,SDA 
        NOP 
        NOP 
        BCF     STATUS,RP0 
        BSF     BUSSTA,BUS_BUSY 
        RETURN 
;======================================= 
;I2C 结束信号 
;输入:  无 
;输出:  BUSSTA 
;======================================= 
I2CSTOP 
        BSF     STATUS,RP0 
        BCF     TRISC,SCL 
        BCF     TRISC,SDA 
        BSF     TRISC,SCL 
        NOP 
        NOP 
        BSF     TRISC,SDA 
        NOP 
        BCF     STATUS,RP0 
        BCF     BUSSTA,BUS_BUSY               
        RETURN 
;======================================= 
; D10 @ 
;  cLOCk in 4MHz 
;  delay 10ms 
;=======================================     
D10    MOVLW    0X0D         
    MOVWF    REG1 
LOOP2    MOVLW    0XFF         
    MOVWF    REG2 
LOOP1    DECFSZ    REG2,f 
    GOTO    LOOP1 
    DECFSZ    REG1,f 
    GOTO    LOOP2 
    RETURN 
;======================================= 
I2CERR  CLRWDT 
        NOP 
        NOP 
        NOP 
        RETURN  
        END 


关键字:PIC16C74B  单片机  AT24C64通讯 引用地址:PIC16C74B单片机与AT24C64通讯程序

上一篇:pic12C508超声波测距仪程序
下一篇:pic16f876a红外接收及ERROR程序

推荐阅读最新更新时间:2024-03-16 15:48

4×4矩阵键盘的工作原理与编程
本文介绍如何在ME300B型51/AVR单片机学习开发系统上使用数码管显示4 4矩阵键盘的键值。 一、硬件工作原理的简单介绍 该实验使用ME300B上的8位数码管显示电路和4 4矩阵键盘电路。现将这二部分的电路工作原理进行简单的介绍: 1、4 4矩阵键盘的工作原理 矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4 4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。 图1为ME300B矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。 图1 矩阵键盘电路
[单片机]
如何将STM32单片机中的函数调用到入口参数
STM32—数组作为被调用函数的入口参数时,要两个条件, 1:数组首地址 2:数组长度 在被调用函数中,比如把数据保存到数组pbuffer[ ]中,那么在入口参数定义时要定义成指针u8 *pbuffer, 而在调用时,比如要保存到tab[ ]中,要在入口参数处强制转换成(u8 *)tab
[单片机]
如何将STM32<font color='red'>单片机</font>中的函数调用到入口参数
中央空调计费系统的设计方案
  1、引言   随着社会的进步, 人们对居住环境、生活质量的要求也在不断地提高。中央空调在民用住宅、商用大厦、高档写字楼及多功能的综合性大楼中也被广泛采用。而采用按冷/热量计费的方式,无疑会为用户提供一个公正、合理、科学的收费依据;另外还可以建立用户的经济利益与使用能耗的直接联系,从根本上增强用户的节能意识,最大幅度地减少能源的浪费。本文就是基于这种计费方式,对分户能量计量表的结构、功能及管理软件进行设计与研究。   2、 中央空调控制系统原理   2.1能量计费公式   Q=∫0tQmΔhdt   Q----释放的冷/热量,KJ   Qm----流经能量表的液体质量流量,Kg/s   Δh----热交换器中入口
[单片机]
中央空调计费系统的设计方案
Energy Micro 宣布ARM Cortex-M4内核 “Wonder Gecko” 系列MCU已正式量产
挪威,奥斯陆,05/23/2013-节能微控器和无线射频供应商Energy Micro宣布其最新、且最先进的EFM32 微控制器系列-“Wonder Gecko”系列微控制器包括相关开发工具,现已正式发售。“Wonder Gecko”系列微控制器基于ARM Cortex-M4内核,提供完整的DSP指令集及一个专用的浮点运算单元。为了使得MCU在运行模式和睡眠状态下获得最低的功耗,EFM32 Wonder Gecko 系列还融入了eLL(超低漏电流工艺)技术。 Energy Micro的 CTO(首席技术官) Øyvind Janbu说,“嵌入式设计人员一直希望在较高温度下仍可以获得较低的待机电流。为了满足这一需求,我们和台积电合
[单片机]
基于单片机的智能仪器监控平台设计
1 引言   工业燃烧过程所释放出的烟气是现代城市大气污染源,烟气检测是大气环境检测中必要的项目,它是确定重点污染源并对污染源进行检测和控制的基本手段。为了控制燃烧过程的燃烧空气比,提高燃烧效率,节约能源,减少大气污染,必须可靠地测量烟气中各种气体的含量。本文针对烟气分析,介绍了一种基于Intel单片机的智能仪器监控平台。 2 监控平台的硬件结构设计   硬件配置应针对分析检测器的不同组合方式可在各模块中选择,如该平台用于二组分分析时,则只接入两路的操作回路和信号回路,其他两路不接,由于硬件模块的独立特性,配合软件的系统参数设置功能,系统完全可以正常工作,未接入的回路对工作回路不产生影响。监控平台的硬件结构如图1所示。
[单片机]
基于51单片机的点阵+音乐=祝你生日快乐
//----------------------------------------------------- // 12*12点阵+音乐产生 // MCU:89C51 晶振:12M //编写日期:2010。12。25 //编写人:李春起 #include REG51.H #define uchar unsigned char #define uint unsigned int uint a=0,a1=0,a2=0; uint miusfla,miust,mius=64536; uint disfla1,sta=0; char flag=0,mdflag=0; sbit k1=P3^2; sbit k2=P3^3; sbit Y
[单片机]
51单片机中的数据类型解析
  数据类型在数据结构中的定义是一个值的集合以及定义在这个值集上的一组操作。数据类型包括原始类型、多元组、记录单元、代数数据类型、抽象数据类型、参考类型以及函数类型。本文主要以51单片机中的数据类型为中心而展开的话题。   在keil C51或者iar for c8051编译器下:   int 占两个字节 范围:-32768~+32767   long占四个字节 范围:-2147483648~+2147483647   float占四个字节 范围:3.40E+38 ~ +3.40E+38   double占8个字节 范围:-1.79E+308 ~ +1.79E+308   在标准C语言中,存在着如下六种基本数据类型:   1、
[单片机]
51<font color='red'>单片机</font>中的数据类型解析
51单片机烧写程序的方法
STC89C51是应用广泛的51单片机,很多人都是通过该单片机入门学习的,单片机的学习需要勤动手。单片机需要烧写程序,要用到相关的软件和硬件。下面介绍一下51单片机烧写程序的方法。 1 所用到的硬件工具 51单片机烧写程序需要用到单片机的UART串口,所用到的工具为USB/TTL,具有四个引脚分别为5V、GND、TXD、RXD,需要和单片机的UART口连接,在连接的时候需要注意的是,串口要交叉连接,即USB/TTL的TXD和单片机的RXD连接;USB/TTL的RXD和单片机的TXD连接。 2 所用到的软件以及设置 STC的51单片机需要用到STC-ISP软件,该软件可以在STC的官网上下载到 烧写过程为:1)选择具体的单片机型
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved