;************************************************************************************************************************************ ; Programm ADEBAR.asm: Demoprogramm für seriellen ADW mit Balkenanzeige, (LED-Balken an Port B); ; PIC 16F84, f = 4 MHz, SC = 1us; OUT an RA0, CLOCK an RA1, CS an RA4 , Dauer: ca. 120 us ; Dieter Kohtz, August 2000 ;************************************************************************************************************************************ ; LIST P = 16C84 ; legt den PIC-Controllertyp fest ; Zuordnungen: ; Register RTCC equ 1 ; RTCC-Register PC equ 2 ; Programmzaehler-Register STAT equ 3 ; FSR equ 4 ; Auswahlregister fuer indirektes Adressieren PORTA equ 5 ; PortA-Register PORTB equ 6 ; PortB-Register ZAEHL equ 0C ; Zaehler fuer Pause BIT equ 0D ; Bitzaehler ADRES equ 0E ; Ergebnis der Wandlung TRISA equ 5 ; Richtungsregister, Seite 1 des Registerfiles! TRISB equ 6 ; Richtungsregister, Seite 1 des Registerfiles! ; Konstanten: keine ; bits in Registern C equ 0 ; Carrybit im Statuswort-Register Z equ 2 ; Zerobit im Statuswort-Register RP0 equ 5 ; Seitenauswahlbit im Statuswort-Register dat equ 0 ; Datenbit von PORTA cl equ 1 ; Taktbit (clock) von PORTA cs equ 4 ; Chip select-Bit von PORTA ; Ziele der Registeroperationen w equ 0 f equ 1 ;*********************************************************************************** org 0 ; Programmanfang bei PC = 0 goto init ;*********************************************************************************** pause movlw 05 ; ZAEHL mit 5 laden movwf ZAEHL ; fuer 20 us Pause wdh1 decfsz ZAEHL,f ; ZAEHL um 1 erniedrigen und auf 0 testen goto wdh1 ; ZAEHL ist nicht 0: wiederholen return ; ZAEHL = 0: Ruecksprung ;*********************************************************************************** adw clrf ADRES ; ADRES loeschen clrf PORTA ; PORTA loeschen bsf STAT,RP0 ; Registerseite 1 movlw b'01101' ; Laden von TRISA mit binaer 01101 fuehrt zu: movwf TRISA ; RA0 = Eingang, RA1 und RA4 = Ausgang bcf STAT,RP0 ; Registerseite 0 call pause ; 20 us Pause bcf PORTA,cs ; CS = 0: ADW gibt Daten aus movlw 08 ; BIT mit 8 laden movwf BIT ; fuer 8-maligen Schleifendurchlauf bcf STAT,C ; Carrybit loeschen (meist vor Schiebebefehl noetig) wdh2 bsf PORTA,cl ; CLOCK = 1, hoechstwertiges Bit liegt an PORTA,da btfsc PORTA,dat ; DATA = 0/1? goto setzen ; DATA = 1 bcf ADRES,7 ; DATA = 0: Bit 7 in ADRES loeschen goto weiter setzen bsf ADRES,7 ; Bit 7 in ADRES setzen weiter rlf ADRES,f ; ADRES links schieben durch Carry! bcf PORTA,cl ; CLOCK = 0 decfsz BIT,f ; BIT herunterzaehlen und auf 0 testen goto wdh2 ; BIT ist nicht 0: wiederholen rlf ADRES,f ; BIT = 0: noch einmal nachschieben! bsf PORTA,cs ; CS = 1: Ausgang hochohmig return ;************************************************************************************************************************************ bar bsf STAT,RP0 ; Registerseite 1 clrf TRISB ; TRISB = 0: Port B = Ausgang bcf STAT,RP0 ; Registerseite 0 clrf PORTB ; PORTB loeschen movlw .32 ; w mit 32 dezimal laden subwf ADRES,w ; w von ADRES abziehen btfss STAT,C ; ADRES > 32d? (Carrybit gesetzt?) return ; nein: ADRES < 32d: Ruecksprung bsf PORTB,0 ; ja: RB0 setzen movlw .64 ; 64 d laden subwf ADRES,w btfss STAT,C return ; ADRES < 64d bsf PORTB,1 movlw .96 ; 96 d laden subwf ADRES,w btfss STAT,C return ; ADRES < 96d bsf PORTB,2 movlw .128 ; 128 d laden subwf ADRES,w btfss STAT,C return ; ADRES < 128d bsf PORTB,3 movlw .160 ; 160 d laden subwf ADRES,w btfss STAT,C return ; ADRES < 160d bsf PORTB,4 movlw .192 ; 192 d laden subwf ADRES,w btfss STAT,C return ; ADRES < 192d bsf PORTB,5 movlw .224 ; 224 d laden subwf ADRES,w btfss STAT,C return ; ADRES < 224d bsf PORTB,6 movlw .254 ; 254 d laden subwf ADRES,w btfss STAT,C return ; ADRES < 254d bsf PORTB,7 return ;************************************************************************************************************************************ ; Hier beginnt das Hauptprogramm ;************************************************************************************************************************************ init clrf ZAEHL ; ZAEHL loeschen clrf BIT ; BIT loeschen wdh3 call adw ; Unterprogramm adw aufrufen call bar ; Unterprogramm bar aufrufen goto wdh3 ; Wiederholung unendlich end ;************************************************************************************************************************************