Innehållsförteckning:

AVR Assembler Tutorial 9: 7 Steg
AVR Assembler Tutorial 9: 7 Steg

Video: AVR Assembler Tutorial 9: 7 Steg

Video: AVR Assembler Tutorial 9: 7 Steg
Video: CodevisionAVR - кнопки и eeprom (урок 9) 2024, Juli
Anonim
AVR -monteringshandledning 9
AVR -monteringshandledning 9

Välkommen till självstudie 9.

Idag kommer vi att visa hur man styr både en 7-segmentskärm och en fyrsiffrig display med hjälp av vår ATmega328P- och AVR-monteringsspråkskod. Under tiden vi gör detta måste vi ta reda på hur vi använder stapeln för att minska antalet register som vi behöver binda. Vi kommer att lägga till ett par kondensatorer (lågpassfilter) för att försöka minska bullret på vår knappsats. Vi kommer att skapa en spänningsförstärkare av ett par transistorer så att vår INT0 -avbrytare fungerar bättre för knapparna med lägre spänning på knappsatsens nedre rad. Och vi kommer att slå huvudet lite mot väggen för att försöka få rätt motstånd så att saken fungerar som den ska.

Vi kommer att använda vår knappsats från självstudie 7

För att göra denna handledning behöver du, förutom de vanliga sakerna:

  1. En 7-segmentskärm

    www.sparkfun.com/products/8546

  2. En fyrsiffrig display

    www.sparkfun.com/products/11407

  3. En tryckknapp

    www.sparkfun.com/products/97

  4. Datablad för displayen som kan laddas ner från deras respektive sidor länkade till ovan.
  5. En 68 pf keramisk kondensator, ett par 104 kondensatorer, ett gäng motstånd, två 2N3904 NPN -transistorer.

Här är en länk till den kompletta samlingen av mina AVR-monteringsstudier:

Steg 1: Anslutning av 7-seg skärmen

Anslutning av 7-seg skärmen
Anslutning av 7-seg skärmen
Anslutning av 7-seg skärmen
Anslutning av 7-seg skärmen
Anslutning av 7-seg skärmen
Anslutning av 7-seg skärmen

Vi kommer att använda samma kod som vi använde i självstudie 7 för knappsatsen för att styra 7-segmentets display. Så du måste göra en kopia av det och vi kommer att ändra det.

Vi kommer att kartlägga segmenten till stiften på vår mikrokontroller enligt följande:

(dp, g, f, e, d, c, b, a) = (PD7, PD6, PB5, PB4, PB3, PB2, PB1, PB0)

där bokstäverna i segmenten visas på bilden tillsammans med pinout som motsvarar vanliga 5V och var och en av LED -segmenten inklusive decimalpunkten (dp) längst ned till höger på displayen. Anledningen till detta är så att vi kan mata in hela numret i ett enda register och mata ut det som registreras till port B och D för att lysa upp segmenten. Som du kan se bitarna numreras sekventiellt från 0 till 7 och så kommer de att kartläggas till rätt stift utan att behöva ställa in och rensa enskilda bitar.

Som du kan se av koden som vi har bifogat i nästa steg, har vi flyttat vår visningsrutin till ett makro och vi har frigjort SDA- och SCL -stiften för framtida användning i nästa handledning.

Jag bör tillägga att du måste sätta ett motstånd mellan den gemensamma anoden på displayen och 5V -skenan. Jag valde ett 330 ohm motstånd som vanligt, men om du vill kan du beräkna det minsta motståndet som behövs för att få ut maximal ljusstyrka från displayen utan att steka den. Så här gör du:

Titta först på databladet och märk att det på den första sidan ger olika egenskaper för displayen. De viktiga mängderna är "Forward Current" (I_f = 20mA) och "Forward Voltage" (V_f = 2.2V). Dessa säger att du vill att spänningsfallet över skärmen kommer att vara om strömmen är lika med framströmmen. Detta är den maximala strömmen som displayen tar utan att steka. Det är följaktligen också den maximala ljusstyrkan du kan få ur segmenten.

Så låt oss använda Ohms lag och Kirchoffs loopregel för att ta reda på vilket minimimotstånd vi skulle behöva sätta i serie med displayen för att få maximal ljusstyrka. Kirchoffs regel säger att summan av spänningen förändras runt en sluten slinga i en krets är lika med noll och Ohms lag säger att spänningsfallet över ett motstånd motstånd R är: V = I R där I är strömmen som flyter genom motståndet.

Så med tanke på en källspänning på V och går runt i vår krets har vi:

V - V_f - I R = 0

vilket betyder (V - V_f)/I = R. Så motståndet som behövs för att få maximal ljusstyrka (och förmodligen stekning av segmenten) skulle vara:

R = (V - V_f)/I_f = (5.0V - 2.2V) /0.02A = 140 ohm

Så om du ville kan du gärna använda 150 ohm utan bekymmer. Jag tror dock att 140 ohm gör det för ljust för min smak och därför använder jag 330 ohm (vilket är mitt personliga Goldilocks -motstånd för lysdioder)

Steg 2: Monteringskod och video

Jag har bifogat monteringskoden och en video som visar hur knappsatsen fungerar med displayen. Som du kan se har vi helt enkelt kartlagt återuppringningsknappen till "r", blixtknappen till "F", asterisken till "A" och hashtecknet till "H". Dessa kan mappas till olika operationer som backspace, enter, och vad inte om du vill fortsätta använda knappsatsen för att skriva siffror på LCD-skärmar eller fyrsiffriga displayer. Jag kommer inte att gå igenom koden rad för rad den här gången eftersom den är väldigt lik den vi redan har gjort i tidigare självstudier. Skillnaderna är främst bara mer av samma saker som vi redan vet hur man gör som avbrott och uppslagstabeller. Du bör bara gå igenom koden och titta på de nya sakerna vi har lagt till och de saker vi har ändrat och räkna ut det därifrån. Vi kommer att gå tillbaka till rad-för-rad-analys i nästa handledning när vi introducerar nya aspekter av montering av språkkodning på AVR-mikrokontroller.

Låt oss nu titta på en fyrsiffrig display.

Steg 3: Anslut den fyrsiffriga displayen

Anslutning av den fyrsiffriga displayen
Anslutning av den fyrsiffriga displayen
Anslutning av den fyrsiffriga displayen
Anslutning av den fyrsiffriga displayen

Enligt databladet har den fyrsiffriga displayen en framåtström på 60 mA och en framspänning på 2,2 volt. Så med samma beräkning som tidigare kunde jag använda ett 47 ohm motstånd om jag ville. Istället ska jag använda en … hrm.. låt mig se … hur är det med 330 ohm.

Det sätt på vilket den fyrsiffriga displayen är ansluten är att det finns 4 anoder, en för var och en av siffrorna, och de andra stiften styr vilket segment som tänds i varje. Du kan visa 4 siffror samtidigt eftersom de är multiplexerade. Med andra ord, precis som vi gjorde för tärningsparet, cyklar vi helt enkelt kraften genom var och en av anoderna i tur och ordning och det kommer att blinka dem efter varandra. Det kommer att göra detta så snabbt att våra ögon inte kommer att blinka och det kommer att se ut som om alla fyra siffrorna är på. Men bara för att vara säker, så sättet vi kommer att koda det på är att ställa in alla fyra siffrorna, sedan cykla anoderna, snarare än att ställa in, flytta, ställa in, flytta etc. På så sätt kan vi få en exakt timing mellan att tända varje siffra.

För nu, låt oss testa att segmenten alla fungerar.

Placera ditt 330 ohm motstånd mellan den positiva skenan på din brödbräda och den första anoden på displayen. Databladet berättar att stiften är numrerade från 1 till 16 moturs med början längst ner till vänster (när du tittar normalt på displayen.. med decimalerna längs botten) och det står att anoderna är stiftnummer 6, 8, 9 och 12.

Så vi ansluter stift 6 till 5V och tar sedan en negativ ledning från din GND -skena och sticker in den i alla andra stift och ser att alla segment lyser på den siffra den motsvarar (vilket faktiskt är den andra siffran från den rätta). Se till att du får alla 7 segmenten och decimalpunkten att lysa upp.

Stick nu in din GND -tråd i en av stiften för att tända ett av segmenten och denna gång flytta motståndet till de andra 3 anoderna och se att samma segment tänds i var och en av de andra siffrorna.

Något ovanligt?

Det visar sig att pinout på databladet är fel. Detta beror på att det är databladet och pinout för en 12-polig, 4-siffrig display. D.v.s. en utan kolon eller övre decimalpunkt. Displayen som jag fick när jag beställde den är en 16-stifts, 4-siffrig display. Faktum är att på min är segmentanoderna vid stift 1, 2, 6 och 8. Kolonanoden är stift 4 (katodstift 12) och den övre dp -anoden är stift 10 (katod är stift 9)

Övning 1: Använd ditt motstånd och jordkabel för att kartlägga vilken stift som motsvarar vilket segment och decimalpunkt på displayen så att vi får rätt segment att lysa upp när vi kodar det.

Hur vi vill koda segmentkartan är exakt som vi gjorde med den enkelsiffriga 7-segmentskärmen ovan-vi behöver inte ändra något i koden, det enda vi ändrar är hur trådarna är anslutna på brädan. Anslut helt enkelt rätt portstift på mikrokontrollern till motsvarande stift på den fyrsiffriga displayen så att till exempel PB0 fortfarande går till stiftet som motsvarar segment a, PB1 går till segment B, etc.

Den enda skillnaden är att nu behöver vi 4 extra stift för anoderna eftersom vi inte kan gå till 5V -skenan längre. Vi behöver mikrokontrollern för att bestämma vilken siffra som får saften.

Så vi kommer att använda PC1, PC2, PC3 och PD4 för att styra anoderna för de fyra siffrorna.

Du kan lika gärna gå vidare och ansluta ledningarna. (glöm inte motstånden på 330 ohm på anodtrådarna!)

Steg 4: Kodning av den fyrsiffriga displayen

Kodning av den fyrsiffriga displayen
Kodning av den fyrsiffriga displayen

Låt oss tänka på hur vi vill koda den här skärmen.

Vi vill att användaren trycker på knapparna och låter siffrorna visas i följd på displayen när de trycker på varje knapp. Så om jag trycker på en 1 följt av en 2 kommer den att visas på displayen som 12. Jag skulle också vilja lagra det värdet, 12, för internt bruk men vi kommer till det lite senare. För tillfället vill jag bara skriva ett nytt makro som tar dina knapptryckningar och visar dem. Men eftersom vi bara har fyra siffror vill jag se till att du bara kan skriva fyra siffror.

En annan fråga är att det sätt på vilket den multiplexade fyrsiffriga displayen fungerar är genom att cykla anoderna så att varje siffra bara är på under en delad sekund innan den visar nästa och sedan nästa och slutligen tillbaka till den första igen, etc. Så vi behöver ett sätt att koda detta.

Vi vill också att den flyttar "markören" till höger ett mellanslag när vi skriver nästa siffra. Så att om jag vill skriva 1234, till exempel, efter att jag har skrivit 1, kommer markören att flytta över så att nästa siffra jag skriver kommer att visas på nästa 7-segment display och så vidare. Allt medan detta händer vill jag fortfarande kunna se vad jag har skrivit så det måste fortfarande cykla genom siffrorna och visa dem.

Låter det som en hög order?

Saker är faktiskt ännu värre. Vi behöver ytterligare 4 generella register som vi kan använda för att lagra de aktuella värdena för de 4 siffror vi vill visa (om vi ska bläddra igenom dem måste vi hålla dem lagrade någonstans) och problemet med detta är att vi har har använt allmänna register som galna och om vi inte ser upp kommer vi inte ha några kvar. Så det är förmodligen en bra idé att ta itu med det problemet snarare än senare och visa dig hur du frigör register genom att använda stacken.

Så låt oss börja med att förenkla saker lite, använd stacken och frigör några register och sedan försöker vi utföra uppgiften att läsa och visa våra siffror på den fyrsiffriga displayen.

Steg 5: Push 'n Pop

Push 'n Pop
Push 'n Pop

Det finns bara några "allmänna ändamålsregister" som vi har till vårt förfogande och när de väl används finns det inga fler. Så det är bra programmeringspraxis att bara använda dem för ett par variabler som används som tillfällig lagring som du behöver för att läsa från och skriva till portar och SRAM med, eller andra som du kommer att behöva i underprogram överallt och så du namnge dem. Så vad jag har gjort, nu när vi har initierat och lär oss använda stapeln, är att gå igenom koden och hitta de namngivna allmänna ändamålsregistren som endast används inuti en enda underprogram eller avbrott och ingen annanstans i koden och ersätta dem med ett av våra tempregister och en push och pop till stacken. Faktum är att om du tittar på kod skriven för mindre mikrokontroller, eller om du går tillbaka i tiden när alla marker var mindre, ser du bara ett par allmänna register som måste användas för allt, så du kunde inte bara lagra ett värde där och lämna det ifred eftersom du säkert skulle behöva det registret för andra saker. Så du kommer att se pushin 'och en poppin' överallt i koden. Kanske borde jag ha döpt våra temp -register för allmänna ändamål AX och BX som en respektfull kudos till de svunna dagarna.

Ett exempel hjälper till att göra detta tydligare.

Lägg märke till att i vår Analog till Digital konvertering komplett avbrott ADC_int använder vi ett generellt register som vi har namngett buttonH som vi använde för att ladda värdet på ADCH och jämföra det med vår uppslagstabell för analog till knapptryckningskonvertering. Vi använder bara denna knapp H -register i ADC_int -underrutinen och ingen annanstans. Så istället kommer vi att använda vår variabel temp2 som vi använder som en tillfällig variabel som vi kan använda inom en viss underrutin och dess värde påverkar ingenting utanför den subrutinen (dvs. värdet vi ger det i ADC_int kommer inte att användas någonstans annan).

Ett annat exempel är vårt fördröjningsmakro. Vi har ett register som vi har kallat "millisekunder" som innehåller vår fördröjningstid i millisekunder. I det här fallet är det i ett makro och vi påminner om att makrons sätt är att assembler placerar hela makrokoden på platsen i programmet där den kallas. I det här fallet skulle vi vilja bli av med variabeln "millisekunder" och ersätta den med en av våra tillfälliga variabler. I det här fallet kommer jag att göra det lite annorlunda för att visa dig hur även om variabelns värde kommer att behövas någon annanstans kan vi fortfarande använda det genom att använda stacken. Så istället för millisekunder använder vi "temp" och för att vi inte ska skruva upp andra saker som också använder värdet på temp börjar vi helt enkelt "fördröjning" -makrot genom att "trycka" temp till stacken, sedan använder vi det i stället för millisekunder, och sedan i slutet av makrot "popar" vi dess tidigare värde tillbaka från stapeln.

Nettoresultatet är att vi har "lånat" temp och temp2 för tillfälligt bruk och sedan återställt dem till sina tidigare värden när vi är klara.

Här är ADC_int -avbrottsrutinen efter den här ändringen:

ADC_int:

tryck temp; spara temp eftersom vi ändrar det här push temp2; spara temp2 lds temp2, ADCH; ladda knapptryckning ldi ZH, hög (2*siffror) ldi ZL, låg (2*siffror) cpi temp2, 0 breq return; om bullerutlösare inte ändrar 7segnumber setkey: lpm temp, Z+; belastning från tabell och efter inkrement clc cp temp2, temp; jämför knapptryckning med tabellen brlo PC+4; om ADCH är lägre, försök igen lpm 7segnumber, Z; annars ladda keyvalue tabellen inc siffra; öka siffran rjmp return; och returnera adiw ZH: ZL, 1; inkrement Z rjmp setkey; och gå tillbaka till toppen tillbaka: pop temp2; återställa temp2 pop temp; återställa temp reti

Lägg märke till att sättet som stacken fungerar på är att den första på är den sista av. Precis som en bunt papper. Du ser att i våra två första rader skjuter vi värdet av temp till stacken, sedan skjuter vi temp2 vidare till stacken, sedan använder vi dem i subrutinen för andra saker och slutligen återställer vi dem till deras tidigare värden igen genom att första popping temp2 off (eftersom det var den sista som trycktes på den är högst upp i stapeln och kommer att vara den första som vi hoppar tillbaka) och sedan popping temp.

Så från och med nu kommer vi alltid att använda denna metod. Den enda gången vi faktiskt kommer att utse ett register för något annat än en tempvariabel är när vi kommer att behöva det överallt. Till exempel är registret som kallas "överflöden" ett som vi använder på flera olika platser i programmet och därför skulle vi vilja ge det ett namn. Naturligtvis kan vi fortfarande använda det som vi har gjort med temp och temp2 eftersom vi skulle återställa dess värde efter att vi är klara. Men det skulle spagettifiera saker för mycket. De är namngivna av en anledning och vi har redan temp och temp2 för det jobbet.

Steg 6: Lågpassfilter och spänningsförstärkare

Lågpassfilter och spänningsförstärkare
Lågpassfilter och spänningsförstärkare
Lågpassfilter och spänningsförstärkare
Lågpassfilter och spänningsförstärkare

För att städa upp bullret lite och få vår knappsats att fungera bättre vill vi lägga till ett par lågpassfilter. Dessa filtrerar bort högfrekvensbruset och låter lågfrekvenssignalen passera. I huvudsak är sättet att göra detta helt enkelt att lägga till en 68 pf kondensator mellan vår analoga ingång och jord och också en 0,1 mikrofarad (dvs. 104) kondensator mellan vårt PD4 (INT0) avbrott och jord. Om du leker med dessa medan du trycker på knapparna på knappsatsen kan du se vad de gör.

Därefter vill vi göra en spänningsförstärkare. Det visar sig att den nedre raden av tangenter på knappsatsen (liksom återuppringningsknappen) lägger ut för låg spänning för att utlösa INT0 -avbrottet. Den analoga porten är tillräckligt känslig för att läsa de låga spänningarna från dessa tangenter, men vår avbrottsstift får inte en tillräckligt bra stigande kant för att avbryta när vi trycker på dessa tangenter. Därför skulle vi vilja ha ett sätt att se till att en trevlig spännings stigande kant träffar PD4 men samma lågspänning träffar ADC0. Detta är en ganska hög order eftersom båda signalerna kommer från samma utmatningskabel på vår knappsats. Det finns ett antal sofistikerade sätt att göra detta, men vi kommer inte att använda vår knappsats längre efter den här handledningen, så låt oss bara slå ihop en metod som fungerar (knappt).

Du bör först ansluta en extern knapp för att ersätta INT0 -avbrottet och styra displayen genom att hålla en knapp på knappsatsen och klicka på knappen. Detta har färre knappsatsproblem och gör att du kan vara säker på att dina spänningar är korrekt inställda på tangentbordets uppslagstabell. När du vet att knappsatsen är korrekt ansluten, bli av med knappen och sätt tillbaka INT0 -avbrottet. Det finns några allvarliga brus- och spänningsproblem som styr knappsatsen på det här sättet så det är bra att veta att allt fungerar så att framtida problem kan isoleras till INT0 -tangenten.

När du kopplar din knappsats och din spänningsförstärkare är det mycket troligt att samma motståndsvärden som jag har använt inte kommer att fungera. Så du måste experimentera för att få värden som fungerar för dig.

Om du tittar på diagrammet som jag har bifogat detta steg kommer du att se hur spänningsförstärkaren kommer att fungera. Vi använder några motstånd och två transistorer. Det sätt på vilket transistorer fungerar (se datablad!) Är att det finns en minsta spänning som du behöver mata in till basstiftet på transistorn (mittstiftet) som kommer att mätta det och låta ström flöda mellan kollektorstiftet och sändaren stift. När det gäller 2N3904 -transistorn som vi använder här är spänningen 0,65V. Nu tar vi den spänningen från vår utgång från knappsatsen och vi vill inte ändra den utgången så vi kommer att sätta ett stort motstånd mellan utmatningen från knappsatsen och basen på den första transistorn (jag använde 1Mohm). Jag har märkt detta som R_1 i diagrammet. Sedan vill vi sätta upp en spänningsdelare så att basen på transistorn är "nästan" vid 0,65 volt redan och bara en liten liten bit mer kommer att trycka den över toppen och mätta den. Den där lilla biten kommer från knappsatsens utmatning när vi trycker på en knapp. Eftersom knapparna på knappsatsen bara släpper ut en liten spänning måste vi vara mycket nära mättnad redan för att de ska räcka. Spänningsdelarens resistorer är märkta R_a och R_b i diagrammet. Jag använde R_a = 1Mohm och R_b = 560Kohm men det är nästan säkert att du måste leka med dessa nummer för att få det rätt för din installation. Du kanske vill ha en vägg i närheten att slå huvudet mot och två eller tre glas scotch till hands (jag skulle rekommendera Laphroaig - dyrt, men värt det om du gillar rök. Om saker blir riktigt vansinniga, ta bara en kanna av BV och bosätta sig för natten)

Låt oss nu titta på hur transistorerna kommer att ge oss en fin stigande kant som går in på INT0 -tangenten och generera vårt knapptryckningsavbrott. Låt oss först titta på vad som händer när jag inte trycker på en knapp. I så fall är den första transistorn (märkt T1 i diagrammet) avstängd. Så det rinner ingen ström mellan kollektor- och emitterstift. Således kommer basen på den andra transistorn (märkt T2) att dras högt och sålunda kommer den att mättas så att ström kan flöda mellan dess stift. Detta innebär att T2 -sändaren dras lågt eftersom den är ansluten till kollektorn som själv är ansluten till jord. Således blir utgången som går till vår INT0 -knapptryckningsavbrottsstift (PD4) låg och det blir inget avbrott.

Vad händer nu när jag trycker på en knapp? Tja då går basen på T1 över 0,65V (för de nedre tangenterna går den bara knappt över!) Och då kommer strömmen att få flöda vilket drar basen av T2 till låg spänning och detta stänger av T2. Men vi ser att när T2 är avstängd, dras utgången högt och därför kommer vi att få en 5V -signal som går till vårt INT0 -stift och det kommer att orsaka ett avbrott.

Lägg märke till vad nettoresultatet är här. Om vi trycker på 1 -tangenten får vi 5V till PD4 utan att signifikant ändra utgången till ADC0, och ännu viktigare, även om vi trycker på Asterisk, 0, Hash eller Redial, får vi också en 5V -signal som går till INT0 och även orsakar ett avbrott! Detta är viktigt eftersom om vi bara gick direkt från knappsatsutgången till INT0 -stiftet, genererar knapparna nästan ingen spänning och de kommer inte att räcka för att utlösa den avbrottsstiftet. Vår spänningsförstärkare har löst detta problem.

Steg 7: Fyrsiffrig visningskod och video

Det är allt för handledning 9! Jag har bifogat koden och en video som visar operationen.

Detta kommer att vara sista gången vi kommer att använda den analoga knappsatsen (tack och lov). Det var svårt att använda, men det var också mycket användbart för att lära oss om analog-till-digital-konvertering, analoga portar, avbrott, multiplexering, brusfilter, spänningsförstärkare och många aspekter av monteringskodning från uppslagstabeller till timer/räknare etc. Det är därför vi bestämde oss för att använda den. (plus att det är roligt att hitta saker).

Nu ska vi titta på kommunikation igen och få våra 7-segment och våra 4-siffriga displayer att läsa upp våra tärningskast från vår tärningsrulle på samma sätt som vi gjorde med vår registeranalysator. Den här gången kommer vi att använda tvåtrådigt gränssnitt snarare än vår hackade tillsammans morse-kodmetod.

När kommunikationen fungerar och rullarna visas på skärmarna kan vi äntligen göra den första delen av vår slutprodukt. Du kommer att märka att utan alla analoga portgrejer kommer vår kod att bli betydligt kortare och förmodligen lättare att läsa.

För er som är ambitiösa. Här är ett "projekt" som du kan prova som du säkert har kunskap att göra vid denna tidpunkt om du har gått igenom alla dessa handledning till denna punkt:

Projekt: Gör en räknare! Använd vår fyrsiffriga display och vår knappsats och lägg till en extern knapptryckning som fungerar som en "enter" -knapp. Kartlägg asterisken till "tider", hash till "dividera" återuppringningen till "plus" och blixten till "minus" och skriv en miniräknare som fungerar som en av de gamla HP "reverse polska" räknarna som alla ingenjörer hade förr i tiden. D.v.s. hur de fungerar är att du anger ett nummer och trycker på "enter". Detta trycker på det numret till bunten, sedan anger du ett andra nummer och trycker på "enter", vilket skjuter det andra numret till bunten. Slutligen trycker du på en av operationerna som X, /, + eller - och den kommer att tillämpa denna operation på de två översta siffrorna på stapeln, visa resultatet och skjuta resultatet på stapeln så att du kan använda det igen om du tycka om. Till exempel om du lägger till 2+3 gör du: 2, "enter", 3, "enter", "+" och displayen läser sedan 5. Du vet hur du använder stapeln, displayen, knappsatsen och du har det mesta av bakgrundskoden redan skrivit. Lägg bara till enter -tangenten och de underrutiner som behövs för miniräknaren. Det är lite mer komplicerat än du kanske först tror, men det är roligt och genomförbart.

Vi ses nästa gång!

Rekommenderad: