Битовая манипуляция, ascii с двоичным - PullRequest
0 голосов
/ 15 ноября 2018

Как применить битовую манипуляцию (И очистить, ИЛИ установить и, возможно, проверить XOR) к каждому биту в двоичном файле?То, что я хотел бы сделать, это ввести символ или строку и вывести сообщение в двоичном виде на определенный вывод на моем MCU.Я хочу использовать битовую манипуляцию, потому что создание функции для каждого символа в таблице ascii заняло бы много памяти на моем MCU.

Как до сих пор видно, что я установил вывод вывода и объявил каждый бит какПеременная.Имеет ли это смысл до сих пор?

void bits (void)
{
    #define RSTEST PORTBbits.RB5 //Declaring the port for serial
    #define RSOUT   TRISBbits.RB5 = 0 //Sets the port RB5 as an output

    unsigned int b0 = 0 ; // Binary 00000000
    unsigned int b1 = 0 ;
    unsigned int b2 = 0 ;
    unsigned int b3 = 0 ;
    unsigned int b4 = 0 ;
    unsigned int b5 = 0 ;
    unsigned int b6 = 0 ;
    unsigned int b7 = 0 ;

}

Причина, по которой я пытаюсь это сделать, заключается в том, что написание функции для каждого кода ASCII занимает много времени и занимает ненужное место в памяти.

void main(void)
{

      while (1)
    {
             RSTEST ; // same config as above
//           RSOUT = 1 ; // MSB
//           __delay_ms(10); 
//           RSOUT = 0 ; // START
//           __delay_us(25);
//           RSOUT = 0 ; // 1
//           __delay_us(25);
//           RSOUT = 1 ; // 2
//           __delay_us(25);
//           RSOUT = 0 ; // 3
//           __delay_us(25);
//           RSOUT = 1 ; // 4
//           __delay_us(25);
//           RSOUT = 0 ; // 5
//           __delay_us(25);
//           RSOUT = 0 ; // 6
//           __delay_us(25);
//           RSOUT = 1 ; // 7
//           __delay_us(25);
//           RSOUT = 0 ; // 8
//           __delay_us(25);
//           RSOUT = 1 ; // STOP
//           
//           RSOUT = 1 ; // MSB
//           __delay_ms(10); 
//           RSOUT = 0 ; // START
//           __delay_us(25);
//           RSOUT = 0 ; // 1
//           __delay_us(25);
//           RSOUT = 0 ; // 2
//           __delay_us(25);
//           RSOUT = 0 ; // 3
//           __delay_us(25);
//           RSOUT = 0 ; // 4
//           __delay_us(25);
//           RSOUT = 1 ; // 5
//           __delay_us(25);
//           RSOUT = 1 ; // 6
//           __delay_us(25);
//           RSOUT = 0 ; // 7
//           __delay_us(25);
//           RSOUT = 0 ; // 8
//           __delay_us(25);
//           RSOUT = 1 ; // STOP
//           
//           RSOUT = 1 ; // MSB
//           __delay_ms(10); 
//           RSOUT = 0 ; // START
//           __delay_us(25);
//           RSOUT = 1 ; // 1
//           __delay_us(25);
//           RSOUT = 0 ; // 2
//           __delay_us(25);
//           RSOUT = 1 ; // 3
//           __delay_us(25);
//           RSOUT = 0 ; // 4
//           __delay_us(25);
//           RSOUT = 0 ; // 5
//           __delay_us(25);
//           RSOUT = 0 ; // 6
//           __delay_us(25);
//           RSOUT = 1 ; // 7
//           __delay_us(25);
//           RSOUT = 0 ; // 8
//           __delay_us(25);
//           RSOUT = 1 ; // STOP

    }
}

Всеэти строки просто для печати JOE.

Могу ли я просто что-то похожее на printf ("JOE");

Я не хочу использовать аппаратное обеспечение TX и Rx EUSART, но программное обеспечение EUSART.

1 Ответ

0 голосов
/ 15 ноября 2018

Я думаю, вам нужна такая функция, сначала используйте MSB:

#define MSB 1
#define LSB 0

void out_char(char character, char bit_order){

  uint8_t i = 0;
  RSOUT = 1 ; // MSB
  __delay_ms(10); 
  RSOUT = 0 ; // START
  __delay_us(25);
  for (i = 8; i>0; --i){
      if (bit_order){
        RSOUT = (character & 0x80) ? 1:0;
        character <<= 1;
      } else {
        RSOUT = (character & 0x01);
        character >>= 1;
      }
      __delay_us(25);
  }
  RSOUT = 1 ; // STOP

}

void out_str(char * string, uint8_t len, char bit_order){
  uint8_t i = 0;
  for (i = 0; i< len; i++){
    out_char(string[i], bit_order);
  }
}

out_str("Hello world",11, MSB); // 'H' 0x48 will be '0-1-0-0-1-0-0-0'    
out_str("Hello world",11, LSB); // 'H' 0x48 will be '0-0-0-1-0-0-1-0'
...