Kul med PIC församling - Episode 13 (5 / 6 steg)
Steg 5: programvara
Länkarna listas nedan. Medan de är måltavlan för 16F1847, är de lätt portas till andra versioner av bilden. Du kommer att behöva ändra raden som identifierar den PIC versionen (lista =) och INCLUDE-filen men de är intuitivt förändringar. __CONFIG raderna kan också behöva tweaking bara för att en eller två av de etiketter som används är stavat fel i några av inkluderade filer. De största kraven är tillräckligt/o-portar, tillräckligt med programminne för och 16-bitars indirekt adressering anlagen.
Som vi såg i beskrivningen av LCD-skärmen har möjlighet att behandlas i antingen en seriell eller parallell läge. I parallell läge kan det vara antingen en 4-bitars eller ett 8-bitars gränssnitt precis som 1602 LCD. Eftersom jag behövde uppgradera bilden för att få den nödvändiga indirekta adressering anlagen slutade jag upp med tillräckligt I/O linjer du enkelt göra en 8-bitars parallellt gränssnitt. Jag skapade också en version att arbeten med shift registrerar gränssnitt jag närmare i avsnitt 1. Både församling filer finns beskrivna.
Det finns några andra betydande skillnader mellan 16F1847 och äldre bilder har vi använt. Först, en intern oscillator i gamla bilder skulle bara gå upp till 8 Mhz. Det har varit mer än snabb nog för dessa små projekt men det är alltid trevligt att ha en liten extra hästkrafter tillgänglig om du någonsin behöver det. Den 16F1847 intern oscillator kan gå upp till 16 Mhz på sin egen och upp till 32-Mhz genom att offra en av de interna funktionerna. En annan viktig skillnad är att det finns massor av nya register i 16F1847 vilket inte innebär att några av dem vi behöver i Bank0 eller Bank1. Det gör att det är viktigare att se till att vi har rätt banken väljs när register. En ny uppsättning register att vi inte använder här men som kan vara mycket praktiskt är de LATA och LATB register. Detta är spärr register vilket håller det sista värdet som skrevs till PORTA eller PORTB. Du kan läsa LAT registrerar direkt om du vill göra en Läs-ändra-skrivåtgärd. Du kommer också att märka att det finns två "_CONFIG". Det beror på att alla nya alternativ kräver två konfigurationen register. Det är mycket viktigt att se till att du får rätt alternativ samband med rätt konfiguration registret eftersom MPLAB kommer att flaggas detta som ett fel. Jag lärde mig att den hårda vägen.
Omkopplaren i schematiskt får läsa på initiering tid att bestämma om texten ska visas eller grafik bilden. Ändra växeln medan strömmen är på att inte växla till andra displayen. Du måste stänga, ändra växeln och sedan slå på igen. Kom ihåg, detta är bara en demo setup. De rutiner som kallas för visning av text är i princip desamma som vi använde för 1602 LCD. Den första skillnaden är att vi har fyra rutiner för fyra rader i stället för två. Den andra skillnaden är att startadresser för rader är något annorlunda.
Grafikläge kräver att vi använder "extended instruction set". Låter läskigt, men det verkligen inte. Vad är faktiskt lite svårare är hur vi tar itu med grafikminnen. Den första skillnaden är att vi tar itu med minnet som en matris så måste vi skicka vertikala och horisontella koordinaterna för minnet att skriva till. Specifikationen talar om vertikala och horisontella adresser men det kan vara lite förvirrande. I själva verket vertikal motsvarar raden och horisontal motsvarar kolumnen. Eftersom vi skickar en byte i taget, finns det 16 byte per rad vilket motsvarar 128 bitar (pixlar). Det finns totalt 64 rader men displayen minnet är inte helt sammanhängande. Den är uppdelad i övre och nedre halvor, vardera med 32 rader av 16 kolumner. I övre börja halva kolonner alltid med adress 80h. I nedre börja halva kolonner alltid med adress 88h. Rader adress från 80h till 9Fh i båda halvlekarna. Du kan få vanskligheten försöker skicka en kolumnen adress än 80 h så den säkra metoden är att alltid skriva en fullständig rad 16 byte. Om du försöker skriva bara en del av en rad måste du skicka två data-byte per adress. LCD logiken lagrar 16 bitar per minnesplats.
Internt, LCD automatiskt ökar värdet för den horisontella (kolumn) adressen varje gång den tar emot data och återställs automatiskt tillbaka till antingen 80h eller 88h beroende på vilken halva av skärmen vi skriver till. Lodrät (rad) adressen kommer inte automatiskt ökar. Programvaran måste hålla reda på den faktiska rad adressen men det också håller reda på antalet byte som skrivits per rad så den vet när du ska uppdatera raden adressen. I vårt exempel vi skicka en fullständig rad med data och skickar sedan en adressuppdatering när vi byter till en ny rad. Vi använder också den rad adressen för att veta när att initiera adresserna för nedre halvan av skärmen.
Vi såg tidigare att vi definierat varje hex datalinje med direktivet "data". I detta fall skrivs data faktiskt in i programmet minne när vi Programmera chip. Detta är lite annorlunda än våra tidigare metoder för använder uppslagstabeller där vi använt "RETLW" kommandon tillbaka önskat värde. I vårt nuvarande exempel vi bara vill läsa en specifik minnesplats så använder vi en annan form av indirekt adressering för att komma dit. Det är en av de andra skäl för att använda en nyare bild chip. Det ger mer än bara 8-bitars indirekt adressering. Prov mjukvaran har faktiskt två grafik tabeller i den, var och en som kräver 1 k byte av program minnesutrymme. För att ändra grafik måste du faktiskt ändra två kodrader i rutinen "Do_Graph" att peka på antingen "Picture1" eller "Bild2".
En viktig sak att komma ihåg när du skapar grafik datatabeller i vårt exempel program är att de måste börja på en sidgränsen (xx00h) och måste innehålla exakt 1 024 byte. Varje bord är märkt separat och ges en specifik startadress (uttrycket kod). Medan varje koddefinitionen har en etikett, som inte är etiketten som vi använder i programmet. De etiketter som används i programmet är "Picture1" och "Bild2" som direkt föregår deras respektive rader av data.