

Jag har lyckats för första gången att få ett program som jag har konstruerat helt efter eget huvud att fungera som jag vill!
Nu vill jag ha kritik på koden!

Vad kunde jag gjort bättre???? Labels??? Kommentarer??
Här é koden:
Kod: Markera allt
;**********************************************************************
; En kod för att testa att få bort kontakt-studs samt att skilja *
; på långa eller korta knapptryckningar. *
; RB0 är kopplad till en knapp som vid nedtryckning jordar. *
; RA0 och RA1 är kopplade till varsin lysdiod som lyser vid en *
; digital 0:a på motsvarande pinne. *
; vid kort tryck på knappen så släcks eller tänds RA0 och *
; vid långt tryck (2sek) så tänds eller släcks RA1. *
;**********************************************************************
; *
; Filename: project1.asm *
; Date: *
; File Version: *
; *
; Author: Andreas "Bösen" Torstensson *
; *
; *
;**********************************************************************
; *
; Files required: P16F648A.INC *
; *
; *
; *
;**********************************************************************
list p=16F648A ; list directive to define processor
#include <p16F648A.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT
;***** VARIABLE DEFINITIONS (examples)
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR
w_temp RES 1 ; variable used for context saving
status_temp RES 1 ; variable used for context saving
pclath_temp RES 1 ; variable used for context saving
delay_var RES 1 ; variable used for delay counter
knapp_var RES 1 ; variabel för knappen
knapp1_var RES 1 ; variabel för tiden knappen är intryckt
;**********************************************************************
RESET_VECTOR CODE 0x0000 ; processor reset vector
goto start ; go to beginning of program
INT_VECTOR CODE 0x0004 ; interrupt vector location
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into W register
movwf pclath_temp ; save off contents of PCLATH register
; isr code can go here or be located as a call subroutine elsewhere
; ______________________________________________________________________
banksel INTCON
bcf INTCON, T0IF
btfss knapp_var, 0
goto ej_flagga
btfss PORTB, 0
goto knapp_tryckt
btfsc knapp_var, 1
goto knapp_kort
knapp_kort
clrf knapp_var
clrf knapp1_var
;om man bara har tryckt ett kort tryck på knappen så hamnar man här
btfsc PORTA, 0
goto knapp_kort1
goto knapp_kort2
knapp_kort1
bcf PORTA, 0
goto isr_slut
knapp_kort2
bsf PORTA, 0
goto isr_slut
knapp_tryckt
bsf knapp_var, 1
incfsz knapp1_var
goto isr_slut
clrf knapp_var
clrf knapp1_var
; Om knappen har varit intryckt mer än 2sek så hamnar du här
btfsc PORTA, 1
goto knapp_long1
goto knapp_long2
knapp_long1
bcf PORTA, 1
goto knapp_long3
knapp_long2
bsf PORTA, 1
knapp_long3
btfss PORTB, 0
goto knapp_long3
goto isr_slut
ej_flagga
btfss PORTB, 0
bsf knapp_var, 0
isr_slut
; ______________________________________________________________________
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
MAIN_PROG CODE
start
; remaining code goes here
; ______________________________________________________________________
banksel cmcon
movlw 0x07 ;stäng av komparatorerna
movwf cmcon
; _____________
banksel TRISA
clrf TRISA ;sätt hela porta till utgångar
banksel TRISB
movlw b'00000001' ;Sätt RB0 till ingång
movwf TRISB
banksel OPTION_REG
movlw b'01010011' ;sätt weak pullups till portb
movwf OPTION_REG ;sätt på timer0, 1:32(?) prescaler
bcf INTCON, T0IF
bsf INTCON, GIE
bsf INTCON, PEIE
bsf INTCON, T0IE
movlw b'11111100'
movwf PORTA
clrf knapp_var
clrf knapp1_var
loop
goto loop
; ______________________________________________________________________
; initialize eeprom locations
EE CODE 0x2100
DE 0x00, 0x01, 0x02, 0x03
END ; directive 'end of program'
Igentligen tycker jag att det hadde känts bättre/snyggare att sätta ISR:en efter MAIN-koden men eftersom templaten va uppbyggd på detta sättet så gjorde jag såhär... Hur brukar ni göra???