
 MODULE LCD
 #include "binary_c.h"
 #include <ioavr.h>
  EXTERN digit_1_0, digit_3_2, digit_4
  PUBLIC  INIT_LCD
  PUBLIC  LCD_Wait
  PUBLIC  COMMAND_4BIT
  PUBLIC  LCD_WriteData
  PUBLIC  FUNCTION_SET
  PUBLIC  Bin2BCD


 RSEG NEAR_Z        // список переменных
	
 RSEG CODE

// Регистры R4–R15 and R24–R27 нельзя использовать в асме

INIT_LCD:		
				LDI     R22, 15			
				call	delay_ms			
				IN      R16,DDRC
				ORI     R16,0x7F
				OUT     DDRC,R16	
				IN      R16,PORTC			
				ANDI    R16,0x7F
				OUT     PORTC,R16	
				IN      R16,PORTC		
				ANDI    R16,0x07
				OUT     PORTC,R16	
				CBI     PORTC, 2
				LDI     R16,_0b00110000		//INITIAL SETTING ONCE
				CALL    COMMAND_8BIT
				LDI     R22, 10
				call	delay_ms 			//4.1 ms
				LDI     R16,_0b00110000		//INITIAL SETTING TWICE
				CALL    COMMAND_8BIT
				LDI     R22, 100
				call	delay_us 			//100us
				LDI     R16,_0b00110000		//INITIAL SETTING THIRD
				CALL    COMMAND_8BIT
				LDI     R22, 40
				call	delay_us 			//39us
				LDI     R16,_0b00101000		//Function Set 0010NF**
				CALL    COMMAND_8BIT            //4bit ,1 Line ,5*8 Font
				LDI     R16,_0b00101000		//Function Set 0010NF**
				CALL    COMMAND_4BIT            //4bit ,2 Line ,5*8 Font
				LDI     R16,_0b00001100		// Display ON/OFF = 00001DCB
				CALL    COMMAND_4BIT            //Display ON,Cursor&Blink OFF
				LDI     R16,_0b00000110		// Entry Mode Set = 000001IS
				CALL    COMMAND_4BIT            //Increment & Shift OFF
				LDI     R16,_0b00000010		// Return Home
				CALL    COMMAND_4BIT
				LDI     R16,_0b00000001		// Clear Display
				CALL    COMMAND_4BIT            //Write 20H to DDRAM
				LDI     R16,_0b00000000
				OUT     PORTC,R16
				RET
//****************************************************************************
LCD_Wait:
				LDI     R19, 0
				IN      R18,DDRC
				ANDI    R18,0x07 // Сохранить значения в трёх разрядах остальное похерить
				OUT     DDRC,R18
				IN      R18,PORTC			//включаем pull-up резисторы
				ORI     R18,0x78
				OUT     PORTC,R18
				SBI     PORTC,1				//RW в 1 чтение из lcd
				CBI     PORTC,0				//RS в 0 команды
Lcd_BUSY:			SBI     PORTC,2				// по новой
				INC	R19
				BRVC	no_INIT
				CALL    INIT_LCD			// если не отвечает индикатор
no_INIT:			CPI	R19, 9
				BRLO	no_err
				LDI     R22, 50
				call	delay_ms
no_err:				LDI     R22, 2
				call	delay_us 	
				IN      R17,PINC			//чтение данных с порта
				ANDI    R17,0x78
				CBI     PORTC,2
				SWAP    R17
				SBI     PORTC,2
				LDI     R22, 2
				call	delay_us 	
				IN      R18,PINC			//чтение данных с порта
				ANDI    R18,0x78
				OR      R17,R18
				CBI     PORTC,2
				SWAP    R17
				BST     R17,6
				BRTS    Lcd_BUSY
				CBI     PORTC,1
				IN      R18,DDRC
				ORI     R18,0x78
				OUT     DDRC,R18		
				RET
//*******************************************************************************
COMMAND_8BIT:	
				CBI     PORTC, 0
				CBI     PORTC, 1

				CALL	wr_H_nb

				SBI     PORTC, 2

				LDI     R22, 2
				call	delay_us

				CBI     PORTC, 2
				RET
//****************************************************************************
COMMAND_4BIT:
				CALL	LCD_Wait
				CBI     PORTC, 0
				CBI     PORTC, 1

				CALL	wr_H_nb

				SBI     PORTC, 2

				LDI     R22, 2
				call	delay_us

				CBI     PORTC, 2

				CALL	wr_L_nb

				SBI     PORTC, 2

				LDI     R22, 2
				call	delay_us

				CBI     PORTC, 2
				RET
//*******************************************************************************
FUNCTION_SET:
				CALL	LCD_Wait
                		CBI     PORTC, 0
                		CBI     PORTC, 1

				CALL	wr_H_nb

                		SBI     PORTC, 2

				LDI     R22, 2
				call	delay_us

                		CBI     PORTC, 2
                		RET
//*******************************************************************************
LCD_WriteData:
				CALL	LCD_Wait
				SBI     PORTC, 0
				CBI     PORTC, 1

				CALL	wr_H_nb
				
				SBI     PORTC, 2

				LDI     R22, 2
				call	delay_us

				CBI     PORTC, 2

				CALL	wr_L_nb

				SBI     PORTC, 2

				LDI     R22, 2
				call	delay_us

				CBI     PORTC, 2
				RET
//*******************************************************************************
//DELAY  Посчитано для кварца в 16 МГц
		delay_ms:				      //Параметр передаётся в регистре R22
				LDI     R20,0x9F
				LDI     R21,0x0F
cicle_ms:			SUBI    R20,0x01
				SBCI    R21,0x00
				BRNE    cicle_ms
				DEC     R22
				BRNE    delay_ms
				RET
		delay_us:
				LDI     R20,0x05
cicle_us:			DEC     R20
				BRNE    cicle_us
				DEC     R22
				BRNE    delay_us
				RET
//*******************************************************************************
//WRITE
wr_H_nb:			MOV     R19,R16
				LSR     R19
				IN      R17,PORTC
				MOV	R18, R17		// читаем порт сохраняем значения
				ANDI    R18,0x07
				ANDI    R19,0x78
				OR      R18,R19
				OUT     PORTC,R18		//вывод старшей тетрады
				RET


wr_L_nb:			SWAP    R16
				LSR     R16
				IN      R17,PORTC
				ANDI    R17,0x07
				ANDI    R16,0x78
				OR      R17,R16
				OUT     PORTC,R17			//вывод младшей тетрады
				RET

//*******************************************************************************
//Bin2BCD
Bin2BCD:			
				ldi	R18,0xff	;initialize digit 4
binbcd_4:			inc	R18		;
				subi	R16,0x10	;low(10000);subiw fbin,10000
				sbci	R17,0x27	;high(10000)
				brcc	binbcd_4	;
				sts	digit_4,R18
				
				ldi	R18,0x9f	;initialize digits 3 and 2
binbcd_3:			subi	R18,0x10	;
				subi	R16,0x18	;low(-1000);addiw fbin,1000
				sbci	R17,0xfc	;high(-1000)
				brcs	binbcd_3	;
				
binbcd_2:			inc	R18		;
				subi	R16,0x64	;low(100)	;subiw fbin,100
				sbci	R17,0x00	;high(100) ;
				brcc	binbcd_2	;
				sts	digit_3_2,R18
				
				ldi	R18,0xa0	;initialize digits 1 and 0
binbcd_1:			subi	R18,0x10	;
				subi	R16,-10		;addi fbin,10
				brcs	binbcd_1	;
				add	R18,R16		;LSD
				sts	digit_1_0,R18
				
binBCD_ret:			ret


//*******************************************************************************

ENDMOD
END



