新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 讀寫24LCxx系列的EEPROM的程序實例

        讀寫24LCxx系列的EEPROM的程序實例

        作者: 時間:2012-07-07 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/171196.htm

        ;********************************************************
        ;* *
        ;* ? PIC16F877A ?I2C Master 家Α????Α ?dㄒ{Α *
        ;* *
        ;* Written by: Richard Yang *
        ;* Sr. Corporate Application Engineer *
        ;* Microchip Technology Inc. *
        ;* Date: Oct. 2nd '2002 *
        ;* Revision: 1.00 *
        ;********************************************************


        ;*************************************************
        ; This source code provides a demonstration of the MSSP peripheral
        ; on the PIC16F87x MCU.
        ;
        ;
        ;*********** The subroutines for *****************
        ;
        ; EE_Random_Read ; EEPROM Random address Read from EEPROM
        ; EE_SEQU_Read ; EEPROM Sequential Read form EEPROM
        ; EE_Ack_Check ; Polling current status of EEPROM
        ; EE_Page_Write ; Page Write function for EEPROM
        ; EE_Byte_Write ; Write a byte to EEPROM with address setting
        ;
        ;*********** The subroutines for I2C *****************
        ;
        ; Init_I2C_Master ; Initial I2C Module for Master Mode , 7-bit address
        ; StartI2C ; Send a START Condition !!
        ; StopI2C ; Send s STOP Condition
        ; RstartI2C ; Send a Repeat Start conditional to I2C
        ; Non_Ack ; Send a Non-acknowledge signal to I2C
        ; An_Ack ; Send a acknowledge signal to I2C
        ; Sebd_Byte ; Send a byte to I2C bus
        ; RecI2C ; Enable Read a byte form slave device
        ; I2C_Done : Wait the I2C completed the currect process
        ;
        ;***************************************************

        list p=16f877a
        #i nclude p16f877a.inc>

        ;
        ;***************************************
        ; wq跑計?RAM???
        ;
        CBLOCK 0x20

        I2C_Ctrl
        I2C_Addr
        I2C_Data
        I2C_Page_Length
        D_Count
        ENDC
        cblock 0x40
        I2C_Page_Buffer:8
        I2C_SEQU_Buffer:8
        endc
        ;
        ;***************************************
        ; wqい_?既?竟??

        w_temp EQU 0x72
        status_temp EQU 0x73
        pclath_temp EQU 0x74
        ;
        ;***************************************
        ; wq I2C ???の}?
        ;
        EEPROM_CMD equ 0xA0 ; Device adress of Slave Point
        EE_Read equ .1
        EE_Write equ .0

        ;
        #define SCL PORTC,3 ; I2C SCL pin
        #define SDA PORTC,4 ; I2C SDA pin

        ;

        ;********************************************
        ; Locates startup code @ the reset vector
        ;********************************************
        Reset_Addr
        org 0x00
        nop
        goto Main_Init
        ;
        org 0x04
        goto ISR
        ;
        ;*************************************************************
        ;**** The Start Address of ISR is 0x004
        ;**** PUSH POP ?ㄏノdㄒ : Aノ?鉤 PIC16F877 ΤSHARE BANK ?PIC
        ;**************************************************************
        ISR
        Push movwf w_temp ; save off current W register contents
        movf STATUS,w ; move status register into W register
        movwf status_temp ; save off contents of STATUS register
        movf PCLATH,W
        movwf pclath_temp
        ;
        ; Put your interrupt code here
        ;
        Pop movf pclath_temp,W
        movwf PCLATH
        movf status_temp,w ; retrieve copy of STATUS register
        movwf STATUS ; restore pre-isr STATUS register contents
        swapf w_temp,f
        swapf w_temp,w ; restore pre-isr W register contents
        ;
        retfie ; return from interrupt


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

        Main_Init
        pagesel Init_I2C_Master ; Set PAGE to PCLATH Register
        call Init_I2C_Master ; Init the MSSP for I2C Master
        ;
        banksel I2C_Ctrl
        movlw EEPROM_CMD ; Load EEPROM command address @ 0xA0
        movwf I2C_Ctrl
        ;
        ;
        Main
        ;
        ;----------------------------------------------------------------------
        ;
        ;* ???代剛{Α|?N?艙計?(0x40-0x47)g??RMA0x40-0x47??m
        ;* ?ノPage Write?よΑN8??じ艙?戈?g? EEPROM ?
        ;* i?A?盎代EEPROMO??ЧΘg??笆??程?N?g
        ;* ??戈??Sequential Read?よΑqEEPROM弄?ㄓ??I2C_SEQU_Bufferい
        ;

        Test_Page_RW
        movlw 0x08
        movwf I2C_Page_Length
        movlw I2C_Page_Buffer
        _Fill_RAM movwf FSR
        movwf INDF
        incf FSR,W
        decfsz I2C_Page_Length,F
        goto _Fill_RAM
        ;
        Test_Page_Write
        ; banksel I2C_Ctrl
        movlw EEPROM_CMD ; Load EEPROM command address @ 0xA0
        movwf I2C_Ctrl
        movlw 0x10 ; Select EEPROM location at 0x00
        movwf I2C_Addr
        movlw .8
        movwf I2C_Page_Length
        call EE_Page_Write
        ;
        call EE_Ack_Check
        ;
        banksel I2C_Ctrl
        movlw EEPROM_CMD ; Load EEPROM command address @ 0xA0
        movwf I2C_Ctrl
        movlw 0x10
        movwf I2C_Addr
        movlw .8
        movwf I2C_Page_Length
        call EE_SEQU_Read
        ;
        goto $
        ;
        ;---------------------------------------------------------
        ;
        ;* ???代剛{Α|?g????じ艙?戈?g? EEPROM い
        ;* ?i?A?盎代O??ЧΘg??笆??程?N?g
        ;* ??戈??qEEPROM弄?ㄓ??I2C_Data既?竟い
        ;
        Test_1byte_RW

        banksel I2C_Ctrl
        movlw EEPROM_CMD ; Load EEPROM command address @ 0xA0
        movwf I2C_Ctrl
        movlw 0x00 ; Select EEPROM location at 0x00
        movwf I2C_Addr
        movlw 0xAA ; Write data 0x5A to location 0x00 of EEPROM
        movwf I2C_Data
        call EE_Byte_Write
        ;
        Test2 call EE_Ack_Check ; Polling Acknowledge for next access
        ;
        banksel I2C_Data
        movlw 0x00 ; Clear I2C data buffer
        movwf I2C_Data
        ;
        Test3
        banksel I2C_Ctrl
        movlw EEPROM_CMD ; Load EEPROM command address @ 0xA0
        movwf I2C_Ctrl
        movlw 0x00
        movwf I2C_Addr
        call EE_Random_Read
        ;
        goto $
        ;


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 香格里拉县| 台山市| 鹿泉市| 肥乡县| 奎屯市| 静安区| 澳门| 大悟县| 榆社县| 资兴市| 西乌| 长葛市| 桂林市| 新野县| 南川市| 汉源县| 武胜县| 荆州市| 青阳县| 铁岭县| 宁晋县| 嘉黎县| 成武县| 康保县| 平南县| 呼伦贝尔市| 象山县| 临猗县| 宿州市| 哈巴河县| 正宁县| 许昌市| 洛隆县| 西乌珠穆沁旗| 枞阳县| 兴义市| 涞水县| 广宗县| 大石桥市| 嵊州市| 漳州市|