Kul med PIC församling - Episode 12 (2 / 2 steg)
Steg 2: programvara
Programvaran länk nedan. Medan det är måltavlan för 16F688, är det 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. Den __CONFIG linjen 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.
Som nämnts i maskinvaruavsnittet, LCD börjar i 8-bitars läge och måste vara befallde till 4-bitars läge. Om man tittar på avsnittet LCD initiering kommer du att se att de första fyra kommandona skickas medan LCD är i 8-bitars läge. Eftersom LCD-skärmen kommer att se i trädgården på lägre fyra data linjer, skickar vi endast den övre Mumsa av data. Till exempel i 8-bitars gränssnittsversion skulle vi skicka hexadecimala byte 30, 30, 30 berätta LCD för att vi vill initiera om den. I den 4-bitars versionen skicka vi hex nibbles 3, 3, 3 men LCD ser 30, 30, 30. Den fjärde nibble skickar vi är 2 som LCD-skärmen ser som 20. Detta säger det till 4-bitars läge. Efter den punkten kommer vi att skicka varje databyte som ett par nibbles och LCD-skärmen kommer att sy ihop dem internt innan du bearbetar dem. Resten av initieringskommandon har samma värden som i 8-bitars versionen förutom att vi skickar 28 i stället för 38 för funktionen Ange kommandot. Det beror på "2" betyder 4-bitars läge medan "3" betyder 8-bitars läge.
Eftersom vi måste skicka varje byte som i rad nibbles lägga vi några rader kod till rutinen "Write_LCD". LCD-skärmen förväntar sig den övre nibble först så gör vi en nibble swap för att sätta det övre mumsa i de lägre fyra bitarna och sedan maskera bort de övre fyra bitarna. När vi skickar den lägre nibble inte vi gör swappen och bara maskera bort de övre fyra bitarna. Ganska enkla förändringar men under längst tid jag kunde få det att korrekt Visa min datameddelanden. Jag tänkte att något måste vara fel med den "Write_LCD" rutinen men det förvirrande var att rutinen arbetat rättvis böter när du skickar initieringskommandon. Det bud endast upp när jag försökte byta LCD till indataläge. Vad jag slutligen bosatte sig på som en lösning var att lägga till en 50us fördröjning strax före aktivera pulsen som talar LCD att fånga den första nibble. När jag fik den arbetande försökt jag mindre fördröjning (det fungerade ner till om 25us). Jag försökte också att sätta fördröjningen innan aktivera för den andra nibble men det inte fungerade. Intressant nog fungerade att sätta fördröjningen i första aktivera pulsen. Jag skurade spec för Hitachi LCD-controller chip men hittade inget som kunde förklara behovet av extra försening – endast i data-läge, och endast när den första Mumsa av varje byte bearbetas. Det sade bara att du bör kontrollera "Upptagen flagg" efter varje bit data skickas men som kräver komplexitet byta LCD för att läsa läge. Det visar sig att miljontals exempel på webben var till någon hjälp antingen och många av dem lämnade mig undrar om de verkligen arbetat som skrivet. Jag har flera olika versioner av LCD-skärmen så det inte verkar vara en anomali i bara en av dem. Det fortfarande driver mig lite galen utan att veta "varför".
Intresse för fullständighet, bör jag nämna att de tre första "Speciella funktionen in" kommandona (de 3, 3, 3) behövs förmodligen inte. Om LCD befogenheter upp ordentligt sedan spec säger du kan gå direkt till skicka kommandot för 4-bitars läge. Det gör inte ont för att lämna de första uppsättningen kommandon där och de kan hjälpa om LCD-skärmen inte driva upp korrekt ibland. Det är därför jag lagt dem där. Tja, är det det för Episode 12 "Kul med PIC församling". Håll ögonen öppna för ytterligare episoder.