Dekódování znaků

K tomu co píše Mahoney a jeho kámoš mohu jen poznamenat, že dokud jsem nezačal používat 32bity, kde píšu výhradně v C, tak na x51 jsem krátké, ale časově kritické kousky kódu psal v ASM (tak 1-5%) a zbytek v C a tím jsem vyždímal z MCU maximum. Pokud ale někomu stagnace vyhovuje… :wink:

Myslím, že nebude, tak hloupej, aby používal všude to Macro. Macro stačí vložit 1x do subrutiny a pak už je tam kde je třeba jí volat CALL/RET.

Co se týče dekodování šel bych přes strukturovanou tabulku:
KOD karty, NEXT (offsetem),JMENO : (5+1+X) a pokud se omezí délka jména třeba na 18 znaků, tak je to 24B na kartu při 50 kartách = max.1200 B.
Pokud budou řazené podle kodu dá se hledání částečně zoptimalizovat např podle prvních 1 nebo 2 B kodu karty - za určitých podmínek to může ušetřit jak čas tak paměť.

Ahoj všichni. Jsem docela překvapen, jak se to tady “rozjelo”. Ale jak jsem psal výše, pořešil jsem vše v asm, protože Céčku to prozatím nedávám, ale čeká mě to!!!
Dekódování 5B ID se trochu scvrklo, protože 1B má jen dvě možnosti (87 nebo 43). 2B je vždy 00. Jejich ověření je tudíž na pár řádků. Začne to “houstnout” od 3B. Zde je tabulka největší. LCD je 2 x 8 znaků, aby texty nebyly tak dlouhé.
Co se týká makra pro volání zobrazení na LCD, používám toto:
;-----------------------------------
LCDout MACRO LCDout
MOVLW LCDout
PAGESEL WR_DATA
CALL WR_DATA
ENDM

LCDW MACRO LCDW
PAGESEL WR_CMD
CALL WR_CMD
ENDM
;-----------------------------------
Vlastní volání zobrazení je následující a pro LCD 2 x 8 znaků:
;-----------------------------------
PAGESEL CLS_LINE1
CALL CLS_LINE1

LCDout	'P'
    ...
    ...

RETURN

;-----------------------------------

Myslím si, že je to kratší než použít tohle:

;-----------------------------------

PAGESEL	C_LCD
CALL	C_LCD		; volej podprogram C_LCD - vynuluj LCD

CALL	LINE1		; nastav kurzor na prvni pozici radku 1

MOVLW	'P'		; vloz znak do LCD
CALL	WR_DATA	; volej podprogam WR_DATA, zapis data do LCD
    ...
    ...
RETURN

;-----------------------------------

Ještě jednu informaci o formátu karet. Zkoušel jsem je číst na 3 různých čtečkách a pokaždé byl hexa string tototžný. Lišily se jen drobnosti, jako start bit nebo něco navíc či méně, např. chybělo CRC. Avšak kódy, které jsem dostal z docházkového systému, byly naprosto odlišné, tudíž mi to nefungovalo. Po konzultacích s kolegy od docházkového SW, mi je převedli do fyzického tvaru, tak jak jsou na jedntlivých kartách a jede to.