.include "m8def.inc"

.equ WS_N		=1;кол-во строк (0-одна,1-две)
.equ WS_F		=0;размер шрифта (0-5х8,1-5х10)
.equ WS_FT1		=1;набор символов (eng_jap FT[1:0]=00,west_euro 1 FT[1:0]=01) 
.equ WS_FT0		=0;набор символов (eng_rus FT[1:0]=10,west_euro 2 FT[1:0]=11)

.equ WS_D		=0;вкл./выкл.дисплея (1-вкл.,0-выкл.)      
.equ WS_C		=0;вкл./выкл.курсора (1-вкл.,0-выкл.)
.equ WS_B		=0;вкл./выкл.мигание курсора (1-вкл.,0-выкл.)

;выбор режима ввода
.equ WS_I_D		=0;смещение курсора (1-увеличение,0-уменьшение)  
.equ WS_SH		=0;вкл./выкл.сдвига (1-вкл.,0-выкл.)

.equ WS_G_C		=0;выбор режима раб.дисп. (1-графический,0-текстовый) 
.equ WS_PWR		=1;внутренний источник (1-вкл.,0-выкл.)

.equ WS_S_C		=0;сдвиг (1-дисплея,0-курсора)  
.equ WS_R_L		=1;напрвление сдвига (1-вправо,0-влево)  

.equ	SCK		=5; SCK(SCL) 
.equ	MISO	=4; MISO(SDO)вход
.equ	MOSI	=3; MOSI(SDI)
.equ	SS		=2; SS(CS) 

.def	Temp0=R16
.def	Temp1=R17
.def	Temp2=R18
.def	Temp3=R19
.def	Temp4=R20
.def	Temp5=R21
.def	Temp6=R22

.dseg 

 data:	.byte 2

.cseg

.org 0

rjmp RESET ; Reset Handler
reti ;rjmp EXT_INT0 ; IRQ0 Handler
reti ;rjmp EXT_INT1 ; IRQ1 Handler
reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
reti ;rjmp USART_RXC ; USART RX Complete Handler
reti ;rjmp USART_UDRE ; UDR Empty Handler
reti ;rjmp USART_TXC ; USART TX Complete Handler
reti ;rjmp ADC_CC ; ADC Conversion Complete Handler
reti ;rjmp EE_RDY ; EEPROM Ready Handler
reti ;rjmp ANA_COMP ; Analog Comparator Handler
reti ;rjmp TWSI ; Two-wire Serial Interface Handler
reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler

RESET:
		ldi Temp0,high(RAMEND)
		out SPH,Temp0 
		ldi Temp0,low(RAMEND)
		out SPL,Temp0

		ldi Temp0,(1<<SCK)|(0<<MISO)|(1<<MOSI)|(1<<SS)		   
		out DDRB,Temp0				
		
		sbi PortB,SS				; Вывод SS на +5 
		sbi PortB,MISO 				; На MISO подключаем подтягивающий резистор 
		
		sei 
		
;-------------------------- 
init_oled:		
		
		cbi PortB,SS			

		ldi temp1,0b00000000		; RS=0,RW=0		  
		sts data,Temp1	
		
		ldi temp1,(1<<5)|(1<<4)|(WS_N<<3)|(WS_F<<2)|(WS_FT1<<1)|(WS_FT0<<0)
		sts data+1,Temp1

		rcall write_10bit
		
		ldi temp1,0b00000000		; RS=0,RW=0		  
		sts data,Temp1	
		
		ldi temp1,(1<<3)|(WS_D<<2)|(WS_C<<1)|(WS_B<<0)			
		sts data+1,Temp1

		rcall write_10bit
		
		ldi temp1,0b00000000		; RS=0,RW=0		  
		sts data,Temp1	
		
		ldi temp1,0b00000001		;это не команда очистки дисплея не путать 	
		sts data+1,Temp1

		rcall write_10bit

		ldi temp1,0b00000000		; RS=0,RW=0		  
		sts data,Temp1	
		
		ldi temp1,0b00000010		;возврат в начало	
		sts data+1,Temp1

		rcall write_10bit
		;rcall wait

		ldi temp1,0b00000000		; RS=0,RW=0		  
		sts data,Temp1	
		
		ldi temp1,(1<<2)|(WS_I_D<<1)|(WS_SH<<0)			
		sts data+1,Temp1

		rcall write_10bit

		ldi temp1,0b00000000		; RS=0,RW=0		  
		sts data,Temp1	
		
		ldi temp1,(1<<4)|(WS_S_C<<3)|(WS_R_L<<2)		
		sts data+1,Temp1

		rcall write_10bit

		ldi temp1,0b00000000		; RS=0,RW=0		  
		sts data,Temp1	
		
		ldi temp1,(1<<4)|(WS_G_C<<3)|(WS_PWR<<2)|(1<<1)|(1<<0)		
		sts data+1,Temp1

		rcall write_10bit		

		sbi PortB,SS
;--------------------------

cycle:	rjmp cycle

write_10bit:
		clr temp0
		lds temp1,data		
shift_0:		
		cpi temp0,2
		brne shift_1
		lds temp1,data+1		
shift_1:
		cpi temp0,10
		breq shift_3
		
		mov temp2,temp1
		andi temp2,0b10000000
		cpi temp2,0b10000000
		breq shift_2
		cbi PortB,MOSI
		rjmp pc+2
shift_2:
		sbi PortB,MOSI
		lsl temp1
		sts data,temp1
		inc temp0

		sbi	PortB,SCK				
		nop	
		cbi	PortB,SCK		

		rjmp shift_0

shift_3:ret


	


