Red de conocimiento informático - Conocimiento sistemático - Programa de ensamblaje de lectura/escritura de 51 microcontroladores I2C a 24c02 resueltos

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 $

******************************************

;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

;******* *******************************

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