ATmega8/16 - hd44780 & sd card

Status
Not open for further replies.

TeO_PL

Newbie level 4
Joined
Jun 8, 2013
Messages
5
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Visit site
Activity points
60
Hi all! I'm new on this forum and I want to sorry for my mistakes (English is not my native language).

My problem is how to interface hd44780 and memory card.
I used this program (ignore the comments)

Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <avr/io.h>
//
#define LCD  PORTB
#define E  3
#define RS  2
//
#define SET_E   LCD |= _BV(E)
#define CLR_E   LCD &= ~_BV(E)
//
#define SET_RS  LCD |= _BV(RS)
#define CLR_RS  LCD &= ~_BV(RS)
 
// funkcja opóźniająca o x*1ms
void waitms(char x)
{
unsigned char a, b; // zmnienne licznikowe
for( ; x > 0; --x) // ta pętla zostanie wykonana x-razy
  for(b = 10; b > 0; --b) // a ta 10 razy
    for(a = 100; a > 0; --a) // natomiast ta 100 razy
    __asm("nop"); // dodatkowa instrukcja opóźniająca o 1 cykl
    // razem to da opóźnienie ok. x * 1ms
    // x od 0 do 255
}
 
// pcodedura zapisu bajtu do wyświetlacza LCD
// bez rozróżnienia instrukcja/dana
void write_to_lcd(char x)
{
SET_E; // ustaw na E stan wysoki
LCD = ((LCD & 0x0F) | (x & 0xF0)); // zapis pierwszej połówki bajtu
CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
SET_E; // ustaw na E stan wysoki
LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4)); // zapis drugiej połowki bajtu
CLR_E; // opadające zbocze na E -> zapis do wyświetlacza
waitms(1); // czekaj 1ms
}
 
// procedura zapisu instrukcji do wyświetlacza LCD
void write_command(char x)
{
CLR_RS; // niski stan na RS -> zapis instrukcji
write_to_lcd(x); // zapis do LCD
}
 
// procedura zapisu danej do wyświetlacza LCD
void write_char(char x)
{
SET_RS; // wysoki stan na RS -> zapis danej
write_to_lcd(x); // zapis do LCD
}
 
// procedura zapisu tekstu do wyświetlacza LCD
void write_text(char * s)
{
while(*s) // do napotkania 0
  {
  write_char(*s); // zapisz znak wskazywany przez s na LCD
  s++; // zwiększ s (przygotuj nastepny znak)
  }
}
 
// procedura inicjalizacji wyświetlacza LCD
void lcd_init(void)
{
waitms(15); // czekaj 15ms na ustabilizowanie się napięcia zasilającego
CLR_E; // E = 0
CLR_RS; // RS = 0
char i; // zmianna licznikowa
for(i = 0; i < 3; i++) // trzykrotne powtórzenie bloku instrukcji
  {
  SET_E; // E = 1
  LCD &= 0x3F; //
  CLR_E; // E = 0
  waitms(5); // czekaj 5ms
  }
SET_E; // E = 1
LCD &= 0x2E; //
CLR_E; // E = 0
waitms(1); // czekaj 1ms
write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
write_command(0x08); // wyłącz LCD, kursor i miganie
write_command(0x01); // czyść LCD
write_command(0x06); // bez przesuwania w prawo
write_command(0x0C); // włącz LCD, bez kursora i mrugania
}
 
// program główny
int main(void)
{
// konfiguracja portów we/wy
DDRB = 0xFF;
DDRD = 0xFC;
PORTB = 0xFF;
PORTD = 0xF7;
// inicjalizacja LCD
lcd_init();
// zapisz na LCD przykładowy tekst
write_text("Ala ma kota :D");
// petla nieskończona
while(1);
return 0;
}



But now I'm wonder how to read txt file from sd card and write it on lcd. I heard something about petitfs but I don't know how to use it, so if you can help me please reply.
 

Well for that you need to understand a bit about memory allocation, and writing formats like FAT, NTFS etc. generally in a drive there is a master table which keeps track of all the files and their starting locations. So if you want to read a file from a drive, first you need to read this Master table then accordingly navigate to file of your interest and then do burst read.
 

Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…