WinZone-TIC©
WinZone-TIC for humans beings

Montagem de um LCD

Category: By André Delgado
Boas estou a tentar por cada vez este blog mais especifico...
Agora temos aqui a montagem de um lcd


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
 

0 comments so far.

Something to say?