Snabb digitalRead(), digitalWrite() för Arduino (3 / 5 steg)
Steg 3: Switch och LED och använder pin bank D.
Banken D styr stift 0 - 7, men stift 0 och 1 som används för seriell kommunikation. De flesta Arduino entusiaster försök inte att använda dessa pins för något annat. Saker kan få konstiga om du bråka med dessa stift. Så för säkerheten är det bäst att bevara värdena 0 och 1 i DDRD och PORTD register-bitar. Detta kräver användning av logiskt och och eller kommandon.
Varje register är 8 bitar numrerade 0 till 7 från höger till vänster. Bit 0 är 2 ^ 0, bit 1 är 2 ^ 1, etc.
Ett logiskt eller jämför två byte bit för bit och resultatet är 1 om endera eller byte är 1, om inte resultatet är 0.
Den vertikala linjen (|) är symbolen för ett logiskt eller.
Här är en sanning bordlägger för ett logiskt eller:
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
Så om vi eller 11001100
Mot 00111100
Resultatet blir 11111100
.
Ett logiskt och jämför två byte bit för bit och resultatet är 1 endast om båda bitar är 1.
Et-tecknet (&) är symbolen för ett logiskt och.
Här är en sanning bordlägger för ett logiskt och:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
Så om vi och 11001100
Mot 00111100
Resultatet blir 00001100
För att bevara lite du kan OR det mot 0 eller och det mot 1.
Följ med i dokumentationen i programmet för att se hur detta fungerar.
Bygga den krets som visas i diagrammet, behöver du:
- Arduinoen
- Skärbräda
- LED
- Motstånd, 330-560 Ohm
- Hoppare ledningar
Kopiera detta program till Arduino IDE och ladda upp den till din Arduino:
/*********************************************************
* Demonstration med bank D stift 0 - 7 och bevara den
* värden för stift 0 och 1 i register som DDRD och PORTD.
*
* Anoden av en LED är ansluten till stift 7 med
* ett motstånd i serie ansluten till marken.
*
* En tryckknapp switch är ansluten till stift 2 och marken
* och använder den interna pull-up resistorn.
*
* LED lamporna när knappen är nedtryckt.
*
*********************************************************/
/**********************************************
* setup() funktion
**********************************************/
void setup()
{
Ställa in stift 2 till ingång och stift 7 till utgång
samtidigt tillstånd av stift 0 och 1.
Vi bryr oss inte vad som händer med 3-6.
DDRD = DDRD | B10000000;
Den "|" innebär ett logiskt eller.
Nu vet vi det lite 7 är hög.
Och vi vet bits 0 och 1 är bevarade.
Men vi är fortfarande inte säker på bit två.
DDRD = DDRD & B10000011;
Vi gör en logisk och nu vi vet status för alla bitar.
Ett logiskt eller mot noll eller en logisk och mot en
ändras inte status för lite.
Denna bevarade status för bits 7, 1 och 0.
Sedan bit 2 var ANDed mot 0 vet vi att det är nu klart.
DDRD registret är nu dit vi vill.
Nu måste vi få ange PORTD registret det sätt vi vill.
PORTD = PORTD & B00000011;
BITS 0 och 1 är bevarade, alla andra är avstängda.
PORTD = PORTD | B00000100;
BITS 7 är avstängd, starttillståndet för LED.
Bit 2 beror på, stift 2 är indata vrida den är lite
på i PORTD vänder på den interna pull-up resistorn.
}
/**********************************************
* loop() funktion
**********************************************/
void loop()
{
Läs PIND registret.
int knappen = PIND;
du har nu värdena för alla åtta stift i PIND register
som ingår i en variabel. Den enda stift vi bryr oss om är stift 2.
Så vi gör en logisk och på knappen variabeln att isolera de
lite som vi vill.
knappen = knappen & B00000100;
På grund av den interna pull-up resistorn kommer att PIN-koden vara hög
Om knappen inte är intryckt och lågt om det är.
Så knappen återgår antingen 2 ^ 2 (4) eller noll om den trycks.
PORTD = PORTD & B00000111;
Inaktivera LED, och bevara bitar 0 - 2.
IF(Button == 0)
{
PORTD = PORTD | B10000000;
Aktivera LED och bevara bitar 0 - 2.
}
}
Kommandot digitalWrite() kommer att bromsa ett program mycket i en slinga, men kommandot pinMode() är normalt används endast i setup() funktion och köra en gång. programmet ovan kommer att köras lika bra om du använder en mer standardiserade setup() funktion, så här:
Setup()
{
pinMode (7, OUTPUT);
pinMode (2, INPUT_PULLUP;
}
Med hjälp av DDRD registret är inte nödvändigt är det skönt att förstå hur den och de logiska operationerna fungerar.