
Une horloge à afficheurs 7 segments
Dependencies: BSP_DISCO_F746NG
horloge.cpp@4:06a5a25319d5, 2020-06-22 (annotated)
- Committer:
- sol427
- Date:
- Mon Jun 22 16:33:43 2020 +0000
- Revision:
- 4:06a5a25319d5
Horloge fonctionnelle
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sol427 | 4:06a5a25319d5 | 1 | #include "horloge.h" |
sol427 | 4:06a5a25319d5 | 2 | #include "mbed.h" |
sol427 | 4:06a5a25319d5 | 3 | #include <stdint.h> |
sol427 | 4:06a5a25319d5 | 4 | #include <vector> |
sol427 | 4:06a5a25319d5 | 5 | //#include "stm32746g_discovery_lcd.h" |
sol427 | 4:06a5a25319d5 | 6 | |
sol427 | 4:06a5a25319d5 | 7 | |
sol427 | 4:06a5a25319d5 | 8 | Horloge::Horloge() |
sol427 | 4:06a5a25319d5 | 9 | : m_minutes(59), m_heures(23), m_minutesPre(100), m_heuresPre(100), m_secondesPre(100) |
sol427 | 4:06a5a25319d5 | 10 | { |
sol427 | 4:06a5a25319d5 | 11 | set_time(54); |
sol427 | 4:06a5a25319d5 | 12 | dataPin = new DigitalOut(D8, 0); |
sol427 | 4:06a5a25319d5 | 13 | clockPin = new DigitalOut(D9, 0); |
sol427 | 4:06a5a25319d5 | 14 | latchPin = new DigitalOut(D10, 0); |
sol427 | 4:06a5a25319d5 | 15 | enablePin = new PwmOut(D11); |
sol427 | 4:06a5a25319d5 | 16 | enablePin->period(0.00002f); |
sol427 | 4:06a5a25319d5 | 17 | enablePin->write(0.6f); |
sol427 | 4:06a5a25319d5 | 18 | |
sol427 | 4:06a5a25319d5 | 19 | } |
sol427 | 4:06a5a25319d5 | 20 | |
sol427 | 4:06a5a25319d5 | 21 | void Horloge::setTempsPrecedent(uint8_t minutes, uint8_t heures) { |
sol427 | 4:06a5a25319d5 | 22 | m_minutesPre = minutes; |
sol427 | 4:06a5a25319d5 | 23 | m_heuresPre = heures; |
sol427 | 4:06a5a25319d5 | 24 | } |
sol427 | 4:06a5a25319d5 | 25 | |
sol427 | 4:06a5a25319d5 | 26 | vector<uint8_t> Horloge::get4Digits() { |
sol427 | 4:06a5a25319d5 | 27 | vector<uint8_t> digits; |
sol427 | 4:06a5a25319d5 | 28 | |
sol427 | 4:06a5a25319d5 | 29 | digits.push_back(m_heures / 10); |
sol427 | 4:06a5a25319d5 | 30 | digits.push_back(m_heures % 10); |
sol427 | 4:06a5a25319d5 | 31 | digits.push_back(m_minutes / 10); |
sol427 | 4:06a5a25319d5 | 32 | digits.push_back(m_minutes % 10); |
sol427 | 4:06a5a25319d5 | 33 | |
sol427 | 4:06a5a25319d5 | 34 | return digits; |
sol427 | 4:06a5a25319d5 | 35 | } |
sol427 | 4:06a5a25319d5 | 36 | |
sol427 | 4:06a5a25319d5 | 37 | uint8_t Horloge::getMinutes() { |
sol427 | 4:06a5a25319d5 | 38 | return m_minutes; |
sol427 | 4:06a5a25319d5 | 39 | } |
sol427 | 4:06a5a25319d5 | 40 | |
sol427 | 4:06a5a25319d5 | 41 | uint8_t Horloge::getHeures() { |
sol427 | 4:06a5a25319d5 | 42 | return m_heures; |
sol427 | 4:06a5a25319d5 | 43 | } |
sol427 | 4:06a5a25319d5 | 44 | |
sol427 | 4:06a5a25319d5 | 45 | uint8_t Horloge::getMinutesPre() { |
sol427 | 4:06a5a25319d5 | 46 | return m_minutesPre; |
sol427 | 4:06a5a25319d5 | 47 | } |
sol427 | 4:06a5a25319d5 | 48 | |
sol427 | 4:06a5a25319d5 | 49 | uint8_t Horloge::getHeuresPre() { |
sol427 | 4:06a5a25319d5 | 50 | return m_heuresPre; |
sol427 | 4:06a5a25319d5 | 51 | } |
sol427 | 4:06a5a25319d5 | 52 | |
sol427 | 4:06a5a25319d5 | 53 | void Horloge::setRegistres(DigitalOut* dataPin, DigitalOut* clockPin, uint8_t data) { |
sol427 | 4:06a5a25319d5 | 54 | for(uint8_t i = 0; i < 8; i++) |
sol427 | 4:06a5a25319d5 | 55 | { |
sol427 | 4:06a5a25319d5 | 56 | dataPin->write(data & (1 << i)); |
sol427 | 4:06a5a25319d5 | 57 | HAL_Delay(1); |
sol427 | 4:06a5a25319d5 | 58 | clockPin->write(1); |
sol427 | 4:06a5a25319d5 | 59 | HAL_Delay(1); |
sol427 | 4:06a5a25319d5 | 60 | clockPin->write(0); |
sol427 | 4:06a5a25319d5 | 61 | } |
sol427 | 4:06a5a25319d5 | 62 | } |
sol427 | 4:06a5a25319d5 | 63 | |
sol427 | 4:06a5a25319d5 | 64 | void Horloge::minuteP() { |
sol427 | 4:06a5a25319d5 | 65 | if(m_minutes == 59) { |
sol427 | 4:06a5a25319d5 | 66 | m_minutes = 0; |
sol427 | 4:06a5a25319d5 | 67 | heureP(); |
sol427 | 4:06a5a25319d5 | 68 | } else { |
sol427 | 4:06a5a25319d5 | 69 | m_minutes++; |
sol427 | 4:06a5a25319d5 | 70 | } |
sol427 | 4:06a5a25319d5 | 71 | } |
sol427 | 4:06a5a25319d5 | 72 | |
sol427 | 4:06a5a25319d5 | 73 | void Horloge::minuteM() { |
sol427 | 4:06a5a25319d5 | 74 | if(m_minutes == 0) { |
sol427 | 4:06a5a25319d5 | 75 | m_minutes = 59; |
sol427 | 4:06a5a25319d5 | 76 | } else { |
sol427 | 4:06a5a25319d5 | 77 | m_minutes--; |
sol427 | 4:06a5a25319d5 | 78 | } |
sol427 | 4:06a5a25319d5 | 79 | } |
sol427 | 4:06a5a25319d5 | 80 | |
sol427 | 4:06a5a25319d5 | 81 | void Horloge::heureP() { |
sol427 | 4:06a5a25319d5 | 82 | if(m_heures == 23) { |
sol427 | 4:06a5a25319d5 | 83 | m_heures = 0; |
sol427 | 4:06a5a25319d5 | 84 | } else { |
sol427 | 4:06a5a25319d5 | 85 | m_heures++; |
sol427 | 4:06a5a25319d5 | 86 | } |
sol427 | 4:06a5a25319d5 | 87 | } |
sol427 | 4:06a5a25319d5 | 88 | |
sol427 | 4:06a5a25319d5 | 89 | void Horloge::heureM() { |
sol427 | 4:06a5a25319d5 | 90 | if(m_heures == 0) { |
sol427 | 4:06a5a25319d5 | 91 | m_heures = 23; |
sol427 | 4:06a5a25319d5 | 92 | } else { |
sol427 | 4:06a5a25319d5 | 93 | m_heures--; |
sol427 | 4:06a5a25319d5 | 94 | } |
sol427 | 4:06a5a25319d5 | 95 | } |
sol427 | 4:06a5a25319d5 | 96 | |
sol427 | 4:06a5a25319d5 | 97 | void Horloge::update() { |
sol427 | 4:06a5a25319d5 | 98 | // récupère l'heure |
sol427 | 4:06a5a25319d5 | 99 | uint8_t secondes = (uint8_t)time(NULL); |
sol427 | 4:06a5a25319d5 | 100 | if(secondes == 59) { |
sol427 | 4:06a5a25319d5 | 101 | set_time(0); |
sol427 | 4:06a5a25319d5 | 102 | minuteP(); |
sol427 | 4:06a5a25319d5 | 103 | |
sol427 | 4:06a5a25319d5 | 104 | } |
sol427 | 4:06a5a25319d5 | 105 | // affiche l'heure sur les LEDs si elle a changée |
sol427 | 4:06a5a25319d5 | 106 | if (secondes != m_secondesPre) { |
sol427 | 4:06a5a25319d5 | 107 | vector<uint8_t> temps = get4Digits(); |
sol427 | 4:06a5a25319d5 | 108 | |
sol427 | 4:06a5a25319d5 | 109 | latchPin->write(1); |
sol427 | 4:06a5a25319d5 | 110 | if(point == true) { |
sol427 | 4:06a5a25319d5 | 111 | setRegistres(dataPin, clockPin, m_table[temps.at(0)]); |
sol427 | 4:06a5a25319d5 | 112 | setRegistres(dataPin, clockPin, m_table[temps.at(1)]+128); |
sol427 | 4:06a5a25319d5 | 113 | setRegistres(dataPin, clockPin, m_table3[temps.at(2)]+8); |
sol427 | 4:06a5a25319d5 | 114 | setRegistres(dataPin, clockPin, m_table[temps.at(3)]); |
sol427 | 4:06a5a25319d5 | 115 | } else { |
sol427 | 4:06a5a25319d5 | 116 | setRegistres(dataPin, clockPin, m_table[temps.at(0)]); |
sol427 | 4:06a5a25319d5 | 117 | setRegistres(dataPin, clockPin, m_table[temps.at(1)]); |
sol427 | 4:06a5a25319d5 | 118 | setRegistres(dataPin, clockPin, m_table3[temps.at(2)]); |
sol427 | 4:06a5a25319d5 | 119 | setRegistres(dataPin, clockPin, m_table[temps.at(3)]); |
sol427 | 4:06a5a25319d5 | 120 | } |
sol427 | 4:06a5a25319d5 | 121 | latchPin->write(0); |
sol427 | 4:06a5a25319d5 | 122 | point = !point; |
sol427 | 4:06a5a25319d5 | 123 | } |
sol427 | 4:06a5a25319d5 | 124 | |
sol427 | 4:06a5a25319d5 | 125 | m_secondesPre = secondes; |
sol427 | 4:06a5a25319d5 | 126 | } |
sol427 | 4:06a5a25319d5 | 127 | |
sol427 | 4:06a5a25319d5 | 128 | void Horloge::sonner() { |
sol427 | 4:06a5a25319d5 | 129 | |
sol427 | 4:06a5a25319d5 | 130 | } |
sol427 | 4:06a5a25319d5 | 131 |