HOME      PROJETOS      PROGRAMAÇÃO     

Serviços de String para a Família 18F



Este serviço fornece funções para tratamento de strings em programação assembler para microcontroladores da família 18F.

No arquivo de distribuição do serviço, "string_services.inc", estão definidos os microcontroladores suportados:

_SS_PROCESSOR_ SET 0 IFDEF __18F2550 _SS_PROCESSOR_ SET 18 ENDIF IFDEF __18F4520 _SS_PROCESSOR_ SET 18 ENDIF IFDEF __18F4550 _SS_PROCESSOR_ SET 18 ENDIF IFDEF __18F4620 _SS_PROCESSOR_ SET 18 ENDIF IF _SS_PROCESSOR_ == 18

Se o microprocessador utilizado no seu projeto não consta desta lista, inclua no arquivo "string_services.inc", um grupo de comandos IFDEF / ENDIF para identificá-lo.




FUNÇÕES

CLC Compara duas strings na memória RAM
CLI Compara uma string na memória com uma cadeia de caracteres
COPYSTR Copia uma cadeia de caracteres formando uma string na memória
DLMSET Especifica o delimitador de strings
FIND Procura um caracter dentro de uma string na memória
LDW Carrega W com o primeiro caracter de uma string na memória
MVC Move uma string de um local para outro da memória RAM
STRINGFY Converte uma cadeia de caracteres numa string
SUBSTR Procura uma sbstring nam memória dentro de uma string na memória
SUBSTRI Procura uma cadeia de caracteres dentro de uma string na memória

Para usar o serviço, deve-se incluir no programa o arquivo "string_services.inc".

Este serviço trabalha com strings na memoria RAM do microcontrolador com o seguinte formato:

+----+----+----+----+-s s---+----+----+ | LL | cc | cc | cc | | cc | DL | +----+----+----+----+-s s---+----+----+ onde: LL ..... e' o tamanho da string. cc ..... sao os caracteres da string. DL ..... é o carater delimitador definido previamente pela macro DLMSET


Menu de FunçõesTopo da Página







Como usar o Serviço de Strings

Primeiramente, deve-se definir os registradores necessários para o serviço:

UDATA 0x080 str_dlm RES 1 str_reg1 RES 1 str_reg2 RES 1 str_reg3 RES 1 str_reg4 RES 1 str_reg5 RES 1 str_reg6 RES 1 str_ptr RES 1 str_buffer EQU 0x??? ; buffer auxiliar

O registrador str_dlm conterá o código do caracter delimitador de strings.

Os registradores str_reg1 a str_reg6 são registradores de trabalho.

O registrador str_ptr é um apontador usado pelas macros SUBSTR e SUBSTRI para conter o deslocamento de uma substring dentro da string.

O registrador str_buffer pode ser definido em qualquer banco de memória RAM do microcontrolador enquanto os demais devem ser definido no banco default (0x080).

Uma vez definidos os registradores, podemos começar trabalhar com as strings. Por exemplo, para gerar uma string com um certo conteúdo, primeiramente definimos um espaço para contê-la na RAM do microcontrolador:

fruta RES .12 cor RES .12


Em seguida, na área de código de programa, devemos definir o delimitador de strings que será usado marcar o fim das strings. A definição do delimitador deve ser feita uma única vez no programa. Para definir o delimitador de strings, usa-se a macro e DLMSET conforme abaixo:

DLMSET 0x0D ; delimitaldor

Usaremos agora a macro COPYSTR para carregarmos os valores dentro das strings definidas:

COPYSTR fruta, "banana" COPYSTR cor, "amarela"

Após a execução das macros COPYSTR acima, as localizações de memória fruta e cor ficarão com o seguintes formatos:

fruta 0x0662616D616D610D00000000 cor 0x07616C6171656B610D000000

A partir deste ponto pode-se usar outras macros como e SUBSTR, SUBSTRI e FIND para fazer pesquisas ou CLC e CLI para comparações.


Menu de FunçõesTopo da Página







MACRO INSTRUÇÕES

As funções de tratamento de strings são usadas através de Macro Instruções que, por sua vez, fazem chamadas às subrotinas do serviço. A seguir passamos a descrever as Macro Instruções que fazem parte do serviço.


FUNÇÕES:    CLC,    CLI,    COPYSTR,    DLMSET,    FIND,    LDW,    MVC,    STRINGFY,    SUBSTR,    SUBSTRI



Menu de FunçõesTopo da Página







CLC <string1>, <string2>

A macro CLC compara a string <string1> com a <string2>, ambas na memoria RAM.

Após a comparação, o flag Z do registrador STATUS conterá um dos seguintes valores:

  • Z=0 ............... as strings são diferentes
  • Z=1 ............... as strings são iguais

Exemplo:

ram400 UDATA 0x400 nome1 res .32 nome2 res .32 DLMSET 0x0D COPYSTR nome1,"abcdefghi" COPYSTR nome2,"ABCDEFGHI" CLC nome1, nome2 BZ iguais BNZ diferentes . . . iguais nop . . . diferentes nop . . .


Menu de FunçõesTopo da Página







CLI <string1>, <"string2">

A macro CLI compara a string <string1> na memória RAM com a string <"string2"> inline na macro.

Após a comparação, o flag Z do registrador STATUS conterá um dos seguintes valores:

  • Z=0 ............... as strings são diferentes
  • Z=1 ............... as strings são iguais

Exemplo:

ram400 UDATA 0x400 nome res .32 DLMSET 0x0D COPYSTR nome,"Pafuncio Silva" CLI nome,"Pafuncio Silva" BZ iguais BNZ diferentes . . . iguais nop . . . diferentes nop . . .


Menu de FunçõesTopo da Página







COPYSTR <endereco>, <"string">

A macro COPYSTR copia e formata a string <"string"> inline na macro para a localização <endereco> na memória RAM do PIC.

Uma string pode conter no máximo 255 bytes.

A localização de memoria <endereco> receberá a string <"string"> e será configurada com o formato "Lcccc......ccD", onde:

  • L ......... é o tamanho da string (máximo 255)
  • 'cccc...cc' são os caracteres da string
  • D ......... é o delimitador definido previamente pela macro DLMSET

Após a execução da macro o flag Z do registrador STATUS poderá conter um dos seguintes valores:

  • Z=1 ........ string criada com sucesso
  • Z=0 ........ string excedeu o tamanho limite

Exemplo:

RAM400 UDATA 0x400 nome res .32 endereco res .32 telefone res .16 DLMSET 0x0D COPYSTR nome,"Pafuncio Silva" COPYSTR endereco,"RUA Mileva,16" COPYSTR telefone,"(11)24354-9845"


Menu de FunçõesTopo da Página







DLMSET <dlm>

A macro DLMSET especifica o delimitador de strings <dlm> que será usado pelos serviço de strings para identificar o fim de uma string na memória RAM.

Exemplo:

DLMSET 0x0D ; delimitador


Menu de FunçõesTopo da Página







FIND <str>, <char>

A macro FIND procura o caracter <char> dentro da string <str> ligando o flag Z do registrador STATUS se o caracter foi encontrado ou desligando o flag Z do registrador STATUS se o caracter não foi encontrado.

Exemplo:

UDATA 0x80 cor RES .16 ; buffer . . COPYSTR cor, "azul" ; copia "azul" p/ o buffer FIND cor, "z" ; procura bz achou ; se achou desvia . ; senao, fica aqui . . naoachou . . achou . .


Menu de FunçõesTopo da Página







LDW <str>

A macro LDW carrega o registrador W com o primeiro caracter de uma string localizada na posição <str> da RAM.

O primeiro caracter da string, localizado após o byte de tamanho, será apontado pelo registrador FSR0 e, em seguida, carregado no registrador W. Após a carga, o registrador FSR0 ficará apontando para a próxima posição na string. Se o registrador FSR0 for usado para outro propósito após a execução desta macro, o apontador será perdido.

No exemplo abaixo, se a localização nome contiver "8Setembro", sendo 8 o tamanho da string, conforme o formato recomendado, após a execução da macro o registrador W conterá o valor "S".

LDW nome


Menu de FunçõesTopo da Página







MVC <origem>, <len>, <destino>, <opt>

A macro MVC move uma string localizada em <origem> na RAM PIC, com tamanho <len>, para a localização <destino>, também na RAM do PIC. A macro MVC usa os registradores FSR0 e FSR1.

Se desejar que a macro MVC salve os registradores FSR0 e FSR1 no stack de software, a opção <opt> deve ser codificada com o valor STAK, caso contrário, NOSTACK deve ser codificado. Ao usar a opção STAK, os registradores FSR0 e FSR1 serão salvos no stack no início da execução da macro serão restaurados com seus valores originais ao final da execução. Note que, para usar o stack de software, será preciso incluir no programa o arquivo stack_services.inc e seguir as orientações do Serviço de Stack de Software para poder usá-lo.

O exemplo abaixo mostra como mover uma string de 12 caracteres, iniciada na posição "msg001" da RAM para a posição "msg002" sem que os registradores FSR0 e FSR1 sejam salvos no stack.

MVC msg001, .12, msg002, NOSTACK


O exemplo abaixo mostra como mover uma string de 12 caracteres, iniciada na posição "msg001" da RAM para a posição "msg002" salvaldo os registradores FSR0 e FSR1 no stack.

MVC msg001, .12, msg002, STACK


Menu de FunçõesTopo da Página







STRINGFY <origem>, <destino>

A macro STRINGFY copia uma string iniciada na localização <origem> para a localização <destino>, inserindo o tamanho e o delimitador da string original. Esta macro serve para converter cadeias de caracteres para o formato de string recomendado para o serviço de strings.

A string em <origem> deve ser delimitada com o delimitador especificado pela macro DLMSET e deve apresentar o formato. "ccccc..ccccD" onde "c" são os caracteres da string "D" é o delimitador.

Após a execução da macro STRINGFY, a localização <destino> conterá uma string no formato "Lccccc..ccccD" onde "L" será o byte de tamanho, "c" são os caracteres da string e "D" é o delimitador.


Menu de FunçõesTopo da Página







SUBSTR <str>, <sub_str>

A macro SUBSTR procura a substring <sub_str> dentro da string <str>.

A string e a substring já devem estar previamente definidas na RAM do microcontrolador.

Após a procura os flags do registrador STATUS serao posicionados da seguinte maneira:

  • Z=0 ............... substring não encontrada.
  • Z=1 ............... substring encontrada.
  • N=1 ............... a substring maior do que a string.

Além disso, se a substring foi encontrada, o registrador str_ptr conterá a posição da substring dentro da string.

Exemplo:

UDATA 0x80 nome1 res .32 nome2 res .32 DLMSET 0x0D COPYSTR nome1,"Jose Antonio Feliz" COPYSTR nome2,"Feliz" SUBSTR nome1, nome2 bz achou . . . achou movf str_ptr, w . . .


Menu de FunçõesTopo da Página







SUBSTRI <str>, <"sub_str">

A macro SUBSTRI procura a substring <"sub_str">, inline na macro, dentro da string <str> na memória RAM do PIC.

Após a procura os flags do registrador STATUS serão posicionados da seguinte maneira:

  • Z=0 ............... substring não encontrada.
  • Z=1 ............... substring encontrada.
  • N=1 ............... a substring maior do que a string.

Além disso, se a substring foi encontrada, o registrador str_ptr conterá a posição da substring dentro da string.

Exemplo:

UDATA 0x80 nome1 res .32 DLMSET 0x0D COPYSTR nome1,"Jose Antonio Feliz" SUBSTRI nome1, "Feliz" bz achou . . . achou movf str_ptr . . .


Menu de FunçõesTopo da Página















H P S P I N

Desde 04 de Março de 2010

Atualização: 23 de Apr de 2024