機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
EMC單片機寫的I2C程序
EMC單片機寫的I2C程序
 更新時間:2009-7-20 15:42:03  點擊數(shù):0
【字體: 字體顏色

本程序是基于447的,也在156上運行過,不過IO的初始化操作需要作些修改,其他可以完全不用修改。

                    程序開頭的幾行ADD A,@0xFF是非常有用的,在以后的文章中會有描述。

                    程序如下:

                  ;SYSTEM CLOCK 4MHz
                  ;IO port define
                      SDA    == 4
                      SCL    == 3

                      MSDA    == 0
                      MSCL    == 1
                      MCS    == 2
                      MRST    == 5
                     
                  ;Register define
                      TREG    == 0X10
                      TCNT    == 0X11
                      GCNT    == 0X12

                      IICADDR    == 0X1E
                      IICBUF    == 0X28
                      IICDAT0    == 0X28
                      IICDAT1    == 0X29
                      IICDAT2    == 0X2A
                      IICDAT3    == 0X2B
                      IICDAT4    == 0X2C
                      IICDAT5    == 0X2D
                      IICDAT6    == 0X2E
                      IICDAT7    == 0X2F
                     
                      INCLUDE "EM78P447S.H"
                     
                      ORG    0X000
                      ADD    A,@0XFF
                      ADD    A,@0XFF
                      ADD    A,@0XFF
                      ADD    A,@0XFF
                      ADD    A,@0XFF

                  START:
                      DISI
                      SET P6 P7 PULL UP EN
                      CONTR
                      MOV    TREG,A
                      BC    TREG,7
                      MOV    A,TREG
                      CONTW
                      SET SCL SDA OUTPUT HIGH
                      MOV    A,@0XFF
                      MOV    TREG,A
                      BC    TREG,SCL    SCL OUTPUT
                      BC    TREG,SDA    SDA OUTPUT
                      MOV    A,TREG
                      IOW    IOC6
                      BS    R6,SCL        SCL HIGH
                      BS    R6,SDA        SDA HIGH

                 
            ;********************************************************************
                  ;讀入的測試程序,讀取2401的0x00~0x07地址內容
                  READ_2401:
                      MOV    A,@0X00
                      MOV    IICADDR,A
                      CALL    IIC_R8BYT
                      RET

                 
            ;********************************************************************
                  ;寫入的測試程序,向2401的0x00~0x07地址寫入0x00
                  WRITE_2401:
                      MOV    A,@0X00
                      MOV    IICADDR,A
                      CLR    IICDAT
                      CLR    IICDAT
                      CLR    IICDAT
                      CLR    IICDAT
                      CLR    IICDAT
                      CLR    IICDAT
                      CLR    IICDAT
                      CLR    IICDAT
                      CALL    IIC_W8BYT
                      RET

                 
            ;********************************************************************
                  ;與Microchip的2401接口程序
                 
            ;********************************************************************
                  ;IIC_W8BYT,向2401的指定地址寫入8個字節(jié)數(shù)據(jù)
                  ;地址由IICADDR指定,數(shù)據(jù)存在IICDAT0~IICDAT7
                  IIC_W8BYT:
                      CALL    IIC_START
                      MOV    A,@0XA0
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_W8BYT
                      MOV    A,IICADDR
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_W8BYT
                      WRITE 8 BYTES TO 24C01
                      MOV    A,@IICBUF
                      MOV    R4,A
                      MOV    A,@8
                      MOV    GCNT,A
                  IIC_W8BYT1:
                      MOV    A,R0
                      INC    R4
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_W8BYT
                      DJZ    GCNT
                      JMP    IIC_W8BYT1
                      CALL    IIC_STOP
                      RET

                 
            ;********************************************************************
                  ;IIC_W1BYT,向2401的指定地址寫入1個字節(jié)數(shù)據(jù)
                  ;地址由IICADDR指定,數(shù)據(jù)存在IICDAT0
                  IIC_W1BYT:
                      CALL    IIC_START
                      MOV    A,@0XA0
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_W1BYT
                      MOV    A,IICADDR
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_W1BYT
                      WRITE 1 BYTES TO 24C01
                      MOV    A,@IICBUF
                      MOV    A,IICDAT0
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_W1BYT1
                      CALL    IIC_STOP
                      RET

                 
            ;********************************************************************
                  ;IIC_R8BYT,從2401的指定地址(IICADDR)讀入8個字節(jié)數(shù)據(jù)
                  IIC_R8BYT:
                      CALL    IIC_START
                      MOV    A,@0XA0
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_R8BYT
                      MOV    A,IICADDR
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_R8BYT
                      CALL    IIC_START
                      MOV    A,@0XA1
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_R8BYT
                      READ 8 BYTES FROM 24C01
                      MOV    A,@IICBUF
                      MOV    R4,A
                      MOV    A,@7
                      MOV    GCNT,A
                  IIC_R8BYT1:
                      CALL    IIC_RBYT
                      MOV    R0,A
                      INC    R4
                      CALL    IIC_SACK
                      DJZ    GCNT
                      JMP    IIC_R8BYT1
                      CALL    IIC_RBYT
                      MOV    R0,A
                      CALL    IIC_SNACK
                      CALL    IIC_STOP
                      RET

                 
            ;********************************************************************
                  ;IIC_R1BYT,向2401的指定地址讀出1個字節(jié)數(shù)據(jù)
                  ;地址由IICADDR指定,數(shù)據(jù)存在IICDAT0
                  IIC_R1BYT:
                      CALL    IIC_START
                      MOV    A,@0XA0
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_R1BYT
                      MOV    A,IICADDR
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_R1BYT
                      CALL    IIC_START
                      MOV    A,@0XA1
                      CALL    IIC_WBYT
                      CALL    IIC_CACK
                      JBC    R3,GP        IF GP=1 OPTION AGAIN
                      JMP    IIC_R1BYT
                      READ 1 BYTES FROM 24C01
                      CALL    IIC_RBYT
                      MOV    IICDAT0,A
                      CALL    IIC_SNACK
                      CALL    IIC_STOP
                      RET

                 
            ;********************************************************************
                  ;IIC_START
                  IIC_START:
                      BS    R6,SCL        SCL=1
                      BS    R6,SDA        SDA=1
                      CALL    IIC_DELAY
                      BC    R6,SDA        SDA=0
                      CALL    IIC_DELAY
                      RET
                     
                 
            ;********************************************************************
                  ;IIC_STOP
                  IIC_STOP:
                      BS    R6,SCL        SCL=1
                      BC    R6,SDA        SDA=0
                      CALL    IIC_DELAY
                      BS    R6,SDA        SDA=1
                      CALL    IIC_DELAY
                      RET

                 
            ;********************************************************************
                  ;IIC_CACK IF ACK,FIIC=0
                  IIC_CACK:
                      SET SDA INPUT
                      IOR    IOC6
                      MOV    TREG,A
                      BS    TREG,SDA
                      MOV    A,TREG
                      IOW    IOC6
                      BS    R6,SCL        SCL=1
                      BC    R3,GP
                      JBC    R6,SDA
                      BS    R3,GP
                      BC    R6,SCL        SCL=0
                      SET SDA OUTPUT
                      IOR    IOC6
                      MOV    TREG,A
                      BC    TREG,SDA
                      MOV    A,TREG
                      IOW    IOC6
                      RET

                 
            ;********************************************************************
                  ;IIC_SACK
                  IIC_SACK:
                      BC    R6,SDA        SDA=0
                      NOP
                      BS    R6,SCL        SCL=1
                      CALL    IIC_DELAY
                      BC    R6,SCL        SCL=0
                      CALL    IIC_DELAY
                      RET
                     
                 
            ;********************************************************************
                  ;IIC_SNACK
                  IIC_SNACK:
                      BS    R6,SDA        SDA=1
                      NOP
                      BS    R6,SCL        SCL=1
                      CALL    IIC_DELAY
                      BC    R6,SCL        SCL=0
                      CALL    IIC_DELAY
                      RET

                 
            ;********************************************************************
                  ;IIC_WBYT
                  IIC_WBYT:
                      MOV    TREG,A
                      MOV    A,@8
                      MOV    TCNT,A
                  IIC_WBYT1:
                      BC    R6,SCL        SCL=0
                      JBC    TREG,7
                      JMP    IIC_WBIT1
                      JMP    IIC_WBIT0
                  IIC_WBIT1:
                      BS    R6,SDA
                      JMP    IIC_WBYT2
                  IIC_WBIT0:
                      BC    R6,SDA        SDA=X
                      JMP    IIC_WBYT2
                  IIC_WBYT2:
                      RLC    TREG
                      CALL    IIC_DELAY
                      BS    R6,SCL        SCL=1
                      CALL    IIC_DELAY
                      DJZ    TCNT
                      JMP    IIC_WBYT1
                      BC    R6,SCL        SCL=0
                      CALL    IIC_DELAY
                      RET
                     
                 
            ;********************************************************************
                  ;IIC_RBYT
                  IIC_RBYT:
                      MOV    A,@8
                      MOV    TCNT,A
                      SET SDA INPUT
                      IOR    IOC6
                      OR    A,@0X10
                      IOW    IOC6
                  IIC_RBYT1:
                      BS    R6,SCL        SCL=1
                      JBC    R6,SDA
                      JMP    IIC_RBIT1
                      JMP    IIC_RBIT0
                  IIC_RBIT1:
                      BS    TREG,0
                      JMP    IIC_RBYT2
                  IIC_RBIT0:
                      BC    TREG,0        SDA=X
                      JMP    IIC_RBYT2
                  IIC_RBYT2:
                      RLC    TREG
                      BC    R6,SCL        SCL=0
                      CALL    IIC_DELAY
                      DJZ    TCNT
                      JMP    IIC_RBYT1
                      STORE READ RESULT
                      RRC    TREG
                      MOV    A,TREG
                      MOV    TCNT,A
                      SET SDA OUTPUT
                      IOR    IOC6
                      AND    A,@0XEF
                      IOW    IOC6
                      RESTORE READ RESULT
                      MOV    A,TCNT
                      RET

                 
            ;********************************************************************
                  ;
                  IIC_DELAY:
                      NOP
                      NOP
                      RET
                     
                      ORG    0XFFF
                      JMP    START

  • 上一篇: EM78P156寫的pt2262 源代碼
  • 下一篇: EM78系列單片機的子程序
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1