; ; IMP laborator c. 2 ; HC08 ports, LEDs, 12-button keyboard ; https://www.fit.vutbr.cz/study/courses/IMP/private/VYUKA/CVICENI_A_LABORATORE/lab2/ ; ak.r. 2008/2009 ; ; ----------------------------------------------------------------------------- ; export symbols XDEF Entry ; export 'Entry' symbol ABSENTRY Entry ; for absolute assembly: mark this as application entry point ; include derivative specific macros Include 'derivative.inc' ; ----------------------------------------------------------------------------- VectorStart EQU $FFDA ; start address of interrupt vectors table ; ----------------------------------------------------------------------------- ORG RAMStart ; variable/data section entered_code ds.b 64 app_running_tag ds.b 1 ORG ROMStart ; code section ; ----------------------------------------------------------------------------- ; application starts here after HC08 is reseted Entry: cli ; enable interrupts mov #$01,CONFIG1 ; disable Computer Operating Properly (COP) Module jsr Init_SCI ; init Serial Communication Interface (SCI) Module jsr Init_ButtonRelated_Ports ; init button-related ports clrh clrx lda #$FF sta app_running_tag ; zapni priznak bezici aplikace (1...1) ; ----------------------------------------------------------------------------- ;************************* ; hlavni smycka aplikace * ;************************* btn_test_loop: ;--------------------------- ;Column1 | Column2 | Column3 ;--------------------------- ;--------------------------- ; 1 | 2 | 3 | <- btn_value (associated character) ; SA7 | SA8 | SA9 | <- btn_ID ;--------------------------- ; 4 | 5 | 6 | ; SA4 | SA5 | SA6 | ;--------------------------- ; 7 | 8 | 9 | ; SA1 | SA2 | SA3 | ;--------------------------- ; * | 0 | # | ; SA10 | SA11 | SA12 | ;--------------------------- jsr testColumn1 ; testuj tlacitka v levem sloupci: podprogram HOTOV jsr testColumn2 ; testuj tlacitka v prostrednim sloupci: ### DOPLNIT KOD podprogramu ! ### jsr testColumn3 ; testuj tlacitka v pravem sloupci: ### DOPLNIT KOD podprogramu ! ### jsr BlinkVL2_red ; probliknuti cervene LED (VL2) ; detekce priznaku pozadavku na ukonceni aplikace psha lda app_running_tag pula beq end_loop ; je-li priznak==0, pak pozadavek na konec aplikace vznikl -> skoc na end_loop jmp btn_test_loop; jinak aplikace bezi dale ; ----------------------------------------------------------------------------- end_loop: jsr LightOnVL1_green ; ### DOPLNIT KOD do podprogramu bra end_loop ;********************************************* ; podprogramy pro test tlacitek ve sloupcich * ;********************************************* ; ----------------------------------------------------------------------------- ; testuj tlacitka v levem sloupci, tj. tlacitka SA7, SA4, SA1, SA10 ; ----------------------------------------------------------------- ; nebylo-li stisknuto tlacitko z tohoto sloupce pak skonci, ; tj. umozni test stavu tlacitek z prostredniho sloupce (Column2) testColumn1: mov #$30,PTC ; -> PTC6 = 0, PTC5 = PTC4 = 1, ostatni PTCi = 0 lda PTD psha and #$F0 ; maskuj PTD-bity 7-4 (PTDi bit je 0 je-li prislusne tlacitko stisknuto) eor #$F0 ; chceme aby "PTDi byl 1 je-li prislusne tlacitko stisknuto" a proto invertujeme bity pula beq testColumn1_end ; v levem sloupci nebylo zjisten pokus o stisk tlacitka -> testuj prostredni sloupec ; nektere z tlacitek v levem sloupci bylo stisknuto - zjisti ktere a proved prislusnou akci ; (pozn.: nize se v danem okamziku predpoklada stisk nejvyse jednoho tlacitka; ; obsluha soucasneho stisku vice tlacitek resena prioritami) brset 4,PTD,SA7_depressed ; SA5 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA7; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 4,PTD,SA7_depressed lda #'1' ; SA8 (znak '1') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn1_end SA7_depressed: brset 5,PTD,SA4_depressed ; SA4 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA4; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 5,PTD,SA4_depressed lda #'4' ; SA4 (znak '4') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn1_end SA4_depressed: brset 6,PTD,SA1_depressed ; SA1 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA1; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 6,PTD,SA1_depressed lda #'7' ; SA1 (znak '7') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn1_end SA1_depressed: brset 7,PTD,SA10_depressed; SA10 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA10; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 7,PTD,SA10_depressed lda #'*' ; SA10 (znak '*') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn1_end SA10_depressed: testColumn1_end: rts ; ----------------------------------------------------------------------------- ; testuj tlacitka v prostrednim sloupci, tj. tlacitka SA8, SA5, SA2, SA11 ; ----------------------------------------------------------------------- ; nebylo-li stisknuto tlacitko z tohoto sloupce pak skonci, ; tj. umozni test stavu tlacitek z praveho sloupce (Column3) testColumn2: mov #$50,PTC ; -> PTC6 = 0, PTC5 = PTC4 = 1, ostatni PTCi = 0 lda PTD psha and #$F0 ; maskuj PTD-bity 7-4 (PTDi bit je 0 je-li prislusne tlacitko stisknuto) eor #$F0 ; chceme aby "PTDi byl 1 je-li prislusne tlacitko stisknuto" a proto invertujeme bity pula beq testColumn2_end ; v levem sloupci nebylo zjisten pokus o stisk tlacitka -> testuj prostredni sloupec ; nektere z tlacitek v levem sloupci bylo stisknuto - zjisti ktere a proved prislusnou akci ; (pozn.: nize se v danem okamziku predpoklada stisk nejvyse jednoho tlacitka; ; obsluha soucasneho stisku vice tlacitek resena prioritami) brset 4,PTD,SA8_depressed ; SA7 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA7; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 4,PTD,SA8_depressed lda #'2' ; SA7 (znak '1') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn2_end SA8_depressed: brset 5,PTD,SA5_depressed ; SA4 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA4; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 5,PTD,SA5_depressed lda #'5' ; SA4 (znak '4') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn2_end SA5_depressed: brset 6,PTD,SA2_depressed ; SA1 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA1; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 6,PTD,SA2_depressed lda #'8' ; SA1 (znak '7') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn2_end SA2_depressed: brset 7,PTD,SA11_depressed; SA10 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA10; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 7,PTD,SA11_depressed lda #'0' ; SA10 (znak '*') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn2_end SA11_depressed: testColumn2_end: rts ; ----------------------------------------------------------------------------- ; testuj tlacitka v pravem sloupci, tj. tlacitka SA9, SA6, SA3, SA12 ; ----------------------------------------------------------------- ; nebylo-li stisknuto tlacitko z tohoto sloupce pak skonci, ; tj. umozni test stavu tlacitek z leveho sloupce (Column1) ; po stisku SA12 nastavte priznak app_running_tag na 0 testColumn3: mov #$60,PTC ; -> PTC6 = 0, PTC5 = PTC4 = 1, ostatni PTCi = 0 lda PTD psha and #$F0 ; maskuj PTD-bity 7-4 (PTDi bit je 0 je-li prislusne tlacitko stisknuto) eor #$F0 ; chceme aby "PTDi byl 1 je-li prislusne tlacitko stisknuto" a proto invertujeme bity pula beq testColumn3_end ; v levem sloupci nebylo zjisten pokus o stisk tlacitka -> testuj prostredni sloupec ; nektere z tlacitek v levem sloupci bylo stisknuto - zjisti ktere a proved prislusnou akci ; (pozn.: nize se v danem okamziku predpoklada stisk nejvyse jednoho tlacitka; ; obsluha soucasneho stisku vice tlacitek resena prioritami) brset 4,PTD,SA9_depressed ; SA7 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA7; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 4,PTD,SA9_depressed lda #'3' ; SA7 (znak '1') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn3_end SA9_depressed: brset 5,PTD,SA6_depressed ; SA4 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA4; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 5,PTD,SA6_depressed lda #'6' ; SA4 (znak '4') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn3_end SA6_depressed: brset 6,PTD,SA3_depressed ; SA1 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA1; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 6,PTD,SA3_depressed lda #'9' ; SA1 (znak '7') bylo skutecne stisknuto jsr Store_and_Send_char bra testColumn3_end SA3_depressed: brset 7,PTD,SA12_depressed; SA10 nestisknuto -> testuj dalsi tlacitko ve sloupci jsr DelayB ; pravdepodobne bylo stisknuto SA10; chvili pockej (az zaniknou pripadne zakmity tlacitka), pak testuj znovu na stisk brset 7,PTD,SA12_depressed lda #'#' ; SA10 (znak '*') bylo skutecne stisknuto jsr Store_and_Send_char lda #$00 sta app_running_tag ; zapni priznak bezici aplikace (1...1) bra testColumn3_end SA12_depressed: testColumn3_end: rts ; ----------------------------------------------------------------------------- ;****************************** ; podprogramy pro blikani LED * ;****************************** LightOnVL1_green: ; doplnte chybejici kod podprogramu LightOnVL1_green umisteneho nize ;light-ON bset 4,DDRB bclr 4,PTB rts ;----- BlinkVL2_red: ;light-ON diode V2 (red) bset 5,DDRB bclr 5,PTB jsr DelayA ;ON-time ;light-OFF V2 bclr 5,DDRB bset 5,PTB jsr DelayA ;OFF-time rts ; ----------------------------------------------------------------------------- ;******************************** ;* podprogramy pro praci s SCI * ;******************************** Init_SCI: mov #$A2,SCBR ; Baud Rate = 9600 @ 9,8MHZ-BUS CLK mov #$40,SCC1 ; Enable the SCI peripheral mov #$0C,SCC2 ; Enable the SCI transmitter and receiver clr SCC3 ; Clear rts Store_and_Send_char: sta entered_code,X ; store char in RAM incx brclr 7,SCS1,* sta SCDR ; send char via SCI jsr DelayB rts ; ----------------------------------------------------------------------------- ;************************** ;* inicializace portu MCU * ;************************** Init_ButtonRelated_Ports: mov #$70,DDRC ; set PTC4-PT6 as output bits in PTC clr PTC ; ensure "0" occurs at PTC7-PTC0 clr DDRD ; set PTD0-PTD7 as input bits in PTD mov #$02,KBSCR ; init KBI, mask KBI interrupts, KBI edge-detection ON mov #$F0,KBIER ; pull-ups at PTD4..7 rts ; ----------------------------------------------------------------------------- ;************************** ;* zpozdovaci smycky A, B * ;************************** DelayA: psha lda #$7F delayA1: psha lda #$7F delayA2: nop nop nop nop nop nop nop nop nop nop dbnza delayA2 pula dbnza delayA1 pula rts ;-------------------------------------- DelayB: psha lda #$8F delayB1: psha lda #$60 delayB2: nop nop nop nop nop nop nop nop nop nop dbnza delayB2 pula dbnza delayB1 pula rts ; ----------------------------------------------------------------------------- ;******************************************************* ;* Obsluhy preruseni (ISR) a tabulka vektoru preruseni * ;******************************************************* spurious: NOP RTI ;------------------------------------------------------------------ isr_keyb: NOP RTI ; ----------------------------------------------------------------------------- ORG VectorStart ;------------------------------------------------------------------ ; routine vector description vector address ;------------------------------------------------------------------ fdb spurious ; Real-time Clock Vector , $FFDA fdb spurious ; ADC Conversion Complete , $FFDC fdb isr_keyb ; Keyboard Vector , $FFDE fdb spurious ; SCI Transmit Vector , $FFE0 fdb spurious ; SCI Receive Vector , $FFE2 fdb spurious ; SCI Error Vector , $FFE4 fdb spurious ; SPI Receive Vector , $FFE6 fdb spurious ; SPI Transmit Vector , $FFE8 fdb spurious ; TIM2 Overflow Vector , $FFEA fdb spurious ; TIM2 Channel 1 Vector , $FFEC fdb spurious ; TIM2 Channel 0 Vector , $FFEE fdb spurious ; TIM1 Overflow Vector , $FFF0 fdb spurious ; TIM1 Channel 1 Vector , $FFF2 fdb spurious ; TIM1 Channel 0 Vector , $FFF4 fdb spurious ; PLL Vector , $FFF6 fdb spurious ; LVI Vector , $FFF8 fdb spurious ; ~IRQ1 Vector , $FFFA fdb spurious ; SWI Vector , $FFFC fdb Entry ; Reset Vector , $FFFE