/* max7219.cpp
 * MAX7219 Interaction Code
 * ---------------------------
 * For more information see
 * http://www.adnbr.co.uk/articles/max7219-and-7-segment-displays
 *
 *  Created on: 29 січ. 2016
 *      Author: shilov
 */

#include <user_config.h>
#include <SmingCore/SmingCore.h>
#include "configuration.h"
#include "max7219.h"

// перевод числа 0-7 в номер индикатора
//const uint8_t max7219_dig[8] = {
//	0x05,0x01,0x07,0x03,0x04,0x08,0x06,0x02
//};

void
MAX7219_writeData (uint8_t reg, uint8_t data)
{
	PinRes(PIN_LOAD); // опустили защёлку

	// software spi
	uint8_t i; // счетчик бит
	uint16_t sdata = ((reg & 0x000F) << 8) | (data & 0x00FF);
	for (i = 16; i != 0; i--)
		{
			PinRes(PIN_CLK); // выдали строб
			if (sdata >= 0x8000)
				{ // если старший бит == 1
					PinSet(PIN_DIN); // MOSI = 1
				}
			else
				{ // если старший бит == 0
					PinRes(PIN_DIN); // MOSI = 0
				}
			PinSet(PIN_CLK); // защёлкнули строб

			sdata <<= 1; // сдвиг влево на 1 бит
		}

	PinSet(PIN_LOAD); // подняли защёлку

	PinSet(PIN_DIN);
}

void MAX7219_Init (void)
{
	// настройка пинов SPI
	pinMode (PIN_LOAD, OUTPUT);
	pinMode (PIN_DIN, OUTPUT);
	pinMode (PIN_CLK, OUTPUT);
	PinSet(PIN_LOAD);
	PinSet(PIN_DIN);
	PinSet(PIN_CLK);

	// Настройка MAX71219
	MAX7219_writeData (MAX7219_MODE_DECODE, MAX7219_DIG_MASK);
	MAX7219_writeData (MAX7219_MODE_SCAN_LIMIT, MAX7219_DIGITS - 1); // Scan limit runs from 0.
	MAX7219_writeData (MAX7219_MODE_INTENSITY, MAX7219_BRIGHT); // яркость
	MAX7219_writeData (MAX7219_MODE_POWER, MAX7219_ON); // включили питание
}

void MAX7219_FillMinus(void)
{
	uint8_t i, m = MAX7219_DIG_MASK;

	for (i = 8; i > 0; i--)
		{
			if (m >= 0x80)
				{
					MAX7219_writeData (i, MAX7219_CHAR_MINUS);
				}
			else
				{
					MAX7219_writeData (i, SYM_Minus);
				}
			m <<= 1;
		}
}
