Programa de ensamblaje de lectura/escritura de 51 microcontroladores I2C a 24c02 resueltos
; Programa de prueba AT24C04 Para referencia
Frecuencia de trabajo: 12.000MHz
; *************************; **** ********* **
Línea de reloj SCL P2.0 de AT24C04
Línea de datos SDA BIT P2.1<; /p>
BUF EQU 30H; Búfer de datos
; ******************************* *** *****
ORG 0
Reset JMP
ORG 100H
Reset:
LLAME A AT24C04_WritePage ;Escriba una página de datos
LLAME a Delay5ms ;Escriba una página de datos con un retraso de 5ms
LLAME A AT24C04_ReadPage ;Lea una página de datos
JMP $ p>
******************************************
;Escriba 1 página (16 bytes) de datos en el AT24C04
;Escriba 16 comenzando desde TESTDATA en el dispositivo. Los datos de prueba están en la dirección 00~0F del. dispositivo
; Parámetros de entrada: Ninguno
; Parámetros de salida: Ninguno
; *************** ********** ************
AT24C04_WritePage:
LLAME A AT24C04_Start Señal de inicio
MOV A, #0A0H; Enviar señal de dirección de escritura del dispositivo
CALL AT24C04_SendByte; Enviar
MOV A, #00H; Enviar dirección de unidad de memoria
CALL AT24C04_SendByte;
MOV R0, #16; contador de 16 bytes
MOV DPTR, #TESTDATA primera dirección de datos de prueba
Escribir siguiente:
CLR A; leer datos de prueba
MOVC A, @A DPTR
CALL AT24C04_SendByte; escribir dispositivo
INC DPTR preparar la dirección de los siguientes datos
p>
DJNZ R0, WriteNext; juzgue si se completaron 16 bytes
CALL AT24C04_Stop; señal de parada
RET
TESTDATA:
DB 000H, 011H, 022H, 033H, 044H, 055H, 066H, 077H
DB 088H, 099H, 0AAH, 0BBH, 0CCH, 0DDH, 0EEH, 0FFH
*; *******
********* **********************
Leer 1 página (16 bytes) de datos de AT24C04
; Leer datos de la dirección 00~0F del dispositivo y almacenarlos en el BUF en el área DATOS
Parámetros de entrada: Ninguno
; :Ninguno
;******* ******************************* p>
AT24C04_ReadPage:
LLAMADA AT24C04_Start; Señal de inicio
MOV A, #0A0H; Enviar señal de escritura de dirección del dispositivo
LLAMADA AT24C04 _SendByte<; /p>
MOV A, #00H; Enviar dirección de celda de memoria
CALL AT24C04_SendByte; Enviar
CALL AT24C04_Start Iniciar señal
MOV A, #; 0A1H ;Enviar señal de lectura de dirección del dispositivo
CALL AT24C04_SendByte ;Enviar
MOV R0,#16 ;Contador de 16 bytes
MOV R1,#BUF ;Búfer de datos primero dirección
ReadNext:
LLAMADA A AT24C04_RecvByte; Leer datos
MOV @R1, A; Guardar datos
CJNE R0, #2, $ 3; juzgue si responder a ACK o NAK
LLAMADA AT24C04_SendACK; Enviar señal de respuesta
INC R1 dirección de búfer más 1
DJNZ R0, ReadNext; Determine si se han completado 16 bytes
CALL AT24C04_Stop; Señal de parada
RET
************** * ************************
;Retraso de 5 microsegundos
;Entorno de trabajo diferente, es necesario ajustar esta función
; Parámetro de entrada: Ninguno
; Parámetro de salida: Ninguno
************** ***********************
Delay5us:;2 Al cambiar a 1T MCU, ajuste esta función de retardo
NOP; 1
RET; 2 CALL Delay5us; retraso
CLR SDA; generar flanco descendente
CALL Delay5us; CLR SCL; bajar la línea del reloj
RET
; **************************** * *****
*** ***
;Señal de parada
;Parámetro de entrada: Ninguno
;Parámetro de salida: Ninguno
;** ********************************
AT24C04_Stop:
CLR SDA
SETB SCL; levanta la línea del reloj
CALL Delay5us; retardo
SETB SDA; genera flanco ascendente
CALL Delay5us; Retraso
RET
;****************************** *** *** ***
; Enviar señal de respuesta
; Parámetro de entrada: C (0: ACK 1: NAK)
; Parámetro de salida: Ninguno
;******************************************< / p>
AT24C04_SendACK:
MOV SDA, C; Escribir señal de respuesta
SETB SCL; Tirar de la línea de reloj alto
CALL Delay5us; p >
CLR SCL ;Tirar de la línea de reloj baja
CALL Delay5us ;Retraso
RET
;*********** * ****************************
;Recibir señal de respuesta
;Parámetro de entrada : Ninguno
;Parámetros de salida: C
;****************************** ******** *******
AT24C04_ RecvACK:
SETB SCL; tira la línea del reloj hacia arriba
CALL Delay5us; retraso
MOV C, SDA; leer la señal de respuesta
CLR SCL; bajar la línea del reloj
CALL Delay5us; RET
;.*************************************** **
;Enviar al bus IIC Un byte de datos
; Parámetro de entrada: ACC
; Parámetro de salida: Ninguno
; *************** ******************* ******
AT24C04_SendByte:
PUSH 0
MOV 0, #8; contador de 8 bits
EnviarSiguiente:
RLC A; datos
MOV SDA, C; puerto de envío de datos
p>
SETB SCL; levanta la línea del reloj
CALL Delay5us; >
CLR SCL; bajar la línea del reloj
CALL Delay5us; retraso
DJNZ 0, SendNext determina si se completa la transmisión de datos de 8 bits
POP 0
JMP AT24C04_R
ecvACK; recibir señal de respuesta
; RET
;**************************** **********
; Recibir un byte de datos del bus IIC
; Parámetros de entrada: Ninguno
; ACC
;******************************************
AT24C04_RecvByte:
SETB SDA; Habilitar pull-up interno, listo para leer datos
PUSH 0
MOV 0, #8; Contador de 8 bits
RecvNext:
SETB SCL; línea de reloj activada
CALL Delay5us; Leer puerto de datos
RLC A; guardar datos
CLR SCL; bajar la línea del reloj
CALL Delay5us
DJNZ 0; , RecvNext OK 8 ¿Se completó la recepción de datos de bits
POP 0
RET
;*************** ********* *******************
FIN