Значения 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