Bilaga V
Assemblerkod till styrkretsen
;************************************************************************************
;Program som
initierar en LCD-display och styr digitaldelen i projektet DITAMA2
*
;************************************************************************************
LIST
P=16F84
include P16F84.INC
TMP
EQU
D'12'
; temporär lagring av tecken i CMPI-macro
TEMP
EQU
D'14'
; temporär lagring av tecken i write subrutin
FLAG
EQU
D'18'
; Bit 0 i flag håller reda på om vi är på med1/med2
; Bit 1 kollar om det finns meddelande eller ej på med1
; Bit 2 kollar om det finns meddelande eller ej på med2
; Bit 3 kollar stdby på/av
N
EQU
D'20'
; tidsvariabel 1 i delay
N2
EQU
D'21'
; tidsvariabel 2 i delay
TEMP2
EQU
D'22'
; temporär lagring av knapptryckning
SAMPL
EQU
D'23'
; tidsvariabel för 8 kHz
;**********************************
;
variabeltilldelning slut
*
;**********************************
;**********************************
;Lite olika MAKRON
*
;**********************************
CMPI
MACRO
a,b
; CMPI
a,b (b-a)
MOVFW
b
; flyttar b till W-reg
MOVWF
TMP
; flyttar W-reg till TMP
MOVLW
a
; flyttar a till W-reg
SUBWF
TMP,F
; b-a görs, resultat i TMP, b ändras ej
ENDM
; END MACRO
BNE
MACRO
label
; BNE
label
BTFSS
STATUS,Z
; hoppa förbi nästa instruktion
GOTO
label
; om Z=1
ENDM
BEQ
MACRO
label
; BNE
label
BTFSC
STATUS,Z
; hoppa förbi nästa instruktion
GOTO
label
; om Z=1
ENDM
WRITEM
MACRO
TEXT
MOVLW
TEXT-H'2100'
CALL
WRITE
ENDM
;************************
; Här börjar
adress 0
*
;************************
ORG
0
GOTO
MAIN
; hoppar över interruptrutin
;**********************************
; Här börjar
INTERRUPT subrutinen
*
;**********************************
ORG
4
INTERPT
MOVLW
H'01'
CALL
DELAY
; delay i ca 260us
; för ev kontaktstudsar
MOVFW
PORTB
MOVWF
TEMP2
MOVLW
B'00001111'
ANDWF
TEMP2,F ;
maskar ut de 4 lägsta bitarna
BTFSC
FLAG,3
; testar bit 3 på FLAG (standby på/av)
GOTO
VIDARE4
; om standby är på, hopp till VIDARE4
CMPI
B'0000',TEMP2 ;
knappen bläddra nedtryckt
BNE
VIDARE
; om ej nedtryckt gå vidare
MOVLW
B'00000001'
XORWF
FLAG,F
; inverterar bit 0 på FLAG, medd1/medd2
CALL
BLÄDDRA
; om nedtryckt gå till BLÄDDRA
GOTO
FIN
; avsluta avbrottsrutin
VIDARE
CMPI
B'0010',TEMP2 ;
knappen PLAY nedtryckt
BNE
VIDARE2
; om ej nedtryckt gå vidare
CALL
PLAY
; om nedtryckt gå till PLAY
GOTO
FIN
; avsluta avbrottsrutin
VIDARE2
CMPI
B'0100',TEMP2 ;
knappen REC nedtryckt
BNE
VIDARE3
; om ej nedtryckt gå vidare
CALL
REC
; om nedtryckt gå till REC
GOTO
FIN
; avsluta avbrottsrutin
VIDARE3
CMPI
B'0110',TEMP2 ;
knappen RADERA nedtryckt
BNE
VIDARE4
; om ej nedtryckt gå vidare
CALL
ERASE
; om nedtryckt gå till ERASE
GOTO
FIN
; avsluta avbrottsrutin
VIDARE4
CMPI
B'1000',TEMP2 ;
knappen STANDBY nedtryckt
BNE
FIN
; om ej nedtryckt gå vidare
CALL
STANDBY
; om nedtryckt gå till STANDBY
FIN
BTFSS
PORTB,0
; väntar tills knapp släpps
GOTO
FIN
RETFIE
;***********interrupt
slut***************
;******************
; Här börjar MAIN
*
;******************
MAIN
MOVLW
H'3F'
; delay i ca 256*260 us ~ 67ms
CALL
DELAY
; för att alla kretsar ska få tid på sig
CALL
INIT
CALL
INITDISP
; initiering av display
CALL
BLÄDDRA
BSF
STATUS,RP0
; BANK 1, ty OPTION_REG ligger där
BCF
OPTION_REG,INTEDG; interrupt på negativ flank
BCF
STATUS,RP0
; BANK 0 igen
BCF
INTCON,INTF ;
Clear flag
BSF
INTCON,GIE
; Global interrupt enable
BSF
INTCON,INTE ;
RB0/INT interrupt enable
HIT
SLEEP
; Sleep-mode tills avbrott kommer
NOP
; gör ingenting före avbrottsrutin
GOTO
HIT
; fortsätter här efter avbrottsrutin
;*******************MAIN
SLUT*******************************
;********************************
; Subrutinen BLÄDDRA
*
;********************************
BLÄDDRA
CALL
CLS
; clear screen
CMPI
D'0',FLAG
; jämför FLAG med 0
BNE
CARRY_ON
; om ej 0 fortsätt
CALL
PIL
; ritar en pil på skärmen
CALL
MEDDELANDE1 ; skriver
"MEDDELANDE 1" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
INGETMEDD
; skriver "INGET MEDDELANDE" på LCD
CALL
NYRAD
; nästa rad
WRITEM
BLANK
CALL
MEDDELANDE2 ; skriver
"MEDDELANDE 2" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
INGETMEDD
; skriver "INGET MEDDELANDE" på LCD
GOTO
FINITO
; slut på subrutin
CARRY_ON
CMPI
D'1',FLAG
BNE
CARRY_ON1
; om ej 0 fortsätt
WRITEM
BLANK
CALL
MEDDELANDE1 ; skriver
"MEDDELANDE 1" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
INGETMEDD
; skriver "INGET MEDDELANDE" på LCD
CALL
NYRAD
; nästa rad
CALL
PIL
; ritar en pil på skärmen
CALL
MEDDELANDE2 ; skriver
"MEDDELANDE 2" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
INGETMEDD
; skriver "INGET MEDDELANDE" på LCD
GOTO
FINITO
; slut på subrutin
CARRY_ON1
CMPI
D'2',FLAG
BNE
CARRY_ON2
; om ej 0 fortsätt
CALL
PIL
; ritar en pil på skärmen
CALL
MEDDELANDE1 ; skriver
"MEDDELANDE 1" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
MEDDFINNS
; skriver "MEDDELANDE FINNS" på LCD
CALL
NYRAD
; nästa rad
WRITEM
BLANK
CALL
MEDDELANDE2 ; skriver
"MEDDELANDE 2" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
INGETMEDD
; skriver "INGET MEDDELANDE" på LCD
GOTO
FINITO
; slut på subrutin
CARRY_ON2
CMPI
D'3',FLAG
BNE
CARRY_ON3
; om ej 0 fortsätt
WRITEM
BLANK
CALL
MEDDELANDE1 ; skriver
"MEDDELANDE 1" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
INGETMEDD
; skriver "INGET MEDDELANDE" på LCD
CALL
NYRAD
; nästa rad
CALL
PIL
; ritar en pil på skärmen
CALL
MEDDELANDE2 ; skriver
"MEDDELANDE 2" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
MEDDFINNS
; skriver "MEDDELANDE FINNS" på LCD
GOTO
FINITO
; slut på subrutin
CARRY_ON3
CMPI
D'4',FLAG
BNE
CARRY_ON4
; om ej 0 fortsätt
CALL
PIL
CALL
MEDDELANDE1 ; skriver
"MEDDELANDE 1" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
INGETMEDD
; skriver "INGET MEDDELANDE" på LCD
CALL
NYRAD
; nästa rad
WRITEM
BLANK
CALL
MEDDELANDE2 ; skriver
"MEDDELANDE 2" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
MEDDFINNS
; skriver "MEDDELANDE FINNS" på LCD
GOTO
FINITO
; slut på subrutin
CARRY_ON4
CMPI
D'5',FLAG
BNE
CARRY_ON5
; om ej 0 fortsätt
WRITEM
BLANK
CALL
MEDDELANDE1 ; skriver
"MEDDELANDE 1" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
MEDDFINNS
; skriver "MEDDELANDE FINNS" på LCD
CALL
NYRAD
; nästa rad
CALL
PIL
; ritar en pil på skärmen
CALL
MEDDELANDE2 ; skriver
"MEDDELANDE 2" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
INGETMEDD
; skriver "INGET MEDDELANDE" på LCD
GOTO
FINITO
; slut på subrutin
CARRY_ON5
CMPI
D'6',FLAG
BNE
CARRY_ON6
; om ej 0 fortsätt
CALL
PIL
; ritar en pil på skärmen
CALL
MEDDELANDE1 ; skriver
"MEDDELANDE 1" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
MEDDFINNS
; skriver "MEDDELANDE FINNS" på LCD
CALL
NYRAD
; nästa rad
WRITEM
BLANK
CALL
MEDDELANDE2 ; skriver
"MEDDELANDE 2" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
MEDDFINNS
; skriver "MEDDELANDE FINNS" på LCD
GOTO
FINITO
; slut på subrutin
CARRY_ON6
CMPI
D'7',FLAG
BNE
FINITO
; om ej 0 SLUT
WRITEM
BLANK
CALL
MEDDELANDE1 ; skriver
"MEDDELANDE 1" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
MEDDFINNS
; skriver "MEDDELANDE FINNS" på LCD
CALL
NYRAD
; nästa rad
CALL
PIL
; ritar en pil på skärmen
CALL
MEDDELANDE2 ; skriver
"MEDDELANDE 2" på LCD
WRITEM
KOLON
WRITEM
BLANK
CALL
MEDDFINNS
; skriver "MEDDELANDE FINNS" på LCD
FINITO
RETURN
;********************************
; Subrutinen PLAY
*
;********************************
PLAY
CALL
CLS
BTFSS
FLAG,0
; testar bit 0 på FLAG (medd1/medd2)
GOTO
MEDDETT
GOTO
MEDDTVÅ
MEDDETT
BTFSS
FLAG,1
; testar bit 1 på FLAG (medd1: finns/finns ej)
GOTO
MEDDETT_EJ
GOTO
MEDDETT_JA
MEDDETT_EJ
WRITEM
FINNS
WRITEM
BLANK
WRITEM
INGET
WRITEM
KOLON
CALL
NYRAD
CALL
MEDDELANDE1
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
GOTO
NEXT3
MEDDETT_JA
WRITEM
SPELAR_UPP
WRITEM
BLANK
WRITEM
KOLON
CALL
NYRAD
CALL
MEDDELANDE1
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
; Meddelande spelas upp:
MOVLW
B'1000'; medd1, Chip Select-D/A, Write Enable-minne, sp. reg analogdel på
MOVWF
PORTA
MOVLW
H'01'
CALL
DELAY
; delay i ca 260µs så att analogdelen hinner startas upp
MOVLW
B'01110000'
; Master Reset-räknarna
MOVWF
PORTB
PLAYLOOP1
BSF
PORTA,0
; /Chip Select-minne
MOVLW
B'00000000'
MOVWF
PORTB
; räknar upp räknarna ett steg
MOVLW
B'01000000'
; ovan och nedan gör en slags klockpuls
MOVWF
PORTB
; ställer tillbaka räknare
BTFSC
PORTA,4 ;
testar bit 4 på PORTA
GOTO
NEXT3
; Om den är 1 är meddelandet slut, dvs MSB räknare=1
CALL
SAMPLDELAY ; delay
så att det blir ca 8kHz totalt
BCF
PORTA,0
; /Chip Select-minne disable
CALL
SAMPLDELAY ; delay
så att det blir ca 8kHz totalt
GOTO
PLAYLOOP1
; LOOP
MEDDTVÅ
BTFSS
FLAG,2
; testar bit 2 på FLAG (medd2: finns/finns ej)
GOTO
MEDDTVÅ_EJ
GOTO
MEDDTVÅ_JA
MEDDTVÅ_EJ
WRITEM
FINNS
WRITEM
BLANK
WRITEM
INGET
WRITEM
KOLON
CALL
NYRAD
CALL
MEDDELANDE2
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
GOTO
NEXT3
MEDDTVÅ_JA
WRITEM
SPELAR_UPP
WRITEM
BLANK
WRITEM
KOLON
CALL
NYRAD
CALL
MEDDELANDE2
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
; Meddelande spelas upp:
MOVLW
B'1010'; medd2, Chip Select-D/A, Write Enable-minne, sp. reg analogdel på
MOVWF
PORTA
MOVLW
H'01'
CALL
DELAY
; delay i ca 260µs så att analogdelen hinner startas upp
MOVLW
B'01110000'
; Master Reset-räknarna
MOVWF
PORTB
PLAYLOOP2
BSF
PORTA,0
; /Chip Select-minne
MOVLW
B'00000000'
MOVWF
PORTB
; räknar upp räknarna ett steg
MOVLW
B'01000000'
; ovan och nedan gör en slags klockpuls
MOVWF
PORTB
; ställer tillbaka räknare
BTFSC
PORTA,4 ;
testar bit 4 på PORTA
GOTO
NEXT3
; Om den är 1 är meddelandet slut, dvs MSB räknare=1
CALL
SAMPLDELAY ; delay
så att det blir ca 8kHz totalt
BCF
PORTA,0
; /Chip Select-minne disable
CALL
SAMPLDELAY ; delay
så att det blir ca 8kHz totalt
GOTO
PLAYLOOP2
; LOOP
NEXT3
CLRF
PORTA
; nollställer PORTA, dvs inget enablat
CALL
BLÄDDRA
RETURN
;********************************
; Subrutinen REC
*
;********************************
REC
CALL
CLS
BTFSS
FLAG,0
; testar bit 0 på FLAG (medd1/medd2)
GOTO
MEDETT
GOTO
MEDTVÅ
MEDETT
BSF
FLAG,1
; sätter bit 1 på FLAG till 1
WRITEM
SPELAR_IN
WRITEM
BLANK
WRITEM
KOLON
CALL
NYRAD
CALL
MEDDELANDE1
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
; Meddelande spelas in:
MOVLW
B'0100'; medd1, Chip Select-A/D, Output Enable-minne, sp. reg analogdel på
MOVWF
PORTA
MOVLW
H'01'
CALL
DELAY
; delay i ca 260µs så att analogdelen hinner startas upp
MOVLW
B'01110000'
; Master Reset-räknarna
MOVWF
PORTB
RECLOOP1
BSF
PORTA,0
; /Chip Select-minne
MOVLW
B'00000000'
MOVWF
PORTB
; räknar upp räknarna ett steg
MOVLW
B'01000000'
; ovan och nedan gör en slags klockpuls
MOVWF
PORTB
; ställer tillbaka räknare
BTFSC
PORTA,4 ;
testar bit 4 på PORTA
GOTO
NEXT
; Om den är 1 är meddelandet slut, dvs MSB räknare=1
CALL
SAMPLDELAY ; delay
så att det blir ca 8kHz totalt
BCF
PORTA,0
; /Chip Select-minne disable
CALL
SAMPLDELAY ; delay
så att det blir ca 8kHz totalt
GOTO
RECLOOP1
; LOOP
GOTO
NEXT
; dvs meddelande 1 finns
MEDTVÅ
BSF
FLAG,2
; annars är vi på meddelande 2
; och meddelande finns där
WRITEM
SPELAR_IN
WRITEM
BLANK
WRITEM
KOLON
CALL
NYRAD
CALL
MEDDELANDE2
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
; Meddelande spelas in:
MOVLW
B'0110' ; medd2, Chip Select-A/D, Output Enable-minne, sp. reg analogdel
på
MOVWF
PORTA
MOVLW
H'01'
CALL
DELAY
; delay i ca 260µs så att analogdelen hinner startas upp
MOVLW
B'01110000'
; Master Reset-räknarna
MOVWF
PORTB
RECLOOP2
BSF
PORTA,0
; /Chip Select-minne
MOVLW
B'00000000'
MOVWF
PORTB
; räknar upp räknarna ett steg
MOVLW
B'01000000'
; ovan och nedan gör en slags klockpuls
MOVWF
PORTB
; ställer tillbaka räknare
BTFSC
PORTA,4 ;
testar bit 4 på PORTA
GOTO
NEXT
; Om den är 1 är meddelandet slut, dvs MSB räknare=1
CALL
SAMPLDELAY ; delay
så att det blir ca 8kHz totalt
BCF
PORTA,0
; /Chip Select-minne disable
CALL
SAMPLDELAY ; delay
så att det blir ca 8kHz totalt
GOTO
RECLOOP2
; LOOP
1
NEXT
CLRF
PORTA
; nollställer PORTA, dvs inget enablat
CALL
BLÄDDRA
RETURN
;********************************
; Subrutinen ERASE
*
;********************************
ERASE
CALL
CLS
BTFSS
FLAG,0
; testar bit 0 på FLAG (medd1/medd2)
GOTO
MED1
GOTO
MED2
MED1
BTFSS
FLAG,1
; testar bit 1 på FLAG (medd1: finns/finns ej)
GOTO
MED1_EJ
GOTO
MED1_JA
MED1_EJ
WRITEM
FINNS
WRITEM
BLANK
WRITEM
INGET
WRITEM
KOLON
CALL
NYRAD
CALL
MEDDELANDE1
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
GOTO
NEXT2
MED1_JA
BCF
FLAG,1
; sätter bit 1 på FLAG till 0
CALL
MEDDELANDE1 ; dvs meddelande 1
"raderas"
WRITEM
BLANK
WRITEM
KOLON
WRITEM
RADERAT
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
GOTO
NEXT2
MED2
BTFSS
FLAG,2
; testar bit 2 på FLAG (medd2: finns/finns ej)
GOTO
MED2_EJ
GOTO
MED2_JA
MED2_EJ
WRITEM
FINNS
WRITEM
BLANK
WRITEM
INGET
WRITEM
KOLON
CALL
NYRAD
CALL
MEDDELANDE2
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
GOTO
NEXT2
MED2_JA
BCF
FLAG,2
; annars är vi på meddelande 2
; och meddelande 2 "raderas"
CALL
MEDDELANDE2
WRITEM
BLANK
WRITEM
KOLON
WRITEM
RADERAT
WRITEM
PUNKT
WRITEM
PUNKT
WRITEM
PUNKT
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
MOVLW
H'00'
CALL
DELAY
; delay ganska länge
NEXT2
CALL
BLÄDDRA
FINISH
RETURN
;********************************
; Subrutinen STANDBY
*
;********************************
STANDBY
MOVLW
B'00001000'
XORWF
FLAG,F
; inverterar bit 3 på FLAG (standby på/av)
BTFSS
FLAG,3
GOTO
HOPP
; om flag = 0 dvs STANDBY av, gå till HOPP
; om STANDBY är på görs nedanstående
BCF
PORTA,1
; RS=0
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00000000'
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
B'10000000'
; display OFF
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
;MOVLW
H'02'
; delay i ca 260 us
;CALL
DELAY
BSF
PORTA,1
; RS=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
GOTO
RETUR
; gå till slutet
HOPP
BCF
PORTA,1
; RS=0
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00000000'
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
B'11000000'
; display ON
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
BSF
PORTA,1
; RS=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
CALL
CLS
CALL
BLÄDDRA
RETUR
RETURN
;******************************
; Subrutin som ritar
en pil
*
;******************************
PIL
MOVLW
B'01110000'
MOVWF
PORTB
; ritar en pil på displayen
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
B'11100000'
MOVWF
PORTB
; ritar en pil på displayen
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
RETURN
;******************************
; WRITE-subrutin
*
;******************************
WRITE
MOVWF
EEADR
; flyttar W-reg till EEADR
IGEN
BSF
STATUS,RP0
; BANK 1, ty EECON1 ligger där
BSF
EECON1,0
; read
BCF
STATUS,RP0
; BANK 0 igen
MOVFW
EEDATA
; flyttar tecken till W-reg
MOVWF
TEMP
; flyttar tecknet till TEMP
XORLW
H'00'
; XORar W-reg med 0
BTFSC
STATUS,2
; kollar om Z-flaggan är 0
GOTO
SLUT
; om Z-flaggan är 1 hoppar till SLUT
MOVFW
TEMP
MOVWF
PORTB
; skickar övre nibble till display
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
SWAPF
TEMP,F
; swappar TEMP
MOVLW
H'02'
CALL
DELAY
MOVFW
TEMP
MOVWF
PORTB
; skickar nästa nibble till display
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
INCF
EEADR,F
; ökar N med 1, nästa tecken
GOTO
IGEN
SLUT
CLRF
EEADR
; nollställer EEADR
RETURN
;************************************
; Subrutiner som
skriver lite olika
*
; texter på
displayen
*
;************************************
MEDDELANDE1
WRITEM
MEDDELANDE
WRITEM
BLANK
WRITEM
ETT
RETURN
MEDDELANDE2
WRITEM
MEDDELANDE
WRITEM
BLANK
WRITEM
TVÅ
RETURN
INGETMEDD
WRITEM
INGET
WRITEM
BLANK
WRITEM
MEDDELANDE
RETURN
MEDDFINNS
WRITEM
MEDDELANDE
WRITEM
BLANK
WRITEM
FINNS
RETURN
FINNSINGET
WRITEM
FINNS
WRITEM
BLANK
WRITEM
INGET
RETURN
;******************************
; Clear screen
subrutin
*
;******************************
CLS
BCF
PORTA,1
; RS=0
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00000000'
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
B'00010000'
; clear screen
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
BSF
PORTA,1
; RS=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
RETURN
;******************************
; Nästa rad
subrutin
*
;******************************
NYRAD
BCF
PORTA,1
; RS=0
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'11000000'
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
B'00000000'
; Nästa rad adress $40
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
BSF
PORTA,1
; RS=1
MOVLW
H'02'
; delay i ca 260 us
CALL
DELAY
RETURN
;************************************************************
; VÄNTERUTIN -
TIDEN I N2 VID ANROP
*
; INRE LOOPEN KÖRS
256*N2 GGR ( VID 4MHZ CA 260*N2 US
) *
;************************************************************
DELAY
MOVWF
N2
; N2= W-reg dvs det man skickade in i W-reg innan
; anrop av subrutinen
; N = 0 NÄR VI KOMMER IN -> 256 VARV I INRE LOOP
PLOOP
DECFSZ
N,F
; STEGA NED N , HOPPA ÖVER OM NOLL
GOTO
PLOOP
DECFSZ
N2,F
GOTO
PLOOP
RETURN
;************************************************************
; SAMPLINGSVÄNTERUTIN
*
; Tillsammans med
PLAY/REC-loop samt anrop av denna rutin
*
; och denna rutins
loop skall 8kHz genereras dvs 125 clkp
*
; vid 1MHz
*
;************************************************************
SAMPLDELAY
MOVLW
D'18'
; lägger in konstant i SAMPL
MOVWF
SAMPL
; detta kommer ge totalt ca 8kHz samplfrekv
SLOOP
DECFSZ
SAMPL,F
; stega ned SAMPL, hoppa över om 0
GOTO
SLOOP
RETURN
;**************************************
; Initiering av
PICens portar
*
; samt initiering av
TIMERinterrupt
*
;**************************************
INIT
BSF
STATUS,RP0
; page 1
MOVLW
B'00001111'
; PORTB output-input, data resp knappar
MOVWF
TRISB
; datariktningsregister
MOVLW
B'00010000'
; PORT A -output, bit 4 input: räknare färdig
MOVWF
TRISA
BCF
STATUS,RP0
; page 0
CLRF
PORTB
CLRF
PORTA
CLRF
FLAG
RETURN
;********************************
; Initiering av
Displayen
*
;********************************
INITDISP
MOVLW
H'1F'
; delay i ca 21*260 us ~ 5,5ms
CALL
DELAY
MOVLW
B'00110000'
; FUNCTION SET
MOVWF
PORTB
; skickar iväg
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 21*260 us ~ 5,5ms
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 21*260 us ~ 5,5ms
CALL
DELAY
MOVLW
B'00110000'
; FUNCTION SET
MOVWF
PORTB
; skickar iväg
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00110000'
; FUNCTION SET
MOVWF
PORTB
; skickar iväg
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00100000'
; 4-bit mode
MOVWF
PORTB
; skickar iväg
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00100000'
; 4-bit mode
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'10000000'
; 2-display lines
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00000000'
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'11000000'
; display on, cursor off, blink off
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00000000'
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00010000'
; Clear display
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'3F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'00000000'
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
MOVLW
B'01100000'
; Increment character adress
MOVWF
PORTB
BSF
PORTA,0
; E=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BCF
PORTA,0
; E=0
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
BSF
PORTA,1
; RS=1
MOVLW
H'1F'
; delay i ca 260 us
CALL
DELAY
RETURN
ORG
2100H
MEDDELANDE
DE
"MEDDELANDE",0
SPELAR_UPP
DE
"SPELAR UPP",0
SPELAR_IN
DE
"SPELAR IN",0
INGET
DE
"INGET",0
FINNS
DE
"FINNS",0
RADERAT
DE
"RADERAT",0
ETT
DE
"1",0
TVÅ
DE
"2",0
PUNKT
DE
".",0
KOLON
DE
":",0
BLANK
DE
" ",0
END