📄 ntk-iic.asm
字号:
;中颖单片机I2C程序
;****************************************************
;Company: Sino Wealth Electronic (Shanghai) LTD
;File Name:eeprom.asm
;Begin Date: 2003/8/28
;End Date: 2003/8/29
;Function: READ OR WRITE DATA FROM/TO EEPROM(24C02) SPEC Version: 0.3
;SystemClock: RC=200K
;MCU: 69P20, Voltage:4.0V-6.0V; RAM:64*4BIT; ROM:1K*16BIT
;Bonding Option:NO
;Code by: Yanli Email:yanli@sinowealth.com.cn
;****************************************************
;*****************************
;* System Const Definition *
;*****************************
IIC_SCL_MASK EQU 1000B ;OR WITH PORTC, PULL SCL HIGH
IIC_SCL_LOW EQU 0111B ;AND WITH PORTC,PULL SCL LOW
IIC_SDA_MASK EQU 0100B ;OR WITH PORTC, PULL SDA HIGH
IIC_SDA_LOW EQU 1011B ;AND WITH PORTC,PULL SDA LOW
IIC_SDA_INPUT EQU 1011B ;AND WITH PCOUT, SET PORT_SDA INPUT
IIC_SDA_OUTPUT EQU 0100B ;OR WITH PCOUT, SET PORT_SDA_OUTPUT
;********************************
;* System Variable Definition *
;********************************
;Used for EE_RDByte Function
;EE_RDAddressL EQU 33H ;
;EE_RDAddressH EQU 34H ;
;EE_RDDataL EQU 35H ;
;EE_RDDataH EQU 36H ;
EE_RDByteTMP EQU 37H ;
;EE_RDByteRTN EQU 38H ;
;Used for EE_WRByte Function
;EE_WRAddressL EQU 33H ;
;EE_WRAddressH EQU 34H ;
;EE_WRDataL EQU 35H ;
;EE_WRDataH EQU 36H ;
EE_WRByteTMP EQU 37H ;
;EE_WRByteRTN EQU 38H ;
;USED FOR WRITE AND READ BYTE FUNCTION
EE_ADDRESSL EQU 33H ;
EE_ADDRESSH EQU 34H ;
EE_WRCOMMONRTN EQU 38H ;
TMP1 EQU 31H
TMP2 EQU 32H
EE_RDByte:
;LDA IE_BAK ;Recover the IE
;STA IE
LDA EE_RDAddressL,00H
STA EE_ADDRESSL,00H
LDA EE_RDAddressH,00H
STA EE_ADDRESSH,00H
CALL EE_WRCOMMON
STA EE_WRCOMMONRTN,00H
BNZ EE_RDBYTE_EEROR
;***********************************************
;GENERATE START
;***********************************************
ORIM PORTC,IIC_SDA_MASK
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SDA_LOW
ANDIM PORTC,IIC_SCL_LOW ;START
ORIM PORTC,IIC_SDA_MASK
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;1
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
ORIM PORTC,IIC_SDA_MASK
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;1
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
;***********************************************
;WRITE ADDR:000
;***********************************************
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
;***********************************************
;READ OPCODE BIT:1
;***********************************************
ORIM PORTC,IIC_SDA_MASK
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;1
;***********************************************
;RECEIVE ACK BIT
;***********************************************
LDI PCOUT, 1001B
ORIM PORTC,IIC_SDA_MASK ULL UP
ORIM PORTC,IIC_SCL_MASK
;LDI TMP1,IIC_SDA_MASK
;AND PORTC,00H
;BNZ EE_WRCOMMON_EEROR
LDA PORTC, 00H
BA2 $-1
LDI PCOUT,1001B
LDI PORTC,0001B
;***********************************************
;READ BYTE
;***********************************************
LDI TMP1,04H
EE_RDBYTE_H1:
LDA EE_RDDataH,00H
ADDM EE_RDDataH,00H ;LEFT SHIFT
ORIM PORTC,IIC_SCL_MASK
LDI TMP2,IIC_SDA_MASK
AND PORTC,00H
BNZ EE_RDBYTE_H2
LDI TMP2,00H
ADDM EE_RDDataH,00H ;READ 0
JMP EE_RDBYTE_H3
EE_RDBYTE_H2:
LDI TMP2,01H
ADDM EE_RDDataH,00H ;READ 1
EE_RDBYTE_H3:
ANDIM PORTC,IIC_SCL_LOW
ORIM PORTC,IIC_SDA_MASK ULL UP
SBIM TMP1,01H
BNZ EE_RDBYTE_H1 ;DATAH OVER
;LDI PCOUT,1001B
;LDI PORTC,0001B
LDI TMP1,04H
EE_RDBYTE_L1:
LDA EE_RDDataL,00H
ADDM EE_RDDataL,00H
ORIM PORTC,IIC_SCL_MASK
LDI TMP2,IIC_SDA_MASK
AND PORTC,00H
BNZ EE_RDBYTE_L2
LDI TMP2,00H
ADDM EE_RDDataL,00H
JMP EE_RDBYTE_L3
EE_RDBYTE_L2:
LDI TMP2,01H
ADDM EE_RDDataL,00H
EE_RDBYTE_L3:
ANDIM PORTC,IIC_SCL_LOW
ORIM PORTC,IIC_SDA_MASK ULL UP
SBIM TMP1,01H
BNZ EE_RDBYTE_L1 ;DATAL OVER
;***********************************************
;NO ACK
;***********************************************
;ORIM PCOUT,IIC_SDA_OUTPUT
LDI PCOUT, 1101B
ORIM PORTC,IIC_SDA_MASK ;PULL UP
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
LDI TMP1,00H
STA EE_RDByteRTN,00H
JMP EE_RDBYTE_EXIT
EE_RDBYTE_EEROR:
ANDIM PORTC,IIC_SCL_LOW
ORIM PCOUT,IIC_SDA_OUTPUT
LDI TMP1,0FH
STA EE_WRByteRTN,00H
EE_RDBYTE_EXIT:
;***********************************************
;GENERATE STOP
;***********************************************
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ORIM PORTC,IIC_SDA_MASK
;LDA IE ;Protect the IE
;STA IE_BAK
;LDA RomBankTMP,00H
;STA ROMBANK
JMP I2C_READ_BYTE_OVER
; RTNI
;*********************** Function ******************************
;** Name: EE_WRByte **
;** Description:Read one Byte from EEPROM(24C02) **
;** Input Para: 271H~270H -- EE_WRAddressH,EE_WRAddressL **
;** 273H~272H -- EE_WRDataH,EE_WRDataL **
;** Output Para:EE_WRByteRTN -- /0:Success;0:Failed **
;** Used Var: EE_WRByteTMP -- temp for Operation **
;** Used Reg: DPH/DPM/DPL,TBR,INX **
;*****************************************************************
EE_WRByte:
;LDA IE_BAK ;Recover the IE
;STA IE
LDI IRQ, 00H
LDI IE, 00H
LDA EE_WRAddressL,00H
STA EE_ADDRESSL,00H
LDA EE_WRAddressH,00H
STA EE_ADDRESSH,00H
CALL EE_WRCOMMON
STA EE_WRCOMMONRTN,00H
BNZ EE_WRBYTE_EEROR
;***********************************************
;WRITE DATA(8 BITS)
;***********************************************
LDI TMP1,04H
EE_WRBYTE_DATAH1:
LDA EE_WRDataH,00H
ADDM EE_WRDataH,00H
BC EE_WRBYTE_DATAH2
ANDIM PORTC,IIC_SDA_LOW ;0
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
JMP EE_WRBYTE_DATAH3
EE_WRBYTE_DATAH2:
ORIM PORTC,IIC_SDA_MASK ;1
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
EE_WRBYTE_DATAH3:
SBIM TMP1,01H
BNZ EE_WRBYTE_DATAH1 ;DATAH OVER
LDI TMP1,04H
EE_WRBYTE_DATAL1:
LDA EE_WRDataL,00H
ADDM EE_WRDataL,00H
BC EE_WRBYTE_DATAL2
ANDIM PORTC,IIC_SDA_LOW ;0
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
JMP EE_WRBYTE_DATAL3
EE_WRBYTE_DATAL2:
ORIM PORTC,IIC_SDA_MASK ;1
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
EE_WRBYTE_DATAL3:
SBIM TMP1,01H
BNZ EE_WRBYTE_DATAL1 ;DATAL OVER
;***********************************************
;RECEIVE ACK BIT
;***********************************************
LDI PCOUT, 1001B
ORIM PORTC,IIC_SDA_MASK ;PULL UP
ORIM PORTC,IIC_SCL_MASK
;LDI TMP1,IIC_SDA_MASK
;AND PORTC,00H
;BNZ EE_WRCOMMON_EEROR
LDA PORTC, 00H
BA2 $-1
LDI PCOUT,1101B
LDI PORTC,0001B
LDI TMP1,00H
STA EE_WRByteRTN,00H
JMP EE_WRBYTE_EXIT
EE_WRBYTE_EEROR:
ANDIM PORTC,IIC_SCL_LOW
ORIM PCOUT,IIC_SDA_OUTPUT
;LDI TMP1,0FH
LDI EE_WRByteRTN,0FH
EE_WRBYTE_EXIT:
;***********************************************
;GENERATE STOP
;***********************************************
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ORIM PORTC,IIC_SDA_MASK
;LDA IE ;Protect the IE
;STA IE_BAK
;LDI IRQ, 00H
;LDI IE,0000B
;LDA RomBankTMP,00H
;STA ROMBANK
JMP I2C_WRITE_BYTE_OVER
; RTNI
;
;
;
EE_WRCOMMON:
LDI PCOUT, 0FH ;SOME INITIAL SETTING
LDI PULL, 1100B
LDI PORTC, 0001B ;VCC,
LDI TMP1, 00H
LDI TMP2, 00H
ORIM PORTC,IIC_SDA_MASK
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SDA_LOW
ANDIM PORTC,IIC_SCL_LOW ;GENERATE START
;***********************************************
;WRITE COMMAND:1010
;***********************************************
ORIM PORTC,IIC_SDA_MASK
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;1
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
ORIM PORTC,IIC_SDA_MASK
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;1
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
;***********************************************
;WRITE ADDR:0000
;***********************************************
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
;***********************************************
;WRITE OPCODE BIT:0
;***********************************************
ANDIM PORTC,IIC_SDA_LOW
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW ;0
;***********************************************
;RECEIVE ACK BIT
;***********************************************
;ANDIM PCOUT,IIC_SDA_INPUT
;ORIM PORTC,IIC_SDA_MASK ;PULL UP
LDI PCOUT, 1001B
ORIM PORTC, IIC_SDA_MASK
ORIM PORTC,IIC_SCL_MASK
;LDI TMP1,IIC_SDA_MASK
;AND PORTC,00H
LDA PORTC, 00H
BA2 $-1
;BNZ EE_WRCOMMON_EEROR
;ORIM PCOUT,IIC_SDA_OUTPUT
LDI PCOUT, 1101B
LDI PORTC,0001B
;ANDIM PORTC,IIC_SCL_LOW
;ORIM PORTC, IIC_SDA_MASK
;***********************************************
;WRITE ADDRESS(8 BITS)
;***********************************************
LDI TMP1,04H
EE_WRCOMMON_ADDRH1:
LDA EE_ADDRESSH,00H
ADDM EE_ADDRESSH,00H
BC EE_WRCOMMON_ADDRH2
ANDIM PORTC,IIC_SDA_LOW ;0
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
JMP EE_WRCOMMON_ADDRH3
EE_WRCOMMON_ADDRH2:
ORIM PORTC,IIC_SDA_MASK ;1
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
EE_WRCOMMON_ADDRH3:
SBIM TMP1,01H
BNZ EE_WRCOMMON_ADDRH1 ;ADDRH OVER
LDI TMP1,04H
EE_WRCOMMON_ADDRL1:
LDA EE_ADDRESSL,00H
ADDM EE_ADDRESSL,00H
BC EE_WRCOMMON_ADDRL2
ANDIM PORTC,IIC_SDA_LOW ;0
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
JMP EE_WRCOMMON_ADDRL3
EE_WRCOMMON_ADDRL2:
ORIM PORTC,IIC_SDA_MASK ;1
ORIM PORTC,IIC_SCL_MASK
ANDIM PORTC,IIC_SCL_LOW
EE_WRCOMMON_ADDRL3:
SBIM TMP1,01H
BNZ EE_WRCOMMON_ADDRL1 ;ADDRL OVER
;***********************************************
;RECEIVE ACK BIT
;***********************************************
;ANDIM PCOUT,IIC_SDA_INPUT
LDI PCOUT, 1001B
ORIM PORTC,IIC_SDA_MASK ;PULL UP
ORIM PORTC,IIC_SCL_MASK
;LDI TMP1,IIC_SDA_MASK
;AND PORTC,00H
;BNZ EE_WRCOMMON_EEROR
LDA PORTC, 00H
BA2 $-1
LDI PCOUT,1101B
LDI PORTC,0001B
;ANDIM PORTC,IIC_SCL_LOW
LDI TMP1,00H
STA EE_WRCOMMONRTN,00H
RTNI
EE_WRCOMMON_EEROR:
;LDI TMP1,0FH
LDI EE_WRCOMMONRTN,0FH
RTNI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -