男女午夜激情_www.天堂av.com_亚洲综合小说区_亚洲欧美自拍视频_成年精品_久久www免费人成—看片_激情综合五月天_久久高潮视频_最新国产成人ab网站_国产精品卡一

機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發
培訓信息
贊助商
EMC單片機的I2C程序包
EMC單片機的I2C程序包
 更新時間:2008-7-26 20:10:56  點擊數:2
【字體: 字體顏色

EMC單片機的I2C程序包


發布時間:2008年1月5日 2時28分

EMC單片機的IIC程序包

本程序已經穩定使用很長一段時間了,如果非要追根求源,應該追溹到1998年,由于本系統是基于IIC EEPROM的,故對2401的讀寫采用了阻塞的方式,讀不到數據或寫不入數據就不退出。
  本程序是基于447的,也在153上運行過,不過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個字節數據
;地址由IICADDR指定,數據存在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個字節數據
;地址由IICADDR指定,數據存在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個字節數據
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個字節數據
;地址由IICADDR指定,數據存在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
  • 上一篇: HT1380實時時鐘驅動程序(EMC)
  • 下一篇: 單片機在紅外遙控系統中的應用(EM78系列)
  • 發表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

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

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

    網站經營許可證:浙B2-20080178-1
    主站蜘蛛池模板: 建宁县| 石泉县| 中超| 沙洋县| 余江县| 雷波县| 米脂县| 澎湖县| 汶川县| 虞城县| 金溪县| 廊坊市| 吴忠市| 江门市| 北票市| 南靖县| 夹江县| 宁明县| 和平县| 乐山市| 上杭县| 察雅县| 博湖县| 晴隆县| 陆良县| 葫芦岛市| 潢川县| 土默特右旗| 毕节市| 信宜市| 巨鹿县| 呈贡县| 辽源市| 廊坊市| 抚顺县| 古交市| 卓尼县| 邢台市| 巴彦淖尔市| 左云县| 天峻县|