Une horloge à afficheurs 7 segments

Dependencies:   BSP_DISCO_F746NG

horloge.cpp

Committer:
sol427
Date:
2020-06-22
Revision:
4:06a5a25319d5

File content as of revision 4:06a5a25319d5:

#include "horloge.h"
#include "mbed.h"
#include <stdint.h>
#include <vector>
//#include "stm32746g_discovery_lcd.h"


Horloge::Horloge() 
    : m_minutes(59), m_heures(23), m_minutesPre(100), m_heuresPre(100), m_secondesPre(100)
{
    set_time(54);
    dataPin = new DigitalOut(D8, 0);
    clockPin = new DigitalOut(D9, 0);
    latchPin = new DigitalOut(D10, 0);
    enablePin = new PwmOut(D11);
    enablePin->period(0.00002f);
    enablePin->write(0.6f);
    
}

void Horloge::setTempsPrecedent(uint8_t minutes, uint8_t heures) {
    m_minutesPre = minutes;
    m_heuresPre = heures;
}

vector<uint8_t> Horloge::get4Digits() {
    vector<uint8_t> digits;
    
    digits.push_back(m_heures / 10);
    digits.push_back(m_heures % 10);
    digits.push_back(m_minutes / 10);
    digits.push_back(m_minutes % 10);
    
    return digits;   
}

uint8_t Horloge::getMinutes() {
    return m_minutes;
}

uint8_t Horloge::getHeures() {
    return m_heures;
}

uint8_t Horloge::getMinutesPre() {
    return m_minutesPre;
}

uint8_t Horloge::getHeuresPre() {
    return m_heuresPre;
}

void Horloge::setRegistres(DigitalOut* dataPin, DigitalOut* clockPin, uint8_t data) {
    for(uint8_t i = 0; i < 8; i++)
    {
        dataPin->write(data & (1 << i));
        HAL_Delay(1);
        clockPin->write(1);
        HAL_Delay(1);
        clockPin->write(0);
    }
}

void Horloge::minuteP() {
    if(m_minutes == 59) {
        m_minutes = 0;
        heureP();
    } else {
        m_minutes++;
    }
}

void Horloge::minuteM() {
    if(m_minutes == 0) {
        m_minutes = 59;
    } else {
        m_minutes--;
    }
}

void Horloge::heureP() {
    if(m_heures == 23) {
        m_heures = 0;
    } else {
        m_heures++;
    }
}

void Horloge::heureM() {
    if(m_heures == 0) {
        m_heures = 23;
    } else {
        m_heures--;
    }
}

void Horloge::update() {
    // récupère l'heure
    uint8_t secondes = (uint8_t)time(NULL);
    if(secondes == 59) {
        set_time(0);
        minuteP();
        
    }
    // affiche l'heure sur les LEDs si elle a changée
    if (secondes != m_secondesPre) {
        vector<uint8_t> temps = get4Digits();
    
        latchPin->write(1);
        if(point == true) {
            setRegistres(dataPin, clockPin, m_table[temps.at(0)]);
            setRegistres(dataPin, clockPin, m_table[temps.at(1)]+128);
            setRegistres(dataPin, clockPin, m_table3[temps.at(2)]+8);
            setRegistres(dataPin, clockPin, m_table[temps.at(3)]);
        } else {
            setRegistres(dataPin, clockPin, m_table[temps.at(0)]);
            setRegistres(dataPin, clockPin, m_table[temps.at(1)]);
            setRegistres(dataPin, clockPin, m_table3[temps.at(2)]);
            setRegistres(dataPin, clockPin, m_table[temps.at(3)]);
        }
        latchPin->write(0);
        point = !point;
    }
    
    m_secondesPre = secondes;
}

void Horloge::sonner() {
    
}