NUM EQU 30h ; liczba 8-bitowa CNT EQU 31h ; licznik bitów ONES EQU 32h ; liczba jedynek TEMP EQU 33h ; zmienna tymczasowa LED EQU P1.7 BUZZ EQU P1.5 AJMP START ORG 100H ;------------------------------------------------- START: LCALL LCD_CLR CLR LED CLR BUZZ MOV NUM,#0 MOV CNT,#0 MOV ONES,#0 ;========== WCZYTYWANIE BITÓW ========== READ_LOOP: LCALL WAIT_KEY ; A = ASCII CJNE A,#0Dh,CHK_BIT ; Enter? SJMP PROCESS ; Koniec wprowadzania CHK_BIT: CJNE A,#'0',CHK_ONE ; Sprawdź czy '0' SJMP BIT_ZERO CHK_ONE: CJNE A,#'1',READ_LOOP ; Jeśli nie '1', ignoruj i czekaj dalej SJMP BIT_ONE BIT_ZERO: CLR C MOV A,NUM RLC A ; Przesunięcie w lewo z 0 MOV NUM,A INC CNT SJMP CNT_CHECK BIT_ONE: SETB C MOV A,NUM RLC A ; Przesunięcie w lewo z 1 MOV NUM,A INC CNT CNT_CHECK: MOV A,CNT CJNE A,#8,READ_LOOP ; Jeśli nie 8 bitów, czytaj dalej ; Jeśli 8 bitów - przetwarzaj ;========== PRZETWARZANIE ========== PROCESS: LCALL LCD_CLR MOV A,NUM JNZ NONZERO ;========== NUM = 0 ========== ZERO_CASE: ; Linia 1: 00000000B MOV R0,#8 ZERO_LOOP: MOV A,#'0' LCALL WRITE_DATA DJNZ R0,ZERO_LOOP MOV A,#'B' LCALL WRITE_DATA ; Linia 2: PRESS ANY KEY LCALL LCD_LINE2 MOV DPTR,#TXT_PRESS LCALL WRITE_TEXT LCALL WAIT_KEY AJMP START ;========== NUM ≠ 0 ========== NONZERO: ; --- Zlicz jedynki w NUM --- MOV A,NUM MOV R1,#8 MOV ONES,#0 COUNT_ONES: RLC A JNC NO_ONE INC ONES NO_ONE: DJNZ R1,COUNT_ONES ; --- Wyświetl binarnie w linii 1 --- MOV A,NUM MOV TEMP,A ; Zachowaj NUM MOV R0,#8 BIN_LOOP: MOV A,TEMP RLC A MOV TEMP,A ; Zapisz przesunięte JC PRINT1 MOV A,#'0' SJMP PRINTB PRINT1: MOV A,#'1' PRINTB: LCALL WRITE_DATA DJNZ R0,BIN_LOOP MOV A,#'B' LCALL WRITE_DATA ; --- Sprawdź parzystość jedynek --- MOV A,ONES ANL A,#01h JZ EVEN_ONES ODD_ONES: SETB BUZZ ; Nieparzysta liczba jedynek -> brzęczyk CLR LED SJMP SHOW_END EVEN_ONES: SETB LED ; Parzysta liczba jedynek -> LED CLR BUZZ SHOW_END: ; Linia 2: PRESS ANY KEY LCALL LCD_LINE2 MOV DPTR,#TXT_PRESS LCALL WRITE_TEXT LCALL WAIT_KEY AJMP START ;------------------------------------------------- TXT_PRESS: DB 'PRESS ANY KEY',0 END