Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as Plain Text by Kuba Kuźniar ( 12 years ago )
LIST P=16F877A
include p16f877a.inc
__config _LVP_OFF & _HS_OSC
; rejestry pomocnicze
DIG0 equ 20H ; kod pierwszej cyfry
DIG1 equ 21H ; kod drugiej cyfry
DIG2 equ 22H ; kod trzeciej cyfry
DIG3 equ 23H ; kod czwartej cyfry
TMPRB equ 24H ; kopia portu B z przerwania
; kody cyfr dla wyświetlacza 7-segmentowego
; segmenty: dpgfedcba - zero aktywne
S0 equ 11000000B
S1 equ 11111001B
S2 equ 10100100B
S3 equ 10110000B
S4 equ 10011001B
S5 equ 10010010B
S6 equ 10000010B
S7 equ 11111000B
S8 equ 10000000B
S9 equ 10010000B
SA equ 10001000B
SB equ 10000011B
SC equ 11000110B
SD equ 10100001B
SE equ 10000110B
SF equ 10001110B
SERR equ 00110110B ; stan początkowy wyświetlaczy, nie cyfra
PRSM equ 11111000B ; maska z wartością preskalera 11111PPP
; ppp - wartość preskalera
; określa prędkość przemiatania kolumn
; Początek programu
org 0000H
goto start
org 0004H ; wektor przerwań
goto int
; obsługa przerwania, przerwania wyłączone
int
movf PORTB, w
movwf TMPRB
movf DIG2, w
movwf DIG3
movf DIG1, w
movwf DIG2
movf DIG0, w
movwf DIG1
call enc
movwf DIG0
; oczekiwanie na zwolnienie klawisza
; czy RB = 1111xxxx
intwait
clrwdt
movlw 0xF0 ; maska 11110000
andwf PORTB, W ; W równe RB7..4 0000
xorlw 0xF0 ;
btfss STATUS, Z ; czy RB = 1111xxxx
goto intwait ; nie - wróć
bcf INTCON, RBIF ; skasowanie flagi przerwania RB
clrwdt
retfie ; powrót z przerwania
; koniec obsługi przerwania, przerwania włączone
.
.
.
; procedura dekodująca klawisz na kod cyfry wejście TMPRB, wyjście W
enc
movlw 0 ; W <- 0
btfss TMPRB, 1 ; TMPRB = xxxx0010 ?
addlw 1 ; TAK - kolumna 1
btfss TMPRB, 2 ; TMPRB = xxxx0100 ?
addlw 2 ; TAK - kolumna 2
btfss TMPRB, 3 ; TMPRB = xxxx1000 ?
addlw 3 ; TAK - kolumna 3
; NIE - kolumna 0
btfss TMPRB, 5 ; TMPRB = 0010xxxx ?
addlw 4 ; TAK - rząd 1
btfss TMPRB, 6 ; TMPRB = 0100xxxx ?
addlw 8 ; TAK - rząd 2
btfss TMPRB, 7 ; TMPRB = 1000xxxx ?
addlw 12 ; TAK - rząd 3
; NIE - rząd 0
; w W numer klawisza 0..F
andlw 00001111B ; dla pewności W <= 15
; skok wyliczany
addwf PCL, F ; odczyt tablicy stałych
retlw S0
retlw S1
retlw S2
retlw S3
retlw S4
retlw S5
retlw S6
retlw S7
retlw S8
retlw S9
retlw SA
retlw SB
retlw SC
retlw SD
retlw SE
retlw SF
;koniec procedury dekodującej, w W kod cyfry
start
banksel OPTION_REG
movlw 01111000B
movwf OPTION_REG
movlw 0
movwf TRISD
movlw 11110000B
movwf TRISB
banksel INTCON
movlw 10001000B
movwf INTCON
loop
movlw 11111110B
movwf PORTB
movf DIG0, w
movwf PORTD
sleep
nop
nop
movlw 11111101B
movwf PORTB
movf DIG1, w
movwf PORTD
sleep
nop
nop
movlw 11111011B
movwf PORTB
movf DIG2, w
movwf PORTD
sleep
nop
nop
movlw 11110111B
movwf PORTB
movf DIG3, w
movwf PORTD
sleep
nop
nop
goto loop
END
Revise this Paste
Parent: 56739