Contenido>Indice>Intro CursoC51

FUNCIONES ESPECIALES PARA BITS


La necesidad de utilizar máscaras para comprobar el estado de un bit en char e ints, en las antiguas versiones de C51 resultaba frustrante para los programadores en lenguaje ensamblador, teniendo en cuenta que el 8051 dispone de un buen conjunto de instrucciones en ensamblador para acceder a bits individuales. Sin embargo, desde la versión 3 de C51, es posible hacer que determinadas variables residan en el área direccionable a nivel bit (D:0x20 a D:0x2F),  donde es posible utilizar las instrucciones de bit del 8051.

Un ejemplo es la comprobación del signo de un char.

Aquí el char se declara como "bdata":
   char bdata test_char ;
   sbit sign_bit = test_char ^ 7 ;

para usarlo así:
   test_char = counter ;
   if(sign_bit==1) { /* test_char es negativo */ }
las instrucciones a ejecutar son:
   MOV   A,counter    ;
   MOV   test_char,A  ;
   JNB   0,HECHO      ;
     /* Negativo */

lo que resulta mucho más rápido que utilizar máscaras e instrucciones AND. La palabra bdata informa a C51 y L51 que la variable debe ubicarse en el área RAM direccionable como bit y como byte. La sentencia "sbit sign_bit = test_char ^ 7" le dice a C51 que el bit llamado sign_bit residirá en la posición 7 del byte test_char.

Número de Byte: test_char           20H    Inicio del área BDATA
Número de Bit:  0,1,2,3,4,5,6,7<_ sign_bit
Número de Byte:                     21H 
Número de Bit:  8,9,10,11,12,13,14,15 
Número de Byte:                     22H 
Número de Bit:  16,17,18,19,20,21,22,23,24.....

La situación con los int es algo más complicada debido a que el 8051 no almacena los objetos como en principio se espera. El 8051 guarda el byte de mayor peso de un int en la dirección más baja. Por ello, el bit 7 es el bit de mayor peso del byte más significativo, y el bit 15 es el bit de mayor peso del byte menos significativo.

Número de byte: test_int(high)          20H    
Número de bit:  0,1,2,3,4,5,6,7 
 
Número de byte: test_int+1(low)         21H 
Número de bit:  8,9,10,11,12,13,14,15
  

   Contenido>Indice>Intro CursoC51