.include "m8def.inc"
.list

.def temp  =r16
;.def      =r17
;.def      =r18
;.def      =r19
;.def      =r21
;.def      =r22
;.def      =r23
;.def      =r24
.def  SHET    =r25
.def  DATA    =r26
.def TEMP1     =r27
.def TEMP2     =r28
;.def      =r29
;.def      =r30


.cseg
.org 0;

.ORG 0x0000 rjmp  RESET ; Reset Handler
;.ORG 0x0001 RETi   ;ZERO ; Внешний запрос на прерывание по входу INT0
;.ORG 0x0002 RETi   ;CENTR ; Внешний запрос на прерывание по входу INT1
;.ORG 0x0003 RETi
;.ORG 0x0004 RETi
;.ORG 0x0005 RETi   ;ZAXBAT ;Захват по таймеру T/C1
;.ORG 0x0006 RETi
;.ORG 0x0007 RJMP perep   ;PEREPOLNENIE ;T/C0 ПереполRETi
;.ORG 0x0008 ;нение счётчика T/C0
;.ORG 0x000B RJMP  SEND;T Приём данных приёмопередптчиком UART завершен 
;.ORG 0x000C RJMP  PUST;Регистр данных UART пуст 
;.ORG 0x000D RJMP  SEND;Передача данных приёмопередптчиком UART завершена 
 
reset:       
        LDI R16,Low(RAMEND)
        OUT SPL,R16
        LDI R16,High(RAMEND)      
        OUT SPH,R16 
		      
ldi temp, 0x80;
OUT ACSR,temp;
;==============================
;------------------------------
ldi temp,  0x03;
out DDRD,  temp




RCALL i2c_init
;**************************************************
MAIN:

RCALL i2c_start
RCALL lcd_init;
RCALL i2c_stop;



RCALL i2c_start
LDI TEMP , 0x3C RCALL  i2c_send
LDI TEMP , 0x00 RCALL  i2c_send
LDI TEMP , 0x21 RCALL  i2c_send
LDI TEMP , 0x00 RCALL  i2c_send
LDI TEMP , 0x7F RCALL  i2c_send
LDI TEMP , 0x22 RCALL  i2c_send
LDI TEMP , 0x00 RCALL  i2c_send
LDI TEMP , 0x07 RCALL  i2c_send
RCALL  i2c_stop
CLR SHET


RCALL i2c_start
LDI TEMP , 0x3C RCALL  i2c_send
LDI TEMP , 0x40 RCALL  i2c_send


FF:

RCALL lcd_init
INC SHET
CPI SHET ,2
BRNE FF
RCALL i2c_stop;


GGG:
SBI PORTD,0
RJMP GGG
;**************************************************
;**************************************************
lcd_init:              
ldi Temp1,0           ;инициализация регистра                               ;внутренней адресации массив
LCD:
          ldi ZH,High(init24*2) ;загрузка адреса 0-го
          ldi ZL,Low (init24*2)  ;элемента в рег. пару Z
          ldi Temp2,0
          add ZL,Temp1          ;прибавление
          adc ZH,Temp2         ;внутр. адреса
          lpm                  ;загрузка из ПЗУ
          mov Temp,R0         ;копирование

       RCALL   i2c_send      ;вывод в порт

CPI TEMP1 ,27
BREQ VIX
          INC Temp1             ;увелич. внутр. адреса
          rjmp LCD       ;в начало цикла
VIX:
RET
init24:    
       .db $3C,$00,$AE,$A8,$3F,$D3,$00,$40,$A1;;;;;;;;
       .db $C8,$DA,$12,$81,$7F,$A4,$A6,$D5
       .db $80,$8D,$14,$D9,$22,$DB,$30,$20
       .db $00,$AF                     
;**************************************************








////////////////// ПРОЦЕДУРЫ для РАБОТЫ С I2C //////////////////////
//////////////////  РАБОЧИЙ РЕГИСТР TEMP ///////////////////////
i2c_init: //Инициализация и2с
	ldi temp,0X05;32  
	out TWBR,temp
	ldi temp,(0<<TWPS1)|(0<<TWPS0)
	out TWSR,temp
ret

i2c_stop: //Отправляет стоповую посылку
	ldi temp, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
	out TWCR, temp
ret

i2c_start: //Передача стартовой посылки
	ldi temp, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
	out TWCR, temp
	wait1:
	in temp,TWCR
	sbrs temp,TWINT
	rjmp wait1
	
ret


i2c_recive_last: //Считать последний байт и записать в TEMP
	ldi temp, (1<<TWINT|1<<TWEN)
	out TWCR, temp
	wait3:
	in temp,TWCR
	sbrs temp,TWINT
	rjmp wait3
	in temp,TWDR
ret

i2c_recive: //Считывает байт и записывает его в TEMP 
	ldi temp, (1<<TWINT|1<<TWEN|1<<TWEA)
	out TWCR, temp
	wait4:
	in temp,TWCR
	sbrs temp,TWINT
	rjmp wait4
	in temp,TWDR
ret

i2c_send: //Будет передан байт из регистра TEMP
	out TWDR,temp
	ldi temp, (1<<TWINT)|(1<<TWEN)
	out TWCR, temp
   wait2:
	in temp,TWCR
	sbrs temp,TWINT
	rjmp wait2
ret
///////////////////////////////////////////////////////////////////////
