Toy Piano


The “Toy Piano” is a small piano like musical instrument. It can be designed and implemented using keypad and PIC MCU. Each key in in the keypad can be utilized to produce one of the piano’s tones and the output will be from a buzzer or amp. device, like the one I used in the video.

piano

;Author: Abdullah M. Zyarah
;www.DigitalComputing.net


    PROCESSOR    16F877A
    #INCLUDE    <P16F877A.INC>
    __CONFIG    _XT_OSC & _CP_OFF & _LVP_OFF & _PWRTE_ON & _WDT_OFF

;******************************************;
;                INTIALIAZATION               ;
;******************************************;

    COUNT    EQU        H'20'
    TIMER    EQU        H'21'
    CYCLE    EQU        H'22'
    TIMER1    EQU        H'23'    
    RD1        EQU        1
    
    ORG        H'00'
    GOTO    MAIN
    GOTO    H'04'
MAIN
L1
    BTFSC    PORTD,RD1
    GOTO    L1    
    BANKSEL    TRISB
    MOVLW    B'00000111'                ; SET THE I/O FOR KEYBAD
    MOVWF    TRISB
    MOVLW    B'00000010'            
    MOVWF    TRISD                    ; SET THE I/O FOR BUZZER&RUN SWITCH
    BANKSEL    PORTB
    GOTO    START


TEST
    INCF    COUNT
    BTFSS    PORTB,0
    GOTO    FOUND

    INCF    COUNT
    BTFSS    PORTB,1
    GOTO    FOUND
    
    INCF    COUNT
    BTFSS    PORTB,2
    GOTO    FOUND    
    GOTO    NEXT
    

FOUND
    RETURN    

SCAN
    BSF        STATUS,0
    CLRF    COUNT
    BCF        PORTB,4                ; SELECT THE FIRST ROW
    GOTO    TEST

NEXT
    BSF        PORTB,3
    RLF        PORTB
    BTFSC    STATUS,0
    GOTO    TEST
    GOTO    SCAN

DELAY
    MOVF    TIMER,W
    MOVWF    TIMER1
DELAY1
    DECFSZ    TIMER1            ; 156+
    GOTO    DELAY1            ; 2*156=468
    RETURN

SETO
    MOVLW    H'FF'
    MOVWF    CYCLE
L2                
    BSF        PORTD,0            
    CALL    DELAY            ;468+        
    NOP                        ;1+
    NOP                        ;1+
    NOP                        ;1+
    
    BCF        PORTD,0            ;1+
    CALL    DELAY            ;468=
    DECFSZ    CYCLE            
    GOTO    L2
    RETURN

TEXT
    MOVF    COUNT,W
    ADDWF    PCL
    NOP    
    RETLW    D'166'
    RETLW    D'156'            ;1
    RETLW    D'139'            ;2
    RETLW    D'124'            ;3
    RETLW    D'117'            ;4
    RETLW    D'104'            ;5
    RETLW    D'92'            ;6
    RETLW    D'82'            ;7
    RETLW    D'77'            ;8
    RETLW    D'70'            ;9
    RETLW    D'65'            ;*
    RETLW    D'60'            ;#
    
START
    MOVLW    H'FF'
    MOVWF    PORTB
    CALL    SCAN
    CALL    TEXT
    MOVWF    TIMER
    CALL    SETO
    GOTO    START    
    
        
    END