Я надеюсь, что кто-то может помочь мне в этом, я в полной растерянности и не знаю, что мне нужно изменить.Я собрал этот код по частям из других примеров, которые я видел.Я пытаюсь заставить дисплей отображать слово «Конец», как только время обратного отсчета завершит свой цикл, я просто не понимаю код для внесения каких-либо дальнейших изменений в часть дисплея.
Это в основном то, чтокод делает.Я использую поворотный регулятор и вставляю время, нажимаю поворотный переключатель, и таймер начинает обратный отсчет во время отображения значения на 4-значном 7-сегментном дисплее трубки.В конце обратного отсчета пробирка становится пустой, вместо пустого я хочу отобразить слово «Конец», как я могу сделать это возможным?
Я знаю, что подвох находится в функции setDigit (), но яЯ ничего не знаю о работе с 7-сегментным дисплеем, это мой первый раз.
const int PinCLK = 3; // Rotary CLK signal
const int PinDT = 2; // Rotary DT signal
const int PinSW = 0; // Rotary switch
int lastCount = 0;
volatile int virtualPosition = 0;
int timeCount = 0; // count in tenths of seconds
int sequence_Num = 0;
char disp[4];
const int PinSCLK = 10;
const int PinRCLK = 11;
const int PinDIO = 12;
int Display[4];
unsigned long prev = 0;
unsigned long waitMS = 0;
void isr()
{
static unsigned long lastInterruptTime = 0;
unsigned long interruptTime = millis();
// If interrupts come faster than 5
if(interruptTime - lastInterruptTime > 5)
{
if(digitalRead(PinDT) == LOW)
{
virtualPosition = virtualPosition+10;
}
else
{
virtualPosition = virtualPosition-10;
}
virtualPosition = min(1000, max(0, virtualPosition));
}
lastInterruptTime = interruptTime; // Keep track of when we were here last (no more than every 5ms)
}
void displayCount()
{
showDisplay();
for(int i = 0; i < 4; i++)
{
setDigit(i, Display[i]);
}
}
void setDigit(int dig, int character)
{
// 0 1 2 3 4 5 6 7 for 8 digit array
int digits[] = {128, 64, 32, 16, 8, 4, 2, 1};
// 21 items character set (0-9)0-9, (10-19)0.-9., (72)- (73) space
int characters[] = {3, 159, 37, 13, 153, 73, 65, 31, 1, 9, 2, 158, 36, 12, 152, 72, 64, 30, 0, 8, 255};
digitalWrite(PinRCLK, LOW);
shiftOut(PinDIO, PinSCLK, LSBFIRST, characters[character]);
shiftOut(PinDIO, PinSCLK, LSBFIRST, digits[dig]);
digitalWrite(PinRCLK, HIGH);
}
void showDisplay()
{
for(int i = 0; i < 4; i++)
{
int val = disp[i];
if ((val >= 32) && (val <= 47))
{
switch(val)
{
case 45 : val = 20;
break;
default : val = 20;
break;
}
}
else if ((val >= 48) && (val <= 57))
{
val -= 48;
}
Display[i] = val;
}
}
void wait(unsigned long milsec)
{
prev = millis();
waitMS = milsec;
}
void showText(char a, char b , char c, char d)
{
disp[0] = d;
disp[1] = c;
disp[2] = b;
disp[3] = a;
}
void setTimer(bool inc)
{
displayCount();
if(millis() > (prev + waitMS))
{
if(inc)
{
if(timeCount = virtualPosition)
{ // NOTE: This incrementer continues to count although the display 'int period' has occured
showText(' ', virtualPosition / 1000 % 10, virtualPosition / 100 % 10 + 10, virtualPosition / 10 % 10);
if(timeCount < virtualPosition)
{
timeCount++;
}
wait(9); // Delay to compensates for lag to count in increments of 9 milliseconds
}
}
else
{
if(timeCount <= virtualPosition)
{
showText(' ', (timeCount / 1000) % 10, (timeCount / 100) % 10 + 10, (timeCount / 10) % 10);
timeCount--;
}
wait(9);
if(timeCount == 0)
{
timeCount = virtualPosition;
sequence_Num = 1;
delay(2000);
}
}
}
}
void setup()
{
Serial.begin(9600); // Just whilst we debug, view output on serial monitor
pinMode(PinCLK, INPUT); // Rotary pulses are INPUTs
pinMode(PinDT, INPUT); // Rotary pulses are INPUTs
pinMode(PinSW, INPUT_PULLUP); // use the in-built PULLUP so we don't need a resistor
attachInterrupt(digitalPinToInterrupt(PinCLK), isr, LOW); // Attach the routine to service the interrupts
pinMode(PinRCLK, OUTPUT); // latch
pinMode(PinDIO, OUTPUT);
pinMode(PinSCLK, OUTPUT);
lastCount = virtualPosition;
sequence_Num = 1;
}
void loop()
{
// Is someone pressing the rotary switch?
if((!digitalRead(PinSW)))
{
while(!digitalRead(PinSW))
delay(9);
sequence_Num = 2;
}
switch(sequence_Num)
{
case 1:
setTimer(true);
break;
case 2:
setTimer(false);
break;
}
}
Спасибо за любую помощь и объяснения, чтобы я мог понять для дальнейшего использования.
Спасибо