Stap 7: Emulatie Code Routines
Nu het leuke gedeelte!Ik moet de printer om na te denken zijn er vier inktcartridges geïnstalleerd, hiervoor moeten we eerst een aantal emulatie functies implementeren. Weer van voorkennis hebben ik deze in de header vooraf:
• #define epsnCartReady() (_ecRST)
• extern unsigned char espnCartGetAddr(void);
• extern void epsnCartOut (unsigned char gegevens);
• extern unsigned char epsnCartIn (unsigned char gegevens);
epsnCartReady is een macro die wordt gebruikt, Controleer of de printer heeft RST hoog ingesteld.
epsnCartGetAddr resulteert in het adres dat de printerkop vraagt.
epsnCartOut wordt gebruikt om gegevens te verzenden naar de Host-controller
epsnCartIn wordt gebruikt om gegevens te ontvangen vanaf de Host wanneer het schrijven
Dus dit keer, in plaats van beheersing van het SCK te gaan hoog of laag is, we hebben het nodig om te wachten om te gaan hoog of laag, maar als het resetten laag gaat, dan alles stoppen en terug te keren:
unsigned char espnCartGetAddr(void) {} terwijl ((i<4) & & _ecRST) {/ / Loop terwijl ik < 4 en RST is hoog
char i = 0;
char temp = 0x00;
Temp >> = 1; Recht Shift Temp door een
while((!_ecSCK) & & (_ecRST)); Wachten op de klok te gaan hoog
if(_ecSDA) {/ / slechts als SDA hoog
Temp | = 0x08; Stel de 4de bit
}
while((_ecSCK) & & (_ecRST)) ;// wachten op de klok te gaan lage
i ++; _ / / verhogen de teller
}
if(_ecRST == 0) {}
retourneren 0xFF; //if RST ging lage, betekent de Host gedood het signaal
}
retourneren temp; het adres en de lees/schrijf-bit retourneren
}
En de Out-functie:
VOID epsnCartOut (unsigned char gegevens) {} _ecSDATRIS = 0; de SDA uitgang instellen terwijl ((i<8) & & _ecRST) {/ / Loop terwijl ik < 8 en RST is hoog terwijl (_ecSCK & & _ecRST); SCK te laag gaan wachten
char i = 0;
char temp = gegevens;
_ecSDALat = 0; SDA laag ingesteld
terwijl (! _ecSCK & & _ecRST); Wachten op SCK te gaan hoog
_ecSDALat = temp & 0x01; SDA hoog of laag volgens de eerste bit instellen
Temp >> = 1; Juiste verschuiving de gegevens door een
i ++; de teller verhogen met één
}
_ecSDATRIS = 1; Set SDA op een uitgang
_ecSDA = 1; niet zeker als dit nodig is
}
En ten slotte de functie In:
unsigned char epsnCartIn(void) {} terwijl ((i<8) & & _ecRST) {/ / Loop terwijl ik < 8 en RST is hoog terwijl (_ecSCK & & _ecRST) ;// wachten op SCK te laag gaan
unsigned char ik = 0;
char temp = 0x00;
Temp >> = 1; Juiste verschuiving de temp door een
terwijl (! _ecSCK & & _ecRST); SCK te hoog gaan wachten
if(_ecSDA) {//only id SDA is hoog
Temp | = 0x80; Stel de 8e bit
}
i ++; De teller verhogen met één
}
retourneren temp; terug wat we hebben ontvangen
}