Zo moeilijk is een shuifregister niet:
code:
void ShiftByte(char Segments)
{ for(int i = 0; i < 8; i++)
{ digitalWrite(LED_DATA, (Segments & 0x01) ? HIGH : LOW);
digitalWrite(LED_CLOCK, HIGH);
Segments >>= 1;
digitalWrite(LED_CLOCK, LOW);
}
}
Een complete funktie om het display aan te sturen kan er dan zo uitzien:
code:
// Map arduino pin numbers to 74HC595 shift register.
#define LED_DATA 1 // Serial data input for shift register
#define LED_CLOCK 2 // Idle low
// High puls shifts data in shift register
#define LED_LATCH 3 // Idle Low
// High pulse writes data from shift register to outputs.
void ShiftByte(char Segments)
{ for(int i = 0; i < 8; i++)
{ digitalWrite(LED_DATA, (Segments & 0x01) ? HIGH : LOW);
digitalWrite(LED_CLOCK, HIGH);
Segments >>= 1;
digitalWrite(LED_CLOCK, LOW);
}
}
struct SegmentTableEntry
{ char Ascii;
char Segments;
};
SegmentTableEntry SegmentTable[] =
{ { '0', 0b11111100 },
{ '1', 0b01100000 },
{ '2', 0b11011010 },
{ '3', 0b11110010 },
{ '4', 0b01100100 },
{ '5', 0b10110110 },
{ '6', 0b10111110 },
{ '7', 0b11100000 },
{ '8', 0b11111110 },
{ '9', 0b11110110 },
{ ' ', 0b00000000 },
{ '-', 0b00000010 },
};
#define NR_ENTRIES(a) (sizeof(a)/sizeof(a[0]))
// Convert Ascii code to segments through table
char GetSegments(char c)
{ for(int i = 0; i < NR_ENTRIES(SegmentTable); i++)
{ if(SegmentTable[i].Ascii == c)
{ return SegmentTable[i].Segments;
}
}
// Special code for characters that are not in the SegmentTable.
return 0b10010010;
}
void UpdateDisplay(char *pBuffer, int NrDigits)
{ pinMode(LED_DATA, OUTPUT);
pinMode(LED_CLOCK, OUTPUT);
pinMode(LED_LATCH, OUTPUT);
digitalWrite(LED_LATCH, LOW);
digitalWrite(LED_CLOCK, LOW);
// Send all data to the shift registers
for(int i = 0; i < NrDigits; i++)
{ char Segments = GetSegments(pBuffer[i]);
ShiftByte(Segments);
}
// Move data from shift register to output drivers
digitalWrite(LED_LATCH, HIGH);
digitalWrite(LED_LATCH, LOW);
}