Matrisskrivare penna skriva skärm (4 / 6 steg)
Steg 4: Hänvisning Program
#include
#define COL 1
#define rad 2
int col = 0; Markera aktuell kolumn
int rad = 0; Markera aktuell rad
int ledState [8] [8]. Markera aktuell ledde 's state
/*
haveUpdate används för att eliminera jitter av ingång, den vilja uppdatera data när erhåller extern avbryta program och sätta haveUpdate till 1 stativ för vi har uppdaterat data redan, sedan öppna timer och ignorera extern avbrottssignal eller göra ingenting i avbryta program under denna tid CPU ställa haveUpdate till 0 när tiden är ute i timer avbryta program.
*/
int haveUpdate = 0;
void setup()
{
MEMSET (ledState, 0, sizeof(ledState)); klara av alla ledde
initPort();
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20); ingen klyfta
OCR2A = 100;
OCR2B = 99. plikt är 99%
attachInterrupt (0, externInterrupt, faller);
CLI(); Inaktivera alla avbrott
TCCR1A = 0; Vi behöver inte ange TCCR1A eftersom det är gäller för pwm
TCCR1B =(1<
TCNT1 = 0XFE79; 25ms
TIMSK1 = 0; nära overflow avbrott
SEI(); Aktivera avbrott
}
ISR(TIMER1_OVF_vect) {//timer avbryta programmet
TIMSK1 = 0; nära overflow avbrott
haveUpdate = 0;
}
void loop()
{
Scan();
}
void externInterrupt()
{
IF(haveUpdate == 0) {
ledState [rad] [col] = 1;
haveUpdate = 1;
TCNT1 = 0XFE79;
TIMSK1 = (1 <
}
}
void initPort()
{
int i, startPin = 4;
för (jag = 0; jag < 10; i ++) {
pinMode (startPin + i, matas);
}
setData (COL, 0x00);
setData (rad, 0x00);
pinMode (3, OUTPUT);
}
void setData (int flagga, int data)
{
int i, startPin;
IF(Col == Flag) {
startPin = 4;
} annat {
startPin = 7.
}
för (jag = 0; jag < 3; i ++) {
digitalWrite (startPin + i, (data & (1 <
}
}
void scan()
{
för (rad = 0; rad < 8; rad ++) {
setData (rad, rad);
för (col = 0; col < 8; col ++) {
setData (COL, col);
om (ledState [rad] [col] > 0)
OCR2B = 1;
annat
OCR2B = 98.
delayMicroseconds(300);
OCR2B = 98.
}
}
}