Universidade Federal de Itajub´a
rodrigomax@unifei.edu.br
Revis˜
ao
Problema de bouncing
Causado pela oscila¸
c˜
ao mecˆ
anica da chave
Pode gerar acionamentos indevidos no sistema
Solu¸c˜
oes
Via hardware atrav´
es de circuito dedicado
Via software atrav´
es de confirma¸
c˜
ao temporal
http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Greensted
1 v o i d m a i n (v o i d) {
2 u n s i g n e d c h a r valTemp , v a l A t u a l , t e m p o ; 3 // i n s e r i r a s c o n f i g u r a ¸c ˜o e s n e c e s s ´a r i a s a q u i
4 f o r( ; ; ) {
5 w h i l e( v a l A t u a l==PORTB ) ; // a g u a r d a uma mudan¸ca
6 v a l T e m p = P O R T B ; // a g u a r d a um tempo 7 t e m p o = 2 2 ; 8 w h i l e ( tempo > 0 ) { // s e n˜ao mudar c o n t i n u a a c o n t a r 9 i f ( v a l T e m p == PORTB ) { 10 tempo −−; 11 } e l s e { // s e mudar , a t u a l i z a e r e i n i c i a 12 v a l T e m p = P O R T B ; 13 t e m p o = 2 2 ; 14 } 15 } 16 v a l A t u a l = v a l T e m p ; // v a l o r a t u a l i z a d o 17 // A q u i a v a r i ´a v e l e s t ´a p r o n t a p a r a s e r u s a d a 18 } 19 }
1 // p r o c e s s o de v a r r e d u r a 2 3 f o r( i = 0 ; i < 2 ; i++){ 4 P O R T B = 0 xff ; // l i g a t o d a s a s c o l u n a s 5 f o r( j = 0 ; j < 1 0 0 ; j++) ; 6 B i t C l r ( PORTB , i ) ; // d e s l i g a c o l u n a a s e r t e s t a d a 7 f o r( j = 0 ; j < 1 0 0 ; j++) ; // g a s t a tempo 8 f o r( j = 0 ; j < 4 ; j++){ 9 i f ( ! BitTst ( PORTB , j+4) ) { // r e a l i z a o t e s t e p a r a c a d a b i t 10 c h a v e [ i ] [ j ] = 1 ; // a t u a l i z a a m a t r i z 11 B i t S e t ( PORTD , j+4∗i ) ; // m o s t r a na p o r t a D 12 }e l s e{ 13 c h a v e [ i ] [ j ] = 0 ; 14 B i t C l r ( PORTD , j+4∗i ) ; 15 } 16 } 17 }
Display de LCD
Display de LCD
Utiliza-se do conceito de polariza¸
c˜
ao da luz para formar a imagem
Os pixels s˜
ao formados por reten¸
c˜
ao de luz
1Geralmente possui um microcontrolador integrado
S˜
ao encontrados em formato de 7 segmentos ou matricial
2No formato matricial ´
e poss´ıvel representar as letras, n´
umeros e
diversos simbolos
1
No caso dos displays com leds, os pixels s˜
ao formados por emiss˜
ao de luz.
2Os formatos matriciais mais comuns s˜
ao 5x7 e 5x8
Este tipo de display pode ser visto como uma solu¸
c˜
ao de exibi¸
c˜
ao
completa:
O microcontrolador faz o papel da placa de v´ıdeo
O display faz o papel do monitor
A comunica¸
c˜
ao ´
e feita atrav´
es de um barramento paralelo
O barramento ´
e comandado por 3 sinais de controle
1
Terra
2
VCC (+5V)
3
Ajuste do contraste
4
Sele¸c˜
ao de registro(RS)
5
Read/Write (RW)
6
Clock, Enable (EN)
7
Bit 0
8Bit 1
9Bit 2
10Bit 3
11Bit 4
12Bit 5
13Bit 6
14Bit 7
15Backlight +
16Backlight Gnd
Aten¸
c˜
ao
Cuidado com a pinagem do display. O que est´
a em uso na aula ´
e 15, 16,
1, 2, ... 14. Os pinos n˜
ao est˜
ao em ordem. A troca/substitui¸
c˜
ao do display
tem que ser realizada com aten¸
c˜
ao pois a placa est´
a pronta para receber
apenas esse tipo de display.
Rotina para envio de dados/comando para o LCD
Para comando RS = 0; Para dados RS = 1;
Habilitar a escrita (RW=1) ou leitura (RW=0)
Acionar terminal EN (enable)
Delay para o LCD entender o comando
Desabilita o terminal EN
Retorna os terminais (RW e RS) para n´ıvel baixo
33
Para melhor uso ´
e interessante retornar os terminais para o valor que tinham antes
de chamar a rotina, j´
a que eles est˜
ao multiplexados com outros dispositivos
http://www.sparkfun.com/datasheets/LCD/HD44780.pdf - Datasheet Hitachi
http://www.sparkfun.com/datasheets/LCD/HD44780.pdf - Datasheet Hitachi
Forma¸c˜
ao dos comandos para controle do LCD:
Instru¸c˜
ao
RS
RW
Dados (bit)
Tempo
(m´
ax.)
7
6
5
4
3
2
1
0
Limpa
0
0
0
0
0
0
0
0
0
1
37 us
Reset
0
0
0
0
0
0
0
0
1
-
1.5ms
Config.
0
0
0
0
0
0
0
1
ID
S
37 us
Config.
0
0
0
0
0
0
1
D
C
B
37 us
Movim.
0
0
0
0
0
1
SC RL -
-
37 us
Config.
0
0
0
0
1
DL N
F
-
-
37 us
Move(l,c)
0
0
1
X
0
0
Coluna
37 us
Ocup.
0
1
BF -
-
-
-
-
-
-
10 us
http://www.sparkfun.com/datasheets/LCD/HD44780.pdf - Datasheet Hitachi (Modificado)
Defini¸c˜
oes:
ID: 1 – Incrementa, 0 – Decrementa
S: 1 – O display acompanha o deslocamento
SC: 1 – Desloca o display, 0 – Desloca o cursor
RL: 1 – Move para direita, 0 – Move para esquerda
DL: 1 – 8 bits, 0 – 4 bits
N: 1 – 2 linhas, 0 – 1 linha
F: 1 – 5x10 pontos, 0 – 5x8 pontos
BF: 1 – Ocupado, 0 – Dispon´ıvel
X: 1 – 2a linha, 0 – 1a linha
Coluna: nibble indicativo da coluna
Desenvolvimento da biblioteca
Cria¸
c˜
ao de rotinas de delay (2ms e 40us)
Fun¸
c˜
ao para enviar comandos
Fun¸
c˜
ao para enviar dados
Fun¸
c˜
ao de inicializa¸c˜
ao
3 #define RS 0 4 #define EN 1 5 #define RW 2 6 7 v o i d D e l a y 4 0 u s (v o i d) { 8 // p a r a um c r i s t a l de 8MHz c a d a i n s t r u ¸c ˜a o 9 // g a s t a 0 , 5 u s : 4 0 / 0 , 5 = 80 i n s t r u ¸c ˜o e s 10 u n s i g n e d c h a r i ; 11 // 3 + 3 ∗ 25 = 78 12 f o r( i =0; i < 2 5 ; i++) ; 13 } 14 15 v o i d D e l a y 2 m s (v o i d) { 16 u n s i g n e d c h a r i ; 17 f o r( i =0; i < 5 0 ; i++) 18 { 19 D e l a y 4 0 u s ( ) ; 20 } 21 }
2 B i t C l r ( PORTE , RS ) ; // comando 3 B i t C l r ( PORTE , RW ) ; // h a b i l i t a e s c r i t a 4 P O R T D = cmd ; 5 B i t S e t ( PORTE , EN ) ; // h a b i l i t a l e i t u r a 6 D e l a y 2 m s ( ) ; 7 B i t C l r ( PORTE , EN ) ; // t e r m i n a l e i t u r a 8 B i t C l r ( PORTE , RS ) ; // d e i x a em n´ıv e l b a i x o 9 B i t C l r ( PORTE , RW ) ; // d e i x a em n´ıv e l b a i x o 10 D e l a y 2 m s ( ) ; 11 } 12 v o i d E n v i a D a d o s (u n s i g n e d c h a r v a l o r ) { 13 B i t S e t ( PORTE , RS ) ; // d a d o s 14 B i t C l r ( PORTE , RW ) ; // h a b i l i t a e s c r i t a 15 P O R T D = v a l o r ; 16 B i t S e t ( PORTE , EN ) ; // h a b i l i t a l e i t u r a 17 D e l a y 4 0 u s ( ) ; 18 B i t C l r ( PORTE , EN ) ; // t e r m i n a l e i t u r a 19 B i t C l r ( PORTE , RS ) ; // d e i x a em n´ıv e l b a i x o 20 B i t C l r ( PORTE , RW ) ; // d e i x a em n´ıv e l b a i x o 21 D e l a y 4 0 u s ( ) ; 22 }
3 D e l a y 2 m s ( ) ; 4 D e l a y 2 m s ( ) ; 5 D e l a y 2 m s ( ) ; 6 D e l a y 2 m s ( ) ; 7 // c o n f i g u r a ¸c ˜o e s de d i r e ¸c ˜a o d o s t e r m i n a i s 8 B i t C l r ( TRISE , RS ) ; //RS 9 B i t C l r ( TRISE , EN ) ; //EN 10 B i t C l r ( TRISE , RW ) ; //RW 11 T R I S D = 0 x00 ; // d a d o s 12 A D C O N 1 = 0 b 0 0 0 0 1 1 1 0 ; 13 // c o n f i g u r a o d i s p l a y 14 E n v i a C o m a n d o ( 0 x38 ) ; // 8 b i t s , 2 l i n h a s , 5 x8 15 E n v i a C o m a n d o ( 0 x06 ) ; // modo i n c r e m e n t a l 16 E n v i a C o m a n d o ( 0 x0F ) ; // d i s p l a y , c u r s o r e b l i n k i n g ON 17 E n v i a C o m a n d o ( 0 x03 ) ; // z e r a c o n t a d o r e s i n t e r n o s 18 E n v i a C o m a n d o ( 0 x01 ) ; // l i m p a r d i s p l a y 19 E n v i a C o m a n d o ( 0 x80 ) ; // p o s i ¸c ˜a o i n i c i a l 20 }
1 #ifndef LCD_H 2 #define LCD_H 3 v o i d E n v i a C o m a n d o (u n s i g n e d c h a r cmd ) ; 4 v o i d E n v i a D a d o s (u n s i g n e d c h a r v a l o r ) ; 5 v o i d I n i c i a l i z a L C D (v o i d) ; 6 #endif //LCD H
2 #i n c l u d e " c o n f i g . h " 3 #i n c l u d e " lcd . h " 4 5 // i n i c i o do p r o g r a m a 6 v o i d m a i n (v o i d) 7 { 8 u n s i g n e d i n t i , j ; 9 c h a r msg [ ] = " H e l l o W o r l d ! "; 10 I n i c i a l i z a L C D ( ) ; 11 f o r( i =0; i <11; i++) 12 { 13 E n v i a D a d o s ( msg [ i ] ) ; 14 f o r( j = 0 ; j < 6 5 0 0 0 ; j++) ; 15 } 16 f o r( ; ; ) ; 17 }
Desenhando imagens no LCD
A maioria dos LCD’s permite a cria¸
c˜
ao de caracteres customizados
Para os displays compat´ıveis com a controladora HD44780:
8 caracteres dispon´ıveis
Formato bin´
ario e matricial de 8*5
Armazenados a partir do endere¸co 0x40
Os valores s˜
ao salvos por linha de caracter
Caracter 0
Caracter 2
...
Caracter 1
0x40
0x47
0x50
0x57
0x48
0x4F
Caracter 6
Caracter 7
0x70
0x77
0x78
0x7F
1a linha 3a linha 2a linha 4a linha 6a linha 5a linha 7a linha 8a linha 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57 0x04 0x0E 0x0E 0x0E 0x1F 0x0E 0x00 0x04Apenas 5 bits por linha!
1
2 // Cada l i n h a ´e r e p r e s e n t a d a p o r um c a r a c t e r
3 c h a r s i n o [ 8 ] =
4 {0 x04 , 0 x0E , 0 x0E , 0 x0E , 0 x0E , 0 x1F , 0 x00 , 0 x04 } ; 5 6 // C o n f i g u r a p a r a a p r i m e i r a p o s i ¸c ˜a o de mem´oria 7 E n v i a C o m a n d o ( 0 x40 ) ; 8 9 // E n v i a c a d a uma d a s l i n h a s em ordem 10 f o r( i =0; i <8; i++){ 11 E n v i a D a d o s ( s i n o [ i ] ) ; 12 }
´
E poss´ıvel criar um desenho/imagem de at´
e 40*16 pixels (4*2
caracteres)
A imagem ser´
a bin´
aria, apenas pixels brancos ou pretos
Existe uma separa¸c˜
ao entre os caracteres, que pode prejudicar de
certa maneira a imagem em quest˜
ao
Passos para gera¸c˜
ao de uma imagem:
1 - Criar uma imagem bin´
aria com o desenho desejado;
2 - Segmentar a imagem em retˆ
angulos de 8x5;
3 - Transcrever cada linha em bin´
ario/hexadecimal;
4 - Gerar o c´
odigo fonte.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0x01 0x01 0x03 0x03 0x03 0x03 0x01 0x0E 0x0E 0x0E 0x0E 0x08 0x08 0x08 0x08 0x1F 0x1F 0x1F 0x1F 0x18 0x18 0x18 0x18 0x18 0x18 0x1C 0x1C 0x11 0x11 0x00 0x00 0x00 0x00 0x00 0x1F 0x12 0x14 0x12 0x14 0x03 0x03 0x02 0x02 0x02 0x10 0x10 0x07 0x07
1 2 // Cada l i n h a ´e r e p r e s e n t a d a p o r um c a r a c t e r 3 c h a r u n i f e i [ 4 8 ] = { 4 0 x01 , 0 x03 , 0 x03 , 0 x0E , 0 x1C , 0 x18 , 0 x08 , 0 x08 , // 0 , 0 5 0 x11 , 0 x1F , 0 x00 , 0 x01 , 0 x1F , 0 x12 , 0 x14 , 0 x1F , // 0 , 1 6 0 x10 , 0 x18 , 0 x18 , 0 x0E , 0 x07 , 0 x03 , 0 x02 , 0 x02 , // 0 , 2 7 0 x08 , 0 x18 , 0 x1C , 0 x0E , 0 x03 , 0 x03 , 0 x01 , 0 x00 , // 1 , 0 8 0 x12 , 0 x14 , 0 x1F , 0 x08 , 0 x00 , 0 x1F , 0 x11 , 0 x00 , // 1 , 1 9 0 x02 , 0 x03 , 0 x07 , 0 x0E , 0 x18 , 0 x18 , 0 x10 , 0 x00 // 1 , 2 10 } ; 11 12 E n v i a C o m a n d o ( 0 x40 ) ; // C o n f i g u r a p a r a a p r i m e i r a p o s i ¸c ˜a o de mem´oria 13 // E n v i a c a d a uma d a s l i n h a s em ordem 14 f o r( i =0; i <48; i++){ 15 E n v i a D a d o s ( u n i f e i [ i ] ) ; 16 }