Descrição

O objectivo desta montagem é escrever um conjunto de carateres num LCD 16x2, com controlador HD44780U ou KS0066U (compatível com o anterior).

Para tal, existe todo um conjunto de regras ou protocolos, que há que conhecer e implementar, de forma a conseguir a correcta comunicação entre o LCD e o microcontrolador. A comunicação é estabelecida de forma paralela, usando um bus de 4 ou 8 bits, dependendo da forma como o hardware está implementado, através do qual são enviados/recebidos dados ou intruções. Há também um bus de controlo, composto por 3 bits, que são:
E - enable (abilita escrita ou leitura)
RW - selecciona escrita ou leitura de dados(H) ou instruções(L)
RS - selecciona entrada de dados(H) ou instruções(L)

Para que o LCD funcione correctamente há que o inicializar, e apresenta-se a seguir o diagrama de inicialização para um bus de dados/instruções de 8 bits:


É necessário saber também, como está mapeada a memória do controlodar do LCD, para que se saiba exactamente como endereçar um caracter. Apresenta-se então um mapa com a posição vs endereço de memória, até 24 carateres por linha (com o tipo de controlador usado é possível ter um LCD de até 40 colunas)

Sobre o bit E

Para enviar dados/instruções ao LCD, colocam-se essa informação no bus (8 bits neste caso) e pulsa-se o bit E (enable) para que o LCD interprete o dado que tem colocado no seu bus.

Sobre os bits RS e R/W

Basicamente as funções destes dois bits podem ser entendidas pela seguinte tabela:

RS R/W Função
0 0 Escreve instruções na memória
0 1 Lê instruções da memória (Busy Flag e Contador)
1 0 Escreve dados na memória
1 1 Lê dados da memória
  • Para endreçar a memória, se o LCD estiver configurado para usar apenas 1 linha, os endereços vão de 00h a 4Fh. se for configurado para usar 2 linhas, os endereços da 1ª linha vão de 00h a 27h e os da 2ª linha, de 40h a 67h:

Exemplo: Posicionar o cursor no início da 2ª linha - 11000000b ou C0h com RS (L) e RW (L)

Porquê C0h e não 40h que é o endreço do 1º caracter da 2ª linha?

Para endereçar memória o bit DB7 tem que estar ao nível lógico 1, isto é, temos que colocar no bus 10000000b ou 80h. Assim, se quisermos posicionar o cursor na 2ª linha, 1ª coluna, endreço 40h ou 01000000b, somamos o comando para enviar o endreço 80h á posição de cursor pretendida 40h. Temos então que enviar na realidade para o bus, o valor C0h ou 11000000b que é o resultado da soma dos 2 anteriores.
Num ecrã 20*4, portanto com 4 linhas, a 1ª posição de cursor da 3ª linha tem o valor de 14h, portanto para colocar o cursor nessa posição enviamos o valor 80h+14h que é 94h. Para a 1ª posição da 4ª linha o endereço é 54h e o valor a envi

  • Para escrever um dado no LCD:

Exemplo: Escrever a letra 'M' (código ASCII) - 01001101b ou 4Dh com RS (H) e RW (L)

  • Para ler um dado do LCD:

  • Para verificar se o LCD está ocupado a processar a informação que lhe foi enviada, afim de se verificar se é possível ou não enviar-lhe nova instrução ou dado, pode recorrer-se a uma flag de estado do LCD, a Busy Flag (em DB7), que enquanto estiver ao nível lógico alto (1), assinala que o LCD se encontra ocupado. Quando for colocada ao nível lógico baixo (0) pelo controlador do LCD, este encontra-se em condições de poder receber novo dado ou instrução.


Tabela ASCII

O LCD reconhece os caracteres em código ASCII, e por isso se apresenta a tabela de seguida:


Char  Dec  Hex | Char  Dec  Hex | Char  Dec  Hex | Char  Dec  Hex
-----------------------------------------------------------------
(nul)   0   00 | (sp)   32   20 | @      64   40 | `      96   60
(soh)   1   01 | !      33   21 | A      65   41 | a      97   61
(stx)   2   02 | "      34   22 | B      66   42 | b      98   62
(etx)   3   03 | #      35   23 | C      67   43 | c      99   63
(eot)   4   04 | $      36   24 | D      68   44 | d     100   64
(enq)   5   05 | %      37   25 | E      69   45 | e     101   65
(ack)   6   06 | &      38   26 | F      70   46 | f     102   66
(bel)   7   07 | '      39   27 | G      71   47 | g     103   67
(bs)    8   08 | (      40   28 | H      72   48 | h     104   68
(ht)    9   09 | )      41   29 | I      73   49 | i     105   69
(nl)   10   0A | *      42   2A | J      74   4A | j     106   6A
(vt)   11   0B | +      43   2B | K      75   4B | k     107   6B
(np)   12   0C | ,      44   2C | L      76   4C | l     108   6C
(cr)   13   0D | -      45   2D | M      77   4D | m     109   6D
(so)   14   0E | .      46   2E | N      78   4E | n     110   6E
(si)   15   0F | /      47   2F | O      79   4F | o     111   6F
(dle)  16   10 | 0      48   30 | P      80   50 | p     112   70
(dc1)  17   11 | 1      49   31 | Q      81   51 | q     113   71
(dc2)  18   12 | 2      50   32 | R      82   52 | r     114   72
(dc3)  19   13 | 3      51   33 | S      83   53 | s     115   73
(dc4)  20   14 | 4      52   34 | T      84   54 | t     116   74
(nak)  21   15 | 5      53   35 | U      85   55 | u     117   75
(syn)  22   16 | 6      54   36 | V      86   56 | v     118   76
(etb)  23   17 | 7      55   37 | W      87   57 | w     119   77
(can)  24   18 | 8      56   38 | X      88   58 | x     120   78
(em)   25   19 | 9      57   39 | Y      89   59 | y     121   79
(sub)  26   1A | :      58   3A | Z      90   5A | z     122   7A
(esc)  27   1B | ;      59   3B | [      91   5B | {     123   7B
(fs)   28   1C | <      60   3C | \      92   5C | |     124   7C
(gs)   29   1D | =      61   3D | ]      93   5D | }     125   7D
(rs)   30   1E | >      62   3E | ^      94   5E | ~     126   7E
(us)   31   1F | ?      63   3F | _      95   5F | (del) 127   7F


LCD 20x4

Tendo adquirido um LCD 20x4 da Optrex, exponho aqui tambem um trabalho com o mesmo objectivo do realizado com o LCD 16x2, embora tenha recorrido á directiva "db" (define byte), com a qual foram definidas quatro tabelas contendo cada uma delas, os caracteres a serem escritos nas quatro linhas do LCD.

Datasheets do LCD Optrex DMC20481:
Especificações técnicas
Dimensões físicas

Como o LCD DMC20481 necessita de uma tensão negativa para ajuste do contraste (pino 3 do LCD) de cerca de -3,5v usou-se o conversor de TC7660 para gerar a requerida tensão negativa a partir dos +5v da alimentação genérica de todo o circuito. Este conversor requer apenas mais dois condensadores e um potenciómetro para ajuste da tensão a fornecer ao pino de controlo de contraste do LCD.

Mapa de endereços de memória de diversos ecrãs LCD:

8x1
1
2
3
4
5
6
7
8
1
00
01
02
03
04
05
06
07

8x2
1
2
3
4
5
6
7
8
1
00
01
02
03
04
05
06
07
2
40
41
42
43
44
45
46
47

16x1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F

16x2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
2
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F

16x4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
2
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
3
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
4
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F

20x1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13

20x2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
2
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53

20x4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
2
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
3
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
4
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
60
61
62
63

24x2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
14
15
16
17
2
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57

24x4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
10
11
12
13
14
15
16
17
2
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
3
10
11
12
13
14
15
16
17
18
19
1A
1B
1C
1D
1E
1F
20
21
22
23
24
25
26
27
4
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
60
61
62
63
64
65
66
67

40x1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
34
35
36
37
38
39
40
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
...
21
22
23
24
25
26
27

40x2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...
34
35
36
37
38
39
40
1
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
...
21
22
23
24
25
26
27
2
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
...
61
62
63
64
65
66
67