Stap 11: Het lezen van de LM3915-uitgangen
Uitgangen: ingangen
LED1:RB7
LED2:RB6
LED3:RB5
LED4:RB4
LED5:RB3
LED6:RB2
LED7:RD7
LED8:RD6
LED9:RD5
LED10:RD4
Nogmaals, als u zich afvraagt waarom de ingangen zijn soort achteruit haar te wijten aan het bewerkingsplan van de PCB. Nu dat we de connecties hebben, zal ik u tonen hoe wij de invoergegevens opslaan.
Het eerste ding dat wij doen is een 16-bits declareren. We zullen alleen gebruiken de onderste 10 bits omdat we alleen 10 verschillende geluidsniveaus hebben.
uint16 niveau; Wij zijn het verklaren van een 16-bits geheel getal zonder voorteken die het geluidsniveau van LED1 - LED10 slaat
Aangezien we niet een volledige PORT (RB0 - RB7 of RD0 - Td7) gebruiken om de gegevens in, we gonna hebben aan masker uit de ongewenste beetjes. De stukjes die we niet nodig hebben zijn RB0, RB1, RD0, RD1, RD2 en Td3. De eerste 4 bits van gegevens die wij zal brengen in is RD4 - Td7, dus we masker uit de bodem bits (RD0 - Td3) en stelt u de variabele 'niveau' gelijk aan bovenste nibble (RD4 - Td7).
niveau = 0x00F0 & PORTD; Uit de bodem bits maskeren en 'niveau' gelijk is aan de bovenste knabbelen van PORTD maken
Nu dat we de waarden opgeslagen die op de uitgangen LED7 - LED10, hebben we het om onze variabele 'niveau' klaar te kunnen zijn voor het opslaan van de volgende 6 stukjes van de gegevens die op RB2 - RB7. Om plaats voor deze volgende 6 bits te maken moeten we links bits shift 'niveau' door 2. Zo juist nu 'niveau' zou als volgt uitzien in binaire vorm:
xxxx = RD4 Td5, Td6, Td7 respectievelijk
niveau = 00000000xxxx0000 < = er is slechts genoeg plaats voor 4 bits van gegevens over het einde. We moeten passen 6 stukjes van de gegevens
Dus om het bit shift 'niveau' twee plaatsen, zetten we dit als onze volgende lijn van code:
niveau = level << 2; Beetje shift 'niveau' twee plaatsen en klaar om de gegevens accepteren van RB2 - RB7
Dit is nu hoe 'niveau' zou kijken nadat het heeft zijn beetje verschoven liet twee plaatsen:
niveau = 000000xxxx000000 < = nu we genoeg ruimte voor RB2 - RB7 hebben
Tot slot kunnen we nu ophalen van de laatste 6 bits van gegevens die worden uitgevoerd uit LED1 - LED6 en sla het in 'niveau'. Hier is de volgende coderegel om dat te doen:
niveau = level | ((0xFC & PORTB) >> 2); Maskeren van bits RB0 en RB1, vervolgens bits shift RB2 - RB7 twee plaatsen naar rechts en op te slaan in de bodem 6 beetjes van 'niveau'
Deze lijn is een beetje meer cryptisch, maar het doet precies hetzelfde, zoals we hebben gedaan met het PORTD behalve de gegevens twee plaatsen naar rechts verschuift. In de binnenkant haken we masker uit RB0 en RB1 en vervolgens het resultaat te verschuiven naar de juiste twee plaatsen. Nu dat de gegevens die wij willen zich in de laagste 6 bits, of het met 'niveau' die gewoon RB2 - RB7 in de laagste 6 bits van 'niveau'. Hier is wat het zal eindigen uitzien als:
xxxx = RD4 Td5, Td6, Td7 respectievelijk
yyyyyy = respectievelijk RB2, RB3, RB4, RB5, RB6, RB7
niveau = 000000xxxxyyyyyy
Vervolgens zullen we overeenkomen met de waarden van 'niveau' met het bijbehorende geluidsniveau.