dllbridge

BL24C256A + AY + Z80

Jan 23rd, 2026
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Константы
  2. SDA_BIT   EQU 0    ; Бит 0 порта B - SDA
  3. SCL_BIT   EQU 1    ; Бит 1 порта B - SCL
  4. AY_PORTB  EQU 0xFFFD ; Адрес порта B AY
  5.  
  6. ; Инициализация
  7. I2C_INIT:
  8.     LD BC, AY_PORTB
  9.     LD A, 0xFF      ; Все пины на вывод
  10.     OUT (C), A
  11.     ; Установить SDA=1, SCL=1
  12.     LD A, (1<<SDA_BIT) | (1<<SCL_BIT)
  13.     OUT (C), A
  14.     RET
  15.  
  16. ; Старт-условие I²C
  17. I2C_START:
  18.     ; SDA=1, SCL=1 -> SDA=0 при SCL=1
  19.     LD A, (1<<SCL_BIT)
  20.     OUT (C), A
  21.     CALL DELAY
  22.     LD A, 0
  23.     OUT (C), A
  24.     CALL DELAY
  25.     RET
  26.  
  27. ; Отправка байта
  28. I2C_SEND_BYTE:
  29.     LD E, 8        ; 8 бит
  30. I2C_BIT_LOOP:
  31.     RLC D          ; Бит из D в carry
  32.     LD A, 0
  33.     JR NC, BIT_ZERO
  34.     OR (1<<SDA_BIT)
  35. BIT_ZERO:
  36.     OR (1<<SCL_BIT) ; Поднять SCL
  37.     OUT (C), A
  38.     CALL DELAY
  39.     RES SCL_BIT, A  ; Опустить SCL
  40.     OUT (C), A
  41.     CALL DELAY
  42.     DEC E
  43.     JR NZ, I2C_BIT_LOOP
  44.     ; Принять ACK
  45.     RET
  46.  
  47. ; Чтение байта
  48. I2C_READ_BYTE:
  49.     LD E, 8
  50.     LD D, 0
  51.     ; Настроить SDA на вход
  52.     LD A, ~(1<<SDA_BIT)
  53.     OUT (C), A
  54. READ_BIT_LOOP:
  55.     LD A, (1<<SCL_BIT)
  56.     OUT (C), A     ; SCL=1
  57.     CALL DELAY
  58.     ; Прочитать SDA
  59.     IN A, (C)
  60.     AND (1<<SDA_BIT)
  61.     JR Z, BIT_LOW
  62.     SET 0, D       ; Установить бит
  63. BIT_LOW:
  64.     LD A, 0
  65.     OUT (C), A     ; SCL=0
  66.     CALL DELAY
  67.     DEC E
  68.     JR NZ, READ_BIT_LOOP
  69.     LD A, 0xFF     ; Вернуть SDA на вывод
  70.     OUT (C), A
  71.     RET
Advertisement
Add Comment
Please, Sign In to add comment