Hur man skapar en öl flaska LED VU-Meter (11 / 17 steg)
Steg 11: Läsa den LM3915 utgångar
Utgångar: ingångar
LED1:RB7
LED2:RB6
LED3:RB5
LED4:RB4
LED5:RB3
LED6:RB2
LED7:RD7
LED8:RD6
LED9:RD5
LED10:RD4
Återigen, om du undrar varför ingångarna är typ av bakåt förtjänar att routning av PCB. Nu när vi har anslutningarna, ska jag visa dig hur vi lagrar indata.
Det första vi gör är att deklarera en variabel som 16-bitars. Vi kommer endast att använda de lägre 10 bitarna eftersom vi bara har 10 olika ljudnivåer.
UInt16 nivå. Vi deklarerar en 16-bitars heltal utan tecken som kommer att lagra ljudnivån från LED1 - LED10
Ser som vi inte använder en full PORT (RB0 - RB7 eller RD0 - RD7) för över uppgifterna i, vi kommer att ha att maskera av de oönskade bitarna. De bitar som vi inte behöver är RB0, RB1, RD0, RD1, RD2 och RD3. De första 4 bitarna som vi kommer att få i är RD4 - RD7, så vi ska maskera bort de nedersta bitarna (RD0 - RD3) och ange den variabel "nivån" till att övre nibble (RD4 - RD7).
Level = 0x00F0 & PORTD; Maskera bort de nedersta bitarna och göra "nivå" lika med den övre Mumsa av PORTD
Nu när vi har de värden som lagras på utgångar LED7 - LED10, måste vi få våra variabel "nivå" redo att kunna lagra de nästa 6 bitarna av data som finns på RB2 - RB7. För att göra plats för dessa nästa 6 bitar vi vänster bitars SKIFT "nivå" av 2. Så just nu "nivå" skulle se ut så här i binär form:
xxxx = RD4, RD5, RD6 RD7 respektive
Level = 00000000xxxx0000 < = finns bara plats för 4 bitar data på slutet. Vi måste passa 6 bitar data
Så för att lite SKIFT "nivå" två platser, satte vi detta som vår nästa kodrad:
level = nivå << 2. Lite SKIFT "nivå" två platser och redo att ta emot data från RB2 - RB7
Detta är nu hur "nivå" skulle titta efter att det har varit lite skiftade lämnade två ställen:
Level = 000000xxxx000000 < = nu har vi tillräckligt med utrymme för RB2 - RB7
Slutligen, vi kan nu hämta de sista 6 bitarna av data som är utdata från LED1 - LED6 och förvara den i "nivå". Här är nästa rad i koden för att göra det:
level = nivå | ((0xFC & PORTB) >> 2); Maskera bort bitarna RB0 och RB1, sedan bitars SKIFT RB2 - RB7 två platser till höger och lagra den i botten 6 bitar av "nivå"
Denna linje är lite mer kryptiskt, men det gör exakt samma sak som vi gjorde med PORTD förutom det skiftar data två platser till höger. På insidan parentes vi mask utanför RB0 och RB1 och sedan skifta resultatet just två. Nu när de data som vi vill ha är i de lägsta 6 bitarna, vi kommer eller det med "nivå" som kommer att helt enkelt placera RB2 - RB7 i de lägsta 6 bitarna av "nivå". Här är vad det kommer att sluta se ut som:
xxxx = RD4, RD5, RD6 RD7 respektive
Yyyyyy = RB2, RB3, RB4, RB5, RB6, RB7 respektive
Level = 000000xxxxyyyyyy
Nästa kommer att vi matcha värdena för "nivå" med den motsvarande ljudnivån.