Jump to content
PsySc0rpi0n

Matriz bi-dimensional - aceder a posição específica

Recommended Posts

PsySc0rpi0n

Bom dia!

 

Há algum tempo que não vinha aqui chatear! Bom, cá vai!

Tenho uma matriz bi-dimensional quem tem um mapa com custom chars que vai servir para criar uma letra grande num LCD  Esta letra grande vai ocupar 5 colunas e 4 linhas, tipo quando juntamos várias televisões para obter uma imagem grande a partir de partes dessa imagem grande em cada televisão.

A matriz está declarada da seguinte maneira:

static const PROGMEM unsigned char customCharMap[20][8]{
	{......},
	{......},
	.
	.	
	.
	{......}
}

Ou seja, esta variável contém 20 caracteres especiais, cada um constituído por 8 bytes

Depois tenho uma função para guardar esta variável numa área especial de memória do LCD, denominada CGRAM.

O problema é que esta memória só tem espaço para 64 bytes! Ou seja, só posso gravar 8 custom chars de cada vez, dos 20 que constituem a letra grade final, usá-los e depois gravar outros 8 e assim sucessivamente até completar a letra final.

Para simplificar, e como a letra final tem 5 colunas e 4 linhas, vou gravar apenas 5 custom chars de cada vez na tal CGRAM do LCD e depois imprimi-los nos LCD. Depois gravo os seguintes 5 custom chars na CGRAM e volto a imprimi-los no LCD na linha seguinte e assim sucessivamente até ter a letra final completa!

 

Algo como isto:

1º - Gravar 5 custom chars na CGRAM

2º - Imprimi-los na linha 0 do LCD

3º - Gravar os 5 custom chars seguintes na CGRAM em cima dos anteriores

4º - Imprimi-los na linha 1 do LCD

5º - Gravar os 5 custom chars seguintes na CGRAM em cima dos anteriores

6º - Imprimi-los na linha 2 do LCD

7º - Gravar os últimos 5 custom chars na CGRAM em cima dos anteriores

8º - Imprimi-los na linha 3 do LCD

 

Agora o código.

Tenho uma função para gravar um custom char na CGRAM que é a seguinte

void writeCustomChar(static const PROGMEM unsigned char *customChar, uint8_t customCharOffset){

   lcd_command(_BV(LCD_CGRAM));  /* set CG RAM start address 0*/

   for (uint8_t i = customCharOffset; i < customCharOffset + 5; i++){
      for(uint8_t j = 0; j < 8; j++)
         lcd_data(pgm_read_byte_near(&customChar[i][j]));
   }
}

As minhas dúvidas estão apenas relacionadas com os tipos de dados da matriz bi-dimensional e os tipos de dados enviados para esta função. Por outras palavras, ponteiros!

Ou seja, não sei se a passagem de parâmetros por referência está correcta.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites
PsySc0rpi0n

Já obtive solução:

c const PROGMEM unsigned char customChar[][8], uint8_t customCharOffset){

   lcd_command(_BV(LCD_CGRAM));  /* set CG RAM start address 0*/

   for (uint8_t i = customCharOffset; i < customCharOffset + 5; i++){
      for(uint8_t j = 0; j < 8; j++)
         lcd_data(pgm_read_byte_near(&customChar[i][j]));
   }
}

 

E a chamar a função e a passar o parâmetro é:

writeCustomChars(customChars, i);

 

Mas queria uma explicação de porque é que não pode ser de outra maneira.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.