Hur skulle ni lösa denna nedräkning, i genrellt?

Hej

Jag sitter och labbar med ett ShiftRegister (74HC595). Jag har ett program som skall ta in värden ifrån Seriella monitorn och skriva dessa till shiftregistret. Jag anger byte värde från 0 till 255.

Jag har satt att en LED med B4 skall lysa hela tiden och mina inmatade värden skall då tända och släcka beroende på värdet men också se till att b4 inte berörs om jag exempelvis skriver 255 för att tända alla och sedan skriver värdet 1 för att släcka alla utom just B4 och B1

Det går bra så länge jag skriver ett värde som är större än det föregående, det går bra att skriva ett mindre värde om det mindre värdet hela tiden är mindre än det föregående. Det är här som problemet mitt kommer in, Bilden nedan visar vad som händer när jag skriver in värdet 3 för att tända upp B1 och B2 plus den redan tända B4.

Jag ska sedan släcka B1 och B3, skriver då värde 1 och B1 släcks, men när jags skriver värde 2 så tror mitt program att jag faktiskt har skrivit in ett större tal än värde 1 (sant iofs) men i mitt fall så skall programmet förstå att den skall släcka B2.

DVS jag vill ha ett program som hela tiden håller koll på konstanten B4 och sedan släcker eller tänder beroende på vilket värde som matas in, i detta fall så berörs bara B1 och B2, i andra funktioner så skall andra Byte värden beröras men där också med olika konstanter...

Jag låter rörig, svårt att beskriva vad jag menar känner jag :frowning:

Det skulle vara enklare att hjälpa dig om du kan posta din kod, men generellt tror jag att du behöver använda något som kallas för en bitmask.

Värdet 8 kommer ju tända b4. Så om b4 alltid ska vara tänd och användarens inmatade siffra lagras i x så gör du så här:

byte bitmask = 8; // Always keep b4 on
shiftOut(dataPin, clockPin, MSBFIRST, x || bitmask);