1. doelstellingen
Een pen schrijven op dot-matrix scherm bereiken.
2. circuit analyse
Dot-matrix scherm handschrift bestaat uit drie hoofdonderdelen: de rij scanning circuit kolom scannen circuit weergegeven, lichte pen detectie circuit, blokdiagram hieronder. Lichte pen gebruikt hierin geïnstalleerde binnen een lichtgevoelige sensor voor het detecteren van de staat van de rooster punten. Als volgt:
(1) lijn scan inschakelen op zijn beurt decoder Y0, Y1... effectief, terwijl effectieve 74ls138 uitvoer laag is, maar we gebruiken is gemeenschappelijk anode dot matrix-scherm, dus het moet worden ontkend, het ontwerp maakt gebruik van PNP transistor ontkend. Elke acht kolom scannen eenmaal scannen.
(2) kolom op zijn beurt scannen inschakelen decoder Y0, Y1... effectief, en het ingangssignaal van de PWM op OE1, wanneer OE1 hoge Y0 is ~ Y7 zijn alle hoog niveau, wanneer OE1 is laag, de uitgang van de decoder ABC besloten door de drie pinnen. In een rij verkozen wij gecontroleerd op zijn beurt Y0, Y1... en helderheid van elke LED-lamp OE1 verordening.
(3) lichte pen kreeg de comparator omkeren van input van de referentie spanning instelling en lichte pen licht toen de inverterende ingang van de ingangsspanning kleiner dan deze waarde is, wanneer de lichte pen niet het licht ontvangt bij de inverterende ingang van de ingangsspanning is hoger is dan deze waarde als een bepaalde waarde. Wanneer de lichte pen niet ontvangt is het licht via de huidige R3 erg klein, dus de input voor de comparator ingangsspanning dichtbij de voedingsspanning, omkeren, dan de uitgang van comperator hoog, is wanneer het licht van de lichte pen ontvangen via de huidige van R3 groot toenemen zal, de spanning over R3 toenemen zal, zodat de inbreng op de comparator omkeren ingangsspanning is gereduceerd , dan de uitgang van comperator laag is, dan de microcontroller kunt vangen deze wijziging en breng vervolgens de juiste behandeling.
3. programma analyse
Voor het detecteren van het lattice punt op wij de LED op de rooster moet verlichten, en het is in de ultralichte staat, toen de slag sloeg een punt van licht, zet dit punt te benadrukken. Dus hoe kunnen we de coördinaten van dit punt naar het licht weten? Het principe is dit: de LED verlichte één voor één, eerst de eerste regel van de eerste, dan de eerste regel van het tweede,..., eerste naar de laatste nld en ga dan naar de tweede regel van de eerste, de cyclus LED verlicht sequentieel, en elke LED instellen een status-waarde, zoals de waarde nul geeft een ultralichte , 1 vertegenwoordiger gemarkeerd. Wanneer de lichte hit de slag van een punt als dit niet het begin van deze LED brandt het licht niet de lichte pen lichte pen detecteert zodat de output is opgeheven, schakelen de LED-lichten wanneer verlicht omdat het licht van de LED pen gedetecteerd licht, de uitvoer licht pen van hoog naar laag , wanneer het apparaat detecteert dit niveau wijzigen voor het invoeren van de interrupt-reeks, en krijg de huidige rij, kolomwaarden, en door de rijen, kolommen, wijzigen de waarde op dit moment de status-waarde is 1, zodat de volgende keer dat het was toen dit kleine beetje licht op dit door te oordelen de status-waarde is ingesteld op het benadrukken van vorm. staat. Wanneer de scansnelheid zagen we het hele dot-matrix scherm is verlicht, en in plaats van één voor één verlicht.
Referentie procedure is als volgt:
#include
#define COL 1
#define rij 2
int col = 0; Markeert de huidige rij van de Scanned
int rij = 0; Mark de huidige Scanned kolom
int ledState [8] [8]; Mark de huidige LED-status
/ * haveUpdate gebruikt voor het elimineren van lichte pen jitter, wanneer de verworven lichte pen signaal vallende rand wanneer de gegevens worden bijgewerkt, * en deze vlag is ingesteld op 1 geeft aan dat de gegevens heeft bijgewerkt, en vervolgens de timer op de volgende klimaat jitter open * omdat de gegevens is bijgewerkt tot verwaarlozing van jitter, wanneer de reguliere tijd tot tijd opnieuw instellen van deze vlag is ingesteld op 0 * /
int haveUpdate = 0;
VOID Setup
{
memset (ledState, 0, sizeof(ledState)); Alle waarden van de status worden gewist.
initPort(); Initialisatie van de poort
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20); Onverdeelde
OCR2A = 100;
OCR2B = 99; Taakcyclus van 99%
attachInterrupt (0, externInterrupt, vallen); //Set de externe interrupt vallende rand interrupt
cli(); Sluit alle interrupts
TCCR1A = 0; Register A geconfigureerd PWM, we gebruik gewoon de timerfunctie
TCCR1B = (1 < TCNT1 = 0xFE79; //Counter beginwaarde, 25ms timer
TIMSK1 = 0; Sluiten van overloop
Sei(); Open global interrupt
} ISR(TIMER1_OVF_vect) {//Timer interrupt service routine
TIMSK1 = 0; Nauwe inschakelen overflow interrupt
haveUpdate = 0; Reset vlag
}
void loop
{
Scan(); Cyclische scan
}
ongeldig externInterrupt() //External interrupt service routine
{
if(haveUpdate == 0)
{
ledState [rij] [col] = 1; Volgens de staat van rij- en kolomlabels die momenteel worden gedetecteerd punt
haveUpdate = 1;
TCNT1 = 0XFE79; Initiële waarde van de teller, 25ms timer
TIMSK1 =(1< 0)
OCR2B = 1;
anders
OCR2B = 98;
delayMicroseconds(300);
OCR2B = 98;
}
}
}
Platen van PCBWay, en meer over elektronica op http://e-gather.ui3g.com/.