Created
February 23, 2024 07:55
-
-
Save schreibfaul1/f21554eea9900ee7d5683263ba3a7ce2 to your computer and use it in GitHub Desktop.
LED 7 segment dusplay with 74HC595 and 8 digits
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "Arduino.h" | |
void display_start(); | |
void display_value(const char* value); | |
int indexOf (const char* base, char ch, int startIndex); | |
void setup(){ | |
display_start(); | |
} | |
void loop() { | |
display_value("12345678"); | |
} | |
//**************************************************************************************************************************************************** | |
// 7 S E G M E N T 8 D I G I T S 74HC595 D I S P L A Y * | |
//**************************************************************************************************************************************************** | |
#define latchPin 22 | |
#define dataPin 21 | |
#define clockPin 17 | |
const byte ARRAY_SIZE = 27; | |
byte segment_codes[ARRAY_SIZE]; | |
String available_chars[ARRAY_SIZE]; | |
void display_start() { | |
segment_codes[ 0]=0b11000000; // 0 | |
segment_codes[ 1]=0b11111001; // 1 | |
segment_codes[ 2]=0b10100100; // 2 | |
segment_codes[ 3]=0b10110000; // 3 | |
segment_codes[ 4]=0b10011001; // 4 | |
segment_codes[ 5]=0b10010010; // 5 | |
segment_codes[ 6]=0b10000010; // 6 | |
segment_codes[ 7]=0b11111000; // 7 | |
segment_codes[ 8]=0b10000000; // 8 | |
segment_codes[ 9]=0b10010000; // 9 | |
segment_codes[10]=0b10001000; // a | |
segment_codes[11]=0b10000011; // b | |
segment_codes[12]=0b10100111; // c | |
segment_codes[13]=0b10100001; // d | |
segment_codes[14]=0b10000110; // e | |
segment_codes[15]=0b10001110; // f | |
segment_codes[16]=0b10001001; // H | |
segment_codes[17]=0b11000111; // L | |
segment_codes[18]=0b10001100; // P | |
segment_codes[19]=0b10111111; // - | |
segment_codes[20]=0b11110111; // _ | |
segment_codes[21]=0b11111111; // space | |
segment_codes[22]=0b10110110; // unknown | |
pinMode(latchPin, OUTPUT); | |
pinMode(clockPin, OUTPUT); | |
pinMode(dataPin, OUTPUT); | |
} | |
int findIndexOfChar(char character){ | |
char s[24] = {"0123456789abcdefHLPS-_ "}; | |
int p = indexOf(s, character, 0); | |
if(p == -1) p = 22; | |
return p; | |
} | |
void display_value(const char* value) { | |
uint8_t j[8] = {3, 2, 1, 0, 7, 6, 5, 4}; | |
int skip = 0; | |
for(int i = 0; i < strlen(value); i++) { | |
if(!((String)value[i]).equals(".")) { | |
int indexOfCharToWrite = findIndexOfChar(value[j[i]]); | |
if(indexOfCharToWrite > -1) { | |
byte bitToWrite = 0; | |
digitalWrite(latchPin, LOW); | |
byte code = segment_codes[indexOfCharToWrite]; | |
boolean skipNext = false; | |
if(((String)value[i + 1]).equals(".")) { | |
bitWrite(code, 7, 0); | |
skipNext = true; | |
} | |
shiftOut(dataPin, clockPin, MSBFIRST, code); | |
bitWrite(bitToWrite, i - skip, 1); | |
shiftOut(dataPin, clockPin, LSBFIRST, bitToWrite); | |
digitalWrite(latchPin, HIGH); | |
if(skipNext) { skip++; } | |
} | |
} | |
} | |
} | |
int indexOf (const char* base, char ch, int startIndex = 0) { | |
const char *p = base; | |
for (; startIndex > 0; startIndex--) | |
if (*p++ == '\0') return -1; | |
char *pos = strchr(p, ch); | |
if (pos == nullptr) return -1; | |
return pos - base; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment