;==========================================================================
;Библитека для реализации программного I2C в микроконтроллерах AVR
;Автор Lpa.
;http://radioelektr.ru
;Библиотека написана на основе Атмеловскоко апноута 
;AVR300: Software I2C™ Master Interface
;==========================================================================

.equ SCL = PB7;Пин, который будет являться SCL
.equ SDA = PB6;Пин, который будет являться SDA

.equ IIC_PORT = PORTB;Порт, на котором будет I2C
.equ IIC_DDR =  DDRB; DDR, на котором будет I2C
.equ IIC_PIN =  PINB; Пин, на котором будет I2C
;==========================================================================
;Настройка портов. Просто вызывается в области инициализации и всё.

iic_init:
CBI IIC_PORT,SDA
CBI IIC_PORT,SCL

CBI IIC_DDR,SDA
CBI IIC_DDR,SCL
ret

;==========================================================================
;Данная подпрограмма делает старт на линии
;Никаких параметров она не имеет - 
;                                 просто вызовите её и на линии будет старт

iic_start:

cbi IIC_DDR,SDA
cbi IIC_DDR,SCL
rcall iic_delay

SBIS IIC_PIN,SDA
rjmp iic_start
SBIS IIC_PIN,SCL
rjmp iic_start

SBI IIC_DDR,SDA
CBI IIC_PORT,SDA
rcall iic_delay
SBI IIC_DDR,SCL
CBI IIC_PORT,SCL
rcall iic_delay

ret
;==========================================================================
;Эта операция стопа. Также - параметров нет, посто вызываете и всё.
iic_stop:

sbi IIC_DDR,SDA
sbi IIC_DDR,SCL
rcall iic_delay

cbi IIC_DDR,SCL
rcall iic_delay
cbi IIC_DDR,SDA
rcall iic_delay
clc
sbic IIC_DDR,SDA
ret
sbic IIC_DDR,SCL
ret
sec

ret
;==========================================================================
;Отправка 1 байта. Байт помещяется в R16 перед вызовом пробцедуры.
;Если после этой операции флаг C регистра SREG в 1 - ACK не было,
;А если в 0 - был принят ACK.
iic_send:
push r16
push r17

ldi r17,8

x42:
    rol r16 
	brcs se1
	sbi IIC_DDR,SDA
	rjmp del_wr

se1:

   cbi IIC_DDR,SDA

del_wr:

  cbi IIC_DDR,SCL
  rcall iic_delay
  sbi IIC_DDR,SCL
  rcall iic_delay
  dec r17
  brne x42
  cbi IIC_DDR,SDA
  rcall iic_delay
  cbi IIC_DDR,SCL
  rcall iic_delay


  clc
  sbic IIC_PIN,SDA
  sec

  sbi IIC_DDR,SCL
  rcall iic_delay


  pop r17
  pop r16

ret
;==========================================================================
;Приём байта. Принятый байт помещяется в R16. ACK генерируется, если
;перед отправкой был установлен флаг T регистра SREG.

iic_recieve:

ldi r16,1

loop_read:

   sbi IIC_DDR,SCL
   cbi IIC_DDR,SDA
   rcall iic_delay
   cbi IIC_DDR,SCL
   rcall iic_delay

   clc

   sbic IIC_PIN,SDA
   sec
   rol r16
   brcc loop_read

   sbi IIC_DDR,SCL
   rcall iic_delay
   brts se0
   cbi IIC_DDR,SDA
   rjmp rd_

se0:
  sbi IIC_DDR,SDA

rd_:

  clc
  rcall iic_delay
  cbi IIC_DDR,SCL
  rcall iic_delay

ret

;========================================================================
;Задержка
iic_delay:
push r16
ldi r16,5

iic_lp:
dec r16
brne iic_lp

pop r16

ret
