En LED Tärning med en PIC 16F84 (eller 16F88) (5 / 12 steg)
Steg 5: Software design
Det är det för hårdvarudesign, nu måste vi utforma den programvara som gör att vår hårdvara blir en tärning.
En sak som du säkert märkt var att hårdvara genomförandet gjordes på ett strukturerat, byggsten sätt. Vi måste närma vår programvarudesign på samma sätt.
Vid utformningen av vår programvara, kan börja med att dela upp systemet i funktionella block. En lätt uppdelning är att dela upp problemet i indata (knappen), viss bearbetning (faktiskt rulla tärningarna) och produktion (The LED).
Kan börja med att bygga det utgång med vår kod först. Det är den mest visuella komponenten, och låter oss 'put några körs på bordet' tidigt. Innan vi börjar dock kan prata lite om mikroprocessor instruktionsuppsättning och arkitekturen.
PIC spänna av mikroprocessorer genomföra en minskad anvisning ställa datorn (RISC). Att ha en RISC kärna är en faktor som gör dessa processorer så snabbt. En nackdel med att ha en RISC kärna är att PIC spänna av mikroprocessorer bara genomföra ungefärligt 37 instruktioner, så det tar ibland fler instruktioner att göra saker, och ofta lösningar inte alltid verkar vara så intuitiv som de är på, till exempel en Z80 eller 6502.
I PIC är primära arbetar registret "W" registret. De flesta i vår verksamhet använder registret "W" på något sätt. Ta till exempel en uppsättning kommandon som kommer ut en binära mönster "10101010" till Port B.
MOVLW B "10101010"
MOVWF PortB
Först, det ord som vi vill skriva är laddad i 'W' registret, sedan 'W' register skrivs till Port B.
Vi kan använda denna sekvens av operationer för att mata lite mönster du visar ett tärningskast 6. Principskiss, kan vi se att första tärningen är ansluten till Port A, bits 0 – 3 på följande sätt.
Port A(0) - centrum LED
Port a.1 - lysdioder (1) och (3).
Port A(2) - lysdioder (2) och (4).
Port a.3 - mellersta lysdioder (5) och (6).
Om du vill visa mönstret för en 6, alla hörn lysdioder och alla mellersta lysdioder är på, men centrum-lampan inte lyser. Det motsvarar lite mönster av b '00001110'. Så, om du vill visa en 6, vi enkelt utföra instruktionerna;
MOVLW B '00001110'
MOVWF PortA
På samma sätt om du vill visa en 1 (centrum LED), skulle vi använda;
MOVLW B "00000001"
MOVWF PortA
Vi har hänvisat till 6 00001110, och 1 som 00000001. Kan det vara förvirrande att använda tal som denna, särskilt när de inte är verkligen siffror, de är helt enkelt lite mönster. För att underlätta förvirringen, tillåta de flesta montörer användning av "Konstanter" att ge en mappning mellan en textnamn och ett nummer. När det gäller våra dice display, kan vi använda ordet Die6 i stället för 00001110 eller Die1 i stället för 00000001.
En lista med konstanter som vi skulle kunna använda i vår uppvisning skulle vara;
Die1 B "00000001"
Die2 B "00000100"
Die3 B '00000101'
Die4 B '00000110'
Die5 B '00000111'
Die6 B '00001110'
DieOff B '00000000'
DieTest B "00001111"
De sista 2 posterna (DieOff och DieTest) är användbara för stänga av displayen, eller kontrollera att alla lysdioder är operativa vid uppstart genom att aktivera alla lysdioder.
Nu när vi vet hur du vill visa ett tal, vi borde producera byggblocket som tillåter oss att leverera ett urval, och lämplig bit mönstret läses in i displayen.
Innan vi diskuterar detta displayen rutin, bör det nämnas att mjukvaran bäst skrivs modulärt, en rutin i taget. Detta gör att funktioner läggas komponent av komponent. Vi kan sedan koncentrera sig på att skriva varje komponent var för sig, så att komplexa programvara byggas lager av lager.
Tillbaka till våra byggstenar för visar ett tärningskast. En rutin för att implementera funktionen display kan se ut så här;
; Först definiera krävs konstanterna... Die1 EQU B '00000001'; vissa konstanter definieras Die2 EQU B '00000100'; för de olika LED Tärning Die3 EQU B '00000101'; bitars mönster Die4 EQU B "00000110" Die5 EQU B "00000111" Die6 EQU B "00001110" DieOff EQU B '00000000'; ALLA lysdioder av DieTest EQU B '00001111'; ALLA lysdioder på ; Disp_Dice1 - orsakar ett visst nummer ska visas på en tärning ansikte ; Ingång: Registret W ; Produktion: En LED mönster på tärningen. ; Kommentarer: för värdena i registret "W"; 0 = alla lysdioder av ; 1-6 = Visa mönstret för 1 – 6 ; 7 = alla lysdioder ON (testläge) ; DISP_DICEA CALL DIE_LOOKUP MOVWF PortA RETURNERA ; Detta är en förgrening uppslagstabell. I princip, oavsett värde skickas via W registret är ; lägga till programräknaren (PCL). Detta sedan leder till lämpligt värde för den ; lookup resultat som laddas in i W register, och kontroll som återsänds till uppringande ; sub rutin. ; dvs, om en 2 skickas via W registret, ADDWF PCL, orsakar f operation 2 ska vara ; läggas till den aktuella instruktionsräknaren orsakar RETLW Die2 instruktion som ska utföras. ; Detta resulterar i konstant Die2 (B "00000100") laddas in W registret, och ; kontroll som returneras till det anropande programmet. DIE_LOOKUP ADDWF PCL, f RETLW DieOff RETLW Die1 RETLW Die2 RETLW Die3 RETLW Die4 RETLW Die5 RETLW Die6 RETLW DieTest |
De flesta av ovanstående notering är kommentarer (linjerna föregås av tecknet ';'), så det bör kunna följas.
Rutinen display kan användas genom att köra följande kod;
MOVLW 4
KALLA DISP_DICEA