Welcome, guest! Login / Register - Why register?
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
Your Name: Code Language: