PIC de MIDI

http://nagasm.suac.net/ASL/pic-midi/index.html


;Photo Harp part1
;PentaTonic
;with TestMode

    LIST    P=PIC16F84
    include "p16f84.inc"
    LIST    R=DECIMAL
    __config _CP_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC

note_vel equ 0x10
tx_reg   equ 0x11
tx_lcnt  equ 0x12
tx_wcnt  equ 0x13
out_b    equ 0x14
wcnt1    equ 0x15
wcnt2    equ 0x16
wcnt3    equ 0x17
key1_old equ 0x18
key1_new equ 0x19
key2_old equ 0x1A
key2_new equ 0x1B
key3_old equ 0x1C
key3_new equ 0x1D
key4_old equ 0x1E
key4_new equ 0x1F
key_sw   equ 0x20
key_num  equ 0x21
key_cnt  equ 0x22

    org 0
    goto    start
    retfie
    retfie
    retfie
    retfie
start
    bcf     STATUS,RP0
    movlw   0xFF
    movwf   out_b
    movwf   PORTB

    bsf     STATUS,RP0
    movlw   0xC1
    movwf   TRISB
    bcf     STATUS,RP0

    btfss   PORTA,4
    goto    test_loop

    clrf    key1_old
    clrf    key1_new
    clrf    key2_old
    clrf    key2_new
    clrf    key3_old
    clrf    key3_new
    clrf    key4_old
    movlw   0x01
    movwf   key4_new

loop1
    clrf    key_num
key1
    movlw   0xEF
    movwf   out_b
    movwf   PORTB
    call    wait_on
    movfw   key1_new
    movwf   key1_old
    movfw   PORTA
    movwf   key1_new
    movlw   0xFF
    movwf   out_b
    movwf   PORTB
key1_on
    comf    key1_old,w
    andwf   key1_new,w
    movwf   key_sw
    movlw   64
    movwf   note_vel
    call    key_event
    movlw   4
    subwf   key_num
key1_off
    comf    key1_new,w
    andwf   key1_old,w
    movwf   key_sw
    movlw   0
    movwf   note_vel
    call    key_event
key2
    movlw   0xF7
    movwf   out_b
    movwf   PORTB
    call    wait_on
    movfw   key2_new
    movwf   key2_old
    movfw   PORTA
    movwf   key2_new
    movlw   0xFF
    movwf   out_b
    movwf   PORTB
key2_on
    comf    key2_old,w
    andwf   key2_new,w
    movwf   key_sw
    movlw   64
    movwf   note_vel
    call    key_event
    movlw   4
    subwf   key_num
key2_off
    comf    key2_new,w
    andwf   key2_old,w
    movwf   key_sw
    movlw   0
    movwf   note_vel
    call    key_event
key3
    movlw   0xFB
    movwf   out_b
    movwf   PORTB
    call    wait_on
    movfw   key3_new
    movwf   key3_old
    movfw   PORTA
    movwf   key3_new
    movlw   0xFF
    movwf   out_b
    movwf   PORTB
key3_on
    comf    key3_old,w
    andwf   key3_new,w
    movwf   key_sw
    movlw   64
    movwf   note_vel
    call    key_event
    movlw   4
    subwf   key_num
key3_off
    comf    key3_new,w
    andwf   key3_old,w
    movwf   key_sw
    movlw   0
    movwf   note_vel
    call    key_event
key4
    movlw   0xFD
    movwf   out_b
    movwf   PORTB
    call    wait_on
    movfw   key4_new
    movwf   key4_old
    movfw   PORTA
    movwf   key4_new
    movlw   0xFF
    movwf   out_b
    movwf   PORTB
key4_on
    comf    key4_old,w
    andwf   key4_new,w
    movwf   key_sw
    movlw   64
    movwf   note_vel
    call    key_event
    movlw   4
    subwf   key_num
key4_off
    comf    key4_new,w
    andwf   key4_old,w
    movwf   key_sw
    movlw   0
    movwf   note_vel
    call    key_event
    goto    loop1

key_event
    movlw   4
    movwf   key_cnt
key_loop
    btfsc   key_sw,3
    call    note_event
    rlf     key_sw
    incf    key_num
    decfsz  key_cnt
    goto    key_loop
    return

note_event
    movlw   0x90
    call    Midi_Out
    movfw   key_num
    movwf   EEADR
    bsf     STATUS,RP0
    bsf     EECON1,RD
    bcf     STATUS,RP0
    movfw   EEDATA
    call    Midi_Out
    movfw   note_vel
    call    Midi_Out
    return

Midi_Out
    movwf   tx_reg
    bcf     out_b,5     ;start bit
    movfw   out_b
    movwf   PORTB
    call    midi_wait
    nop
    nop
    movlw   8
    movwf   tx_lcnt
midi_loop
    btfsc   tx_reg,0
    bsf     out_b,5
    btfss   tx_reg,0
    bcf     out_b,5
    movfw   out_b
    movwf   PORTB
    call    midi_wait
    rrf     tx_reg
    decfsz  tx_lcnt
    goto    midi_loop
midi_stop_bit
    nop
    nop
    nop
    nop
    bsf     out_b,5     ;stop bit
    movfw   out_b
    movwf   PORTB
    call    midi_wait
    nop
    return

midi_wait               ;Xtal=10MHz
    nop
    nop
    movlw   21
    movwf   tx_wcnt
midi_wait_loop
    decfsz  tx_wcnt
    goto    midi_wait_loop
    return

wait_on
    movlw   10
    movwf   wcnt1
wlp1
    clrf    wcnt2
wlp2
    nop
    nop
    decfsz  wcnt2
    goto    wlp2
    decfsz  wcnt1
    goto    wlp1
    return

;Photo Harp part2
;test mode

test_loop
    movlw   0xEF
    movwf   PORTB
    call    kwait
    movlw   0xF7
    movwf   PORTB
    call    kwait
    movlw   0xFB
    movwf   PORTB
    call    kwait
    movlw   0xFD
    movwf   PORTB
    call    kwait
    goto    test_loop

kwait
kwait_hi
    btfss   PORTA,4
    goto    kwait_hi
kwait_lo
    btfsc   PORTA,4
    goto    kwait_lo
    movlw   100
    movwf   wcnt1
kwlp1
    clrf    wcnt2
kwlp2
    nop
    nop
    decfsz  wcnt2
    goto    kwlp2
    decfsz  wcnt1
    goto    kwlp1
    btfsc   PORTA,4
    goto    kwait_lo
    return

    org 0x2100
;EEPROM    Note#    PhotoTr
    de      50      ; 1
    de      60      ; 5
    de      69      ; 9
    de      79      ;13
    de      52      ; 2
    de      62      ; 6
    de      71      ;10
    de      81      ;14
    de      55      ; 3
    de      64      ; 7
    de      74      ;11
    de      83      ;15
    de      57      ; 4
    de      67      ; 8
    de      76      ;12
    de      85      ;16

    END




--------------------------------------------------------------------------------










TC74HC4521B

http://q.hatena.ne.jp/1128747935