Politechnika Lubelska
Wydział Elektrotechniki i Informatyki
Laboratorium układów mikroprocesorowych
Klawiatura matrycowa i wyświetlacz LCD (AVR Studio)
Duda Andrzej
ED 9.8 I3
Program odczytuje stan klawiatury, zapala kolejno diody oraz wyświetla
na wyświetlaczu LCD wartości odpowiadające wciskanym klawiszom.
#include <avr/io.h>
void czas(unsigned long k)
{int j;
for(k=255;k>0;k--)
{for(j=255;j!=0;j--);}
}
void czekaj(int czas)
{int i;
for (i=0;i<czas;i++);
};
void wyswietlacz(int kod) //funkcja obsługi wyświetlacza LCD
{if (kod!=0)
{czekaj(1000);
PORTD=0b00000011+(kod & 0b11110000);
czekaj(1000);
PORTD=(PORTD & 0b11111101);
czekaj(1000);
PORTD=0b00000011+kod*16;
czekaj(1000);
PORTD=(PORTD & 0b11111101);
czas(65);
}
};
int klawiatura() //funkcja czytająca stan klawiatury
{int kod=0,kod2=0,key;
PORTA=0b01111111;
key=PINA;
czekaj(1000);
switch (key)
{czekaj(1000); //zwłoka czasowa dodana aby działały
case 0b01111111:kod=0x00;break; // wszystkie linie klawiatury
case 0b01111110:kod=0x31;break;
case 0b01111101:kod=0x32;break;
case 0b01111011:kod=0x33;break;
case 0b01110111:kod=0x34;break;
default:kod=0x21;
};
if(kod!=0x21)
{PORTA=0b10111111;
key=PINA;
czekaj(1000);
switch (key)
{czekaj(1000);
case 0b10111111:kod2=0x00;break;
case 0b10111110:kod2=0x35;break;
case 0b10111101:kod2=0x36;break;
case 0b10111011:kod2=0x37;break;
case 0b10110111:kod2=0x38;break;
default:kod2=0x21;
};
if (kod*kod2==0)
{if (kod==0) kod=kod2;
}
else kod=0x21;
};
if(kod!=0x21)
{PORTA=0b11011111;
key=PINA;
czekaj(1000);
switch (key)
{czekaj(1000);
case 0b11011111:kod2=0x00;break;
case 0b11011110:kod2=0x39;break;
case 0b11011101:kod2=0x30;break;
case 0b11011011:kod2=0x41;break;
case 0b11010111:kod2=0x42;break;
default:kod=0x21;
}
if (kod*kod2==0)
{if (kod==0) kod=kod2;
}
else kod=0x21;
};
if(kod!=0x21)
{PORTA=0b11101111;
key=PINA;
czekaj(1000);
switch (key)
{czekaj(1000);
case 0b11101111:kod2=0x00;break;
case 0b11101110:kod2=0x43;break;
case 0b11101101:kod2=0x44;break;
case 0b11101011:kod2=0x45;break;
case 0b11100111:kod2=0x46;break;
default:kod=0x21;
}
if (kod*kod2==0)
{if (kod==0) kod=kod2;
}
else kod=0x21;
};
return kod;
};
void main()
{DDRB=0b11111111;
DDRD=0b11111111;
DDRA=0b11111111;
PORTA=0b11111111;
DDRA=0b11110000;
PORTD=0b00100010;
czekaj(1000);
PORTD=0b00100000;
czekaj(1000);
PORTD=0b00000010;
czekaj(1000);
PORTD=0b00000000;
czekaj(1000);
PORTD=0b11100010;
czekaj(1000);
PORTD=0b11100000;
czekaj(1000);
PORTD=0b00000010;
czekaj(1000);
PORTD=0b00000000;
czekaj(1000);
PORTD=0b00010010;
czekaj(1000);
PORTD=0b00010000;
czekaj(1000);
PORTD=0b00000010;
czekaj(1000);
PORTD=0b00000000;
czekaj(1000);
PORTD=0b01100010;
czekaj(1000);
PORTD=0b01100000;
while (1)
{int kod;
kod=klawiatura(); //wywołanie funkcji obsługujących klawiaturę
PORTB=kod; // oraz wyświetlacz
wyswietlacz(kod);
};
};
4