politechnika lubelska w lublinie
LABORATORIUM UKŁADÓW MIKROPROCESOROWYCH
Numer ćwiczenia: 7 Temat ćwiczenia: Obsługa klawiatury i wyświetlacza LCD.
Wykonał: BARTOSZEK Krzysztof
Grupa: 9.8
Obsługa klawiatury i wyświetlacza LCD.
#include <avr/io.h>
#include <util/delay.h>
int kbdread(void)
// przeglądanie klawiatury 4x4, funkcja zwraca kod wciśniętego klawisza 'k'
{
PORTD=0b01111111;
switch(PIND)
{
case 0b01110111: return 1;
case 0b01111011: return 2;
case 0b01111101: return 3;
case 0b01111110: return 4;
}
PORTD=0b10111111;
switch(PIND)
{
case 0b10110111: return 5;
case 0b10111011: return 6;
case 0b10111101: return 7;
case 0b10111110: return 8;
}
PORTD=0b11011111;
switch(PIND)
{
case 0b11010111: return 9;
case 0b11011011: return 10;
case 0b11011101: return 11;
case 0b11011110: return 12;
}
PORTD=0b11101111;
switch(PIND)
{
case 0b11100111: return 13;
case 0b11101011: return 14;
case 0b11101101: return 15;
case 0b11101110: return 16;
}
return 0;
}
void lcdinstr(int instr) //zapisz instrukcję sterującą do LCD
{
PORTB=PORTB&0b11111110;
PORTB=PORTB|0b00000010;
PORTB=(PORTB&0x0f)|(instr&0xf0); // przygotuj starszy półbajt do LCD
asm("nop"); // wydłużenie impulsu
asm("nop");
asm("nop");
PORTB=PORTB&0b11111101;
_delay_us(500); // czekaj na gotowość LCD
PORTB=PORTB|0b00000010;
PORTB=(PORTB&0x0f)|((instr&0x0f)<<4); // przygotuj młodszy półbajt do LCD
asm("nop");
asm("nop");
asm("nop");
PORTB=PORTB&0b11111101;
_delay_us(500); // czekaj na gotowość LCD
}
void lcdinit(void)
// funkcja trzykrotnie wysyła do wyświetlacza instrukcję 0x03, następnie
// instrukcję 0x02, po tej operacji wyświetlacz jest gotowy do przyjmowania
// poleceń w trybie 4 bitowym
{
int i;
for(i=0;i<3;i++)
{
PORTB=PORTB|0b00000010;
PORTB=0x30;
asm("nop");
asm("nop");
asm("nop");
PORTB=PORTB&0b11111101;
_delay_ms(50);
}
PORTB=PORTB|0b00000010;
PORTB=(0x20);
asm("nop");
asm("nop");
asm("nop");
PORTB=PORTB&0b11111101;
_delay_us(50);
lcdinstr(0x28); // ustawinie trybu wyświetlacza 16x2, 4 bity danych
lcdinstr(0x0f); // włącz wyświetlacz
}
void lcdwrite(char dana) // zapisz daną do LCD
{
PORTB=PORTB|0b00000001;
PORTB=PORTB|0b00000010;
PORTB=(PORTB&0x0f)|(dana&0xf0); // przygotuj starszy półbajt do LCD
asm("nop");
asm("nop");
asm("nop");
PORTB=PORTB&0b11111101; // impuls strobujący
_delay_us(500); // czekaj na gotowość LCD
PORTB=PORTB|0b00000010;
PORTB=(PORTB&0x0f)|((dana&0x0f)<<4); //przygotuj młodszy półbajt do LCD
asm("nop");
asm("nop");
asm("nop");
PORTB=PORTB&0b11111101; // impuls strobujący
_delay_us(500); // czekaj na gotowość LCD
}
int change (int k)
//zamiana kodu klawisza klawiatury na kod wyświetlany na wyświetlaczu
{
switch(k)
{
case 0x00: return 0b00110000; //0
case 0x01: return 0b00110001; //1
case 0x02: return 0b00110010; //2
case 0x03: return 0b00110011; //3
case 0x04: return 0b00110100; //4
case 0x05: return 0b00110101; //5
case 0x06: return 0b00110110; //6
case 0x07: return 0b00110111; //7
case 0x08: return 0b00111000; //8
case 0x09: return 0b00111001; //9
case 0x0a: return 0b01000001; //a
case 0x0b: return 0b01000010; //b
case 0x0c: return 0b01000011; //c
case 0x0d: return 0b01000100; //d
case 0x0e: return 0b01000101; //e
case 0x0f: return 0b01000110; //f
default: return 0b00010110;
}
}
int main(void)
{
int key=0;
_delay_ms(45); // czekaj na ustalenie napięć w układach
DDRD=0xf0; // ustawienie portu klawiatury
PORTD=0xff;
DDRA=0xff; // ustawienie portu lini z diodami
PORTA=0xff;
DDRB=0xff; // ustawienie portu wyświetlacza
PORTB=0x00;
lcdinit(); // inicjalizacja wyświetlacza
while(1)
{ // niewcisniety zaden klawisz
key=0x00;
while(key==0) key=kbdread(); // czekaj na klawisz
_delay_ms(20); // przeczekaj drgania styków
PORTA=(key-1);
lcdinstr(0x01);
_delay_ms(5);
lcdwrite(change(key-1));
}
}