Horloge_Lepot_2016_2017/horloge/max7219.cpp

126 lines
2.1 KiB
C++

/*
* max7219.cpp
*
* Created: 17-10-17 21:26:30
* Author: Adrien
*/
#define F_CPU 16000000UL
#include "max7219.h"
#include "util.h"
#include <assert.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/cpufunc.h>
max7219::max7219(uint8_t din, uint8_t load, uint8_t clk, uint8_t nOfDigit)
{
this->din = pinArduinoToPINXX(din);
this->load = pinArduinoToPINXX(load);
this->clk = pinArduinoToPINXX(clk);
this->nOfDigit = nOfDigit;
pinDin = pinToPINX(din);
pinLoad = pinToPINX(load);
pinClk = pinToPINX(clk);
ddrDin = pinDin+1; ddrLoad=pinLoad+1;ddrClk=pinClk+1;
portDin = pinDin+2; portLoad=pinLoad+2;portClk=pinClk+2;
*ddrDin |= _BV(pinArduinoToPINXX(din));
*ddrLoad |= _BV(pinArduinoToPINXX(load));
*ddrClk |= _BV(pinArduinoToPINXX(clk));
setLoadTo(1);
setClkTo(0);
setDataTo(0);
_delay_ms(50);
sendRAWdata(nOfDigit, SCANLIMIT);
sendRAWdata((0xff),DECODEMODE);
on();
}
void max7219::sendRAWdata(volatile uint8_t data, volatile address ad)
{
int i = 0;
setClkTo(0);
setLoadTo(0);
_NOP();
_NOP();
for (i=0; i<8 ; i++)
{
setDataTo(ad&(0b10000000>>i));
_NOP();
_NOP();
setClkTo(1);
_delay_us(1);
setClkTo(0);
_NOP();
_NOP();
}
for (i=0; i<8 ; i++)
{
setClkTo(0);
setDataTo(data&(0b10000000>>i));
_NOP();
_NOP();
setClkTo(1);
_delay_us(1);
setClkTo(0);
_NOP();
_NOP();
}
setLoadTo(1);
_delay_us(1);
}
void max7219::on()
{
sendRAWdata(0x01, SHUTDOWN);
}
void max7219::off()
{
sendRAWdata(0x00, SHUTDOWN);
}
void max7219::sendDigitFromArray(uint8_t *array, uint8_t s)
{
sendRAWdata(0xFF, DECODEMODE);
for (int i=0;i<s;i++)
{
sendRAWdata(array[i],(address)(D1+i));
}
}
void max7219::setIntensity(const uint8_t i)
{
sendRAWdata(i, INTENSITY);
}
void max7219::setClkTo(uint8_t v)
{
if(v)
{
*portClk |= _BV(clk);
}
else
{
*portClk &= ~(_BV(clk));
}
}
void max7219::setLoadTo(uint8_t v)
{
if(v)
{
*portLoad |= _BV(load);
}
else
{
*portLoad &= ~(_BV(load));
}
}
void max7219::setDataTo(uint8_t v)
{
if(v)
{
*portDin |= _BV(din);
}
else
{
*portDin &= ~(_BV(din));
}
}