/*
 * HT1621.c
 *
 * Created: 25.08.2021 13:37:01
 * Author : Valery
 */ 

#include <avr/io.h>
#include "main.h"

volatile FUN Fun[END_PROG];
volatile uint16_t  Flag_Prog=0;

const uint8_t sim10[]=
{
	0xBE,//0
	0x06,//1
	0x7c,//2
	0x5e,//3
	0xc6,//4
	0xda,//5
	0xfa,//6
	0x0e,//7
	0xfe,//8
	0xde,//9
	0x00 //отключено
};

const uint8_t point = 0x01;

void send_command(uint8_t command)
{
	uint8_t i;
	uint8_t priamb = 0x01;
	
	CS_ON;
	
	WR0;
	
	for(i = 0; i < 3; i++)
		{
		if(priamb & (1 << i))Data1;
		else Data0;	 
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
		}
	
	for(i = 0; i < 8; command <<= 1, i++)
		{
		if(command & 0x80)Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
		}
	
	CS_OFF;	
}


/*
void send_data(uint8_t mem_adr, uint8_t data)
{
	uint8_t i;
	uint8_t priamb = 0x05;
	
	mem_adr <<=2;
	
	CS_ON;
	
	WR0;
	for(i = 0; i < 3; i++)
		{
		if(priamb & (1 << i))Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
		}
	
	//адрес вначале старший бит А5	
	for(i = 0; i < 6; mem_adr <<= 1, i++)
		{
		if(mem_adr & 0x80)Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
		}
	
	//вначале младший бит
	for(i = 0; i < 4; i++,data >>= 1)
		{
		if(data & 0x01)Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
		}
	
	CS_OFF;
}
*/

//символ занимает 2 адреса по 4 бита
//poz - позиция, sim - код символа
void simvol (uint8_t poz, uint8_t sim)
{
	uint8_t i;
	uint8_t priamb = 0x05;
	
	poz <<= 3;
	
	CS_ON;
	
	WR0;
	for(i = 0; i < 3; i++)
	{
		if(priamb & (1 << i))Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
	}
	
	//адрес вначале старший бит А5
	for(i = 0; i < 6; poz <<= 1, i++)
	{
		if(poz & 0x80)Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
	}
	
	//вначале младший бит
	for(i = 0; i < 8; i++,sim >>=1 )
	{
		if(sim & 0x01 )Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
	}
	
	CS_OFF;
	
}

//вывод строки из буффера buf
//poz_start - позиция, kol - колличество символов
void all_simvol (uint8_t poz_start, uint8_t kol, uint8_t *buf)
{
	uint8_t i,x;
	uint8_t priamb = 0x05;
	
	poz_start <<= 3;
	
	CS_ON;
	
	WR0;
	for(i = 0; i < 3; i++)
	{
		if(priamb & (1 << i))Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
	}
	
	//адрес вначале старший бит А5
	for(i = 0; i < 6; poz_start <<= 1, i++)
	{
		if(poz_start & 0x80)Data1;
		else Data0;
		Pause;
		WR1;//Запись
		Pause;
		WR0;
		Pause;
	}
	
	for(x = 0; x < kol; x++)
	{
		uint8_t sim = buf[x];
		//вначале младший бит
		for(i = 0; i < 8; i++,sim >>=1 )
		{
			if(sim & 0x01 )Data1;
			else Data0;
			Pause;
			WR1;//Запись
			Pause;
			WR0;
			Pause;
		}
	}
	CS_OFF;		
}


void init_lcd(void)
{
	DDR_LCD  |= ((1 << PIN_WR) | (1 << PIN_Data) | (1 << PIN_CS));
	PORT_LCD &= ~((1 << PIN_WR) | (1 << PIN_Data));
	PORT_LCD |= (1 << PIN_CS);
	
	send_command(0x01);
	send_command(0x18);
	send_command(0x29);
	send_command(0x03);	
}

int main(void)
{
	uint8_t i, poz, sim, p=point;
	uint8_t buf[8];
	
	for(i = 0; i < 8; i++)
	{
		buf[i] = sim10[5-i];		
	}
	
	init_lcd();
	
    /* Replace with your application code */
    while (1) 
    {
		_delay_ms(3000);
		
		for(sim = 0; sim < 11 ; sim++)
		{		
			p = 1 - p;
				
			for(poz = 0; poz < 6; poz++)
			{
			_delay_ms(500); 
			simvol (poz, sim10[sim] + p);
			}
		}
		
		all_simvol(0,6,buf);	
    }
}

