; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
.include "m8def.inc"

.def		Arg			=R16
.def		Delay		=R17
.def		Duration	=R18
.def		Counter		=R19
.def      	Temp1		=R20
.def		CmdBitCnt	=R21
.def		S			=R22
.def		I			=R23

.equ		PinReset	=0
.equ		PinCS		=1
.equ		PinSCLK		=2
.equ		PinSDATA	=3

.cseg
.org 0

			rjmp Reset					; Reset Handler

Reset:      
			cli							; запретить прерывания

			ldi Temp1, low(RamEnd)		; Проинициализировать стек
			out SPL, Temp1
			ldi Temp1, high(RamEnd)		
			out SPH, Temp1

			ldi Temp1, 0xFF
			out DDRB, Temp1				; PortB: все выводы - выходы
			out DDRD, Temp1				; PortD: все выводы - выходы
			ldi Temp1, 0x00				; Выведем в PortB все 0
			out PortB, Temp1
			ldi Delay, 250				; Delay 250ms (250 + 106) * 0.7ms
			rcall DelayLong
			ldi Delay, 106
			rcall DelayLong

			rcall LcdInit

; вывод на экран
			ldi Arg, 0x2C				; Memory Write
			rcall LcdCommand

			ldi I, 0
_LL1:
			ldi S, 0
_LL2:
			cpi S, 0
			brne _LL3
			ldi Arg, 15
			rjmp _LL5
_LL3:
			cpi S, 1
			brne _LL4
			ldi Arg, 240
			rjmp _LL5
_LL4:
			ldi Arg, 255
_LL5:
			rcall LcdParameter
			inc S
			cpi S, 3
			brne _LL2
			inc I
			cpi I, 255
			brne _LL1

			rcall LcdCs

			ldi Arg, 0x29				; Display On
			rcall LcdCommand
			rcall LcdCs
; конец вывода на экран

MainLoop:
			sbi PortD,7 				;зажигаем светодиод на 0.5 сек
			ldi Delay,250
			rcall DelayLong
			ldi Delay,250
			rcall DelayLong
			ldi Delay,212
			rcall DelayLong
			cbi PortD,7 				;тушим светодиод на 0.5 сек
			ldi Delay,250
			rcall DelayLong
			ldi Delay,250
			rcall DelayLong
			ldi Delay,212
			rcall DelayLong

			rjmp MainLoop

; -----------------------------------------------------------------------------
; CS=1
; -----------------------------------------------------------------------------
LcdCs:
			sbi PORTB, PinCS
			ret

; -----------------------------------------------------------------------------
;
; -----------------------------------------------------------------------------
LcdInit:
			cbi PORTB, PinReset			; Reset=0
			ldi Delay, 7				; Delay 5ms (7 * 0.7ms)
			rcall DelayLong
			sbi PORTB, PinReset			; Reset=1

			sbi PORTB, PinCS			; CS=1
			sbi PORTB, PinSCLK			; SCLK=1
			sbi PORTB, PinSDATA			; SDATA=1

			ldi Arg, 0x01				; LCD Software Reset
			rcall LcdCommand
			rcall LcdCs
			ldi Delay, 7				; Delay 5ms (7 * 0.7ms)
			rcall DelayLong

			ldi Arg, 0xC6				; Initial Escape
			rcall LcdCommand
			rcall LcdCs

			ldi Arg, 0xB9				; Refresh set REFSET
			rcall LcdCommand
			ldi Arg, 0x00
			rcall LcdParameter
			rcall LcdCs

			ldi Arg, 0xB6				; Display Control DISCTL
			rcall LcdCommand
			ldi Arg, 128
			rcall LcdParameter
			ldi Arg, 128
			rcall LcdParameter
			ldi Arg, 129
			rcall LcdParameter
			ldi Arg, 84
			rcall LcdParameter
			ldi Arg, 69
			rcall LcdParameter
			ldi Arg, 82
			rcall LcdParameter
			ldi Arg, 67
			rcall LcdParameter
			rcall LcdCs

			ldi Arg, 0xB3				; Gray Scale Position GCPSET0
			rcall LcdCommand
			ldi Arg, 1
			rcall LcdParameter
			ldi Arg, 2
			rcall LcdParameter
			ldi Arg, 4
			rcall LcdParameter
			ldi Arg, 8
			rcall LcdParameter
			ldi Arg, 16
			rcall LcdParameter
			ldi Arg, 30
			rcall LcdParameter
			ldi Arg, 40
			rcall LcdParameter
			ldi Arg, 50
			rcall LcdParameter
			ldi Arg, 60
			rcall LcdParameter
			ldi Arg, 70
			rcall LcdParameter
			ldi Arg, 80
			rcall LcdParameter
			ldi Arg, 90
			rcall LcdParameter
			ldi Arg, 100
			rcall LcdParameter
			ldi Arg, 110
			rcall LcdParameter
			ldi Arg, 127
			rcall LcdParameter
			rcall LcdCs

			ldi Arg, 0xB5				; Gamma curve set
			rcall LcdCommand
			ldi Arg, 1					; GCPSET0
			rcall LcdParameter
			rcall LcdCs

			ldi Arg, 0xBD				; ???Common driver output select
			rcall LcdCommand			;
			ldi Arg, 0					; GCPSET0
			rcall LcdParameter
			rcall LcdCs

			ldi Arg, 0xBE				; Power control PWRCTL
			rcall LcdCommand
			ldi Arg, 4					; boosting clock half display clock, internal resistance, high power mode
			rcall LcdParameter
			rcall LcdCs

			ldi Arg, 0x11				; Sleep out
			rcall LcdCommand
			rcall LcdCs

			ldi Arg, 0xBA				; ???Voltage control
			rcall LcdCommand
			ldi Arg, 127				; Voltage 127 - 63
			rcall LcdParameter
			ldi Arg, 3
			rcall LcdParameter
			rcall LcdCs


			ldi Arg, 0x25				; Write Contrast
			rcall LcdCommand
			ldi Arg, 75					; Voltage (was 63)
			rcall LcdParameter
			rcall LcdCs

			ldi Arg, 0xB7				; Temperature gradient set
			rcall LcdCommand
			ldi Arg, 0
			ldi Temp1, 14
_L00:
			rcall LcdParameter
			dec Temp1
			brne _L00
			rcall LcdCs

			ldi Arg, 0x03				; Booster voltage ON
			rcall LcdCommand
			rcall LcdCs

			ldi Delay, 57
			rcall DelayLong				; Delay 40 ms (57 * 0.7ms) while Booster voltage stabilizing


			ldi Arg, 0x20				; Inversion control
			rcall LcdCommand
			rcall LcdCs

			ldi Arg, 0x29				; Display On
			rcall LcdCommand
			rcall LcdCs

; -----------------------------------------------------------------------------
; Send command to LCD
; -----------------------------------------------------------------------------
LcdCommand:
			cbi PORTB, PinCS			; CS=0
			cbi PORTB, PinSCLK			; SCLK=0
			cbi PORTB, PinSDATA			; SDATA=0
			sbi PORTB, PinSCLK			; SCLK=1
_L01:
			ldi CmdBitCnt, 8 			; счетчик битов 
_L02:    
			cbi PORTB, PinSCLK			; SCLK=0
			rol Arg
			brcc _L03
			sbi PORTB, PinSDATA			; SDATA=1
			rjmp _L04
_L03:    
			cbi PORTB, PinSDATA			; SDATA=0
_L04:    
			sbi PORTB, PinSCLK			; SCLK=1			
			dec CmdBitCnt				; уменьшить счетчик 
			brne _L02
			ret

; -----------------------------------------------------------------------------
; Send parameter to LCD
; -----------------------------------------------------------------------------
LcdParameter:
			cbi PORTB, PinCS			; CS=0
			cbi PORTB, PinSCLK			; SCLK=0
			sbi PORTB, PinSDATA			; SDATA=1
			sbi PORTB, PinSCLK			; SCLK=1

			rjmp _L01

; -----------------------------------------------------------------------------
; 2,75uS * Delay
; -----------------------------------------------------------------------------
DelayShort:
			ldi Duration, 2
_L05:
			nop
			dec Duration
			brne _L05
			dec Delay
			brne DelayShort
			ret

; -----------------------------------------------------------------------------
; 0,7ms * Delay
; -----------------------------------------------------------------------------
DelayLong:

			mov Counter, Delay
_L06:
			ldi Delay,0xFF
			rcall DelayShort
			dec Counter
			brne _L06
			ret
