Значения RFID RDM6300 в двоичном виде в 8051 с использованием наименьшего количества переменных

Я изучаю формат данных, которые считывает мой картридер при сканировании карты. Формат подробно здесь: http://wiki.seeedstudio.com/125Khz_RFID_module-UART/

Но часть, над которой я хочу работать сейчас, это обработка фактических данных.

Давайте предположим, что "convert" является основной функцией, и R1 в настоящее время настроен на адрес первого байта данных RFID-данных.

Основываясь на литературных источниках, выясняется, что каждый байт на самом деле представляет собой закодированное значение полубайта следующим образом:

Если шестнадцатеричное значение начинается с 3 и заканчивается числом, то фактическим значением является сама эта цифра. Пример: 34h = 4.

Если шестнадцатеричное значение начинается с 4 и заканчивается числом от 1 до 6, то фактическое значение рассчитывается путем удаления начального 4 и превращения последнего числа в соответствующую букву алфавита. Пример: 41h = A. 42h = B .... 46h = F.

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

convert:
    mov A,@R1 ;load data byte received
    acall rfidasctohex ;convert to nibble hex
    swap A             ;put it in high position
    mov R6,A           ;save to R6
    inc R1              ;advance pointer
    mov A,@R1           ;load next data byte
    acall rfidasctohex  ;convert to nibble hex
    orl A,R6            ;merge the hex values into one byte
    mov @R0,A           ;store it to output
ret

rfidasctohex:
    cjne A,#41h,ne40 ;see if received character is 41h
    ;it is.. so carry = 0
    ne40:
    jc nlarge 
        subb A,#7h ;carry wasn't set which means value is > 41h so subtract 7 from result
                  ;to get value Ah - Fh
        setb C     ;set carry flag
    nlarge:     ;here carry flag is set regardless
    subb A,#2Fh ;subtract 2Fh + 1h from result
    jnc isnumok ;see if number is too low
        clr A       ;input number is < 30h so its too low
    isnumok:
    anl A,#0Fh ;return resulting value or 0 if number is too low
ret

0 ответов

Другие вопросы по тегам