2016-04-18 1 views
0

Я использую сборку, MPLAP и PROTEUS, чтобы написать код, чтобы включить или выключить светодиод кнопкой. Проблема здесь в том, что мой код включается, когда кнопка находится в верхнем положении и выключает ее при нажатии кнопки в нижнем положении.Кнопка удержания вкл/выкл с использованием ассемблерного кода с использованием PIC16F887

Что я хочу: нажмите кнопку, и светодиод включится и останется включенным. Нажмите кнопку еще раз, и светодиод выключится и останется выключенным. Повторите это навсегда.

Вот мой код:

; Exam 7 - Bonus 2 


INCLUDE "P16F887.INC" 
Status EQU 0x20 ; Bien dung de 
BSF  Status,0; 


;Init---------------- 
BANKSEL TRISD ; Lua chon bank 1 
BCF  TRISD,0 ; PortD,0 la Output 
CLRF TRISD 
BSF  TRISC,0 ; PortC,0 la Input 

BANKSEL PORTD ; Lua chon bank 0 

;Main-------------- 
check db 0 
Start 


mainloop 


btfsc PORTC,0 
GOTO OFF 

ON 
movlw 0 
movwf PORTD 
GOTO mainloop 



OFF 
movlw 1 
movwf PORTD 
GOTO mainloop 



;............................. 

END 
+0

Вы должны изменить свой код, чтобы он переключает светодиод включен или выключен, когда входной бит изменяется от 1 до 0. –

+0

@RossRidge Вы можете написать свой код ?? – JamesCornel

+0

Казалось бы, это ваша работа. Мне не дали этого задания. –

ответ

0

Для чего-то вроде этого вам необходимо будет также дребезг переключателя, в данном примере это делается с помощью простого таймера задержки. Обязательно отключите сторожевой таймер в битах конфигурации или добавьте инструкции CLRWDT самостоятельно.

INCLUDE "p16f887.inc" 

DelayCnt equ 0x20 
DelayCnt2 equ 0x21 

    org 0 

    ;Init---------------- 
    BANKSEL TRISD ; Lua chon bank 1 
    BCF  TRISD,0 ; PortD,0 la Output 
    CLRF TRISD 
    BSF  TRISC,0 ; PortC,0 la Input 

    BANKSEL PORTD ; Lua chon bank 0 

    ;Main-------------- 

mainloop 

    BTFSS PORTC, 0 
    GOTO $-1  ;Wait for button to be released 

    BTFSC PORTC, 0 
    GOTO $-1  ;Wait for button to be pressed again 

    CALL DELAY  ;Wait for button debounce 

    BTFSC PORTC, 0 
    GOTO mainloop ;Back to begin if button bounced 

    BTFSS PORTD, 0 ;If output is low... 
    GOTO SETHIGH ;Set it. 
    BCF PORTD, 0 ;Otherwise clear it. 
    GOTO mainloop 

SETHIGH 

    BSF PORTD, 0 
    GOTO mainloop 

DELAY   ;Delay function for button debounce 
       ;Delays approx 25ms @ 1Mhz instruction clock 
       ;(Fosc = 4Mhz) 

    MOVLW 0x20  
    MOVWF DelayCnt2 ;Load 0x20 into DelayCnt2 

DELAY_INNER  

    MOVLW 0xFF  
    MOVWF DelayCnt  ;Load 0xFF into DelayCnt 
    DECFSZ DelayCnt, F 
    GOTO $-1    ;Decrease DelayCnt until 0 

    DECFSZ DelayCnt2, F 
    GOTO DELAY_INNER  ;Run inner loop until DelayCnt2 is 0 

    RETURN 

    ;............................. 

    END 
+0

спасибо alot :) Я действительно appriciate – JamesCornel

Смежные вопросы