;osciloskop s 18f452 v 2.1
;**************************************************************************
;*                                PIC18F452                               *
;*                             --------\/--------                         *
;*                       +5V  -|MCLR     PGD/RB7|-                        *
;*                            -|RA0/AN0  PGC/RB6|-                        *
;*                            -|RA1/AN1      RB5|-                        *
;*                            -|RA2/AN2      RB4|-                        *
;*                            -|RA3/AN3  PGM/RB3|-                        *
;*                            -|RA4          RB2|-                        *
;*                            -|RA5/AN4      RB1|-                        *
;*                            -|RE0/RD   INT/RB0|-                        *
;*                            -|RE1/WR       Vdd|-  +5V                   *
;*                            -|RE2/CS       Vss|-   0V                   *
;*                       +5V  -|Vdd          RD7|-                        *
;*                        0V  -|Vss          RD6|-                        *
;*        Krystal 4,00 Mhz /  -|osc1         RD5|-                        *
;*                         \  -|osc2         RD4|-                        *
;*                            -|RC0       Rx/RC7|-  IN  / RS232           *
;*                            -|RC1       Tx/RC6|-  OUT / RS232           *
;*                            -|RC2          RC5|-                        *
;*                            -|RC3/SCL  SDA/RC4|-                        *
;*                            -|RD0          RD3|-                        *
;*                            -|RD1          RD2|-                        *
;*                             ------------------                         *
;**************************************************************************
        LIST P=18F452, R=DEC    ; Use the PIC18F452 and decimal system 

        #include "P18F452.INC"  ; Include header file   
;----------------------------------------------------------------------------------------
_CONFIG1L        EQU    H'300000'
_CONFIG1H        EQU    H'300001'
_CONFIG2L        EQU    H'300002'
_CONFIG2H        EQU    H'300003'
_CONFIG3L        EQU    H'300004'
_CONFIG3H        EQU    H'300005'
_CONFIG4L        EQU    H'300006'
_CONFIG4H        EQU    H'300007'

_LVP_ON_4L         EQU  H'FF'    ; Low-voltage ICSP enable
_LVP_OFF_4L        EQU  H'FB'
_WDT_ON_2H         EQU  H'FF'	; Watch Dog Timer enable
_WDT_OFF_2H        EQU  H'FE'
_BOR_ON_2L         EQU  H'FF'	; Brown-out Reset enable
_BOR_OFF_2L        EQU  H'FD'
_PWRT_OFF_2L       EQU  H'FF'	; Power-up Timer enable
_PWRT_ON_2L        EQU  H'FE'
_BORV_20_2L        EQU  H'FF'	; BOR Voltage - 2.0v
_BORV_27_2L        EQU  H'FB'	;               2.7v
_BORV_42_2L        EQU  H'F7' 	;               4.2v
_BORV_45_2L        EQU  H'F3'	;               4.5v
_LP_OSC_1H         EQU  H'F8'	; Oscillator type
_XT_OSC_1H         EQU  H'F9'
_HS_OSC_1H         EQU  H'FA'
_RC_OSC_1H         EQU  H'FB'
_PL_OSC_1H         EQU  H'FE'
  
	__CONFIG _CONFIG1H, _HS_OSC_1H ;_PL_OSC_1H
	__CONFIG _CONFIG2L, _BORV_27_2L & _PWRT_ON_2L & _BOR_OFF_2L
	__CONFIG _CONFIG2H,	_WDT_OFF_2H
	__CONFIG _CONFIG4L, _LVP_OFF_4L 
;***********************************************************
ram			equ		10h
W_TEMP		equ	ram+1	; temp preruseni
STATUS_TEMP	equ	ram+2	; temp preruseni
BSR_TEMP	equ	ram+3	; temp preruseni
tmp			equ	ram+21		;v0 je ulož. či sa prekročila doba držania tl. a či sa ma rychlo krokovať hodnota, v1 je uložene či je zar.zap alebo vyp
input		equ	ram+16
EE_DATA		equ	ram+17
EE_ADR		equ	ram+18
stlpec		equ	ram+4	; počet cyklou pre čitanie reg IRcodu
riadok		equ	ram+5		;register pre datove prenosy Hdata a Pdata pomocny reg
rdata		equ	ram+6		;register pre datove prenosy Hdata a Pdata počet bitov v slove 8
lp			equ	ram+7		;-registre sluziace na urcenie casovych pauz pri ladeni tunera a pri prijme ir codu
cast2		equ	ram+8		;-registre sluziace na urcenie casovych pauz pri ladeni tunera a pri prijme ir codu
adresa		equ	ram+9		;	pocitanie sekund
riadok1		equ	ram+10		;	premenna pre hodiny
hod			equ	ram+11		;	konstanta pre RTCC
stop		equ	ram+12		;registre pre syntezu
cnt			equ	ram+13	
l1			equ	ram+14		;pomocny register pre syntezu pre sučet
TMP0		equ	ram+15
TMP1		equ	ram+19
TMP2		equ	ram+20
adata		equ	ram+22	
r			equ	ram+23
d			equ	ram+24

rbm			equ		100h
e			equ		rbm

status		equ		0FD8h
;pc			equ		0FF9h
	
#define	in1		PORTA,0		
#define	in2		PORTA,1
#define	out3	PORTA,2
#define	in4		PORTA,3

#define	DB0		PORTB,0		
#define	DB1		PORTB,1
#define	DB2		PORTB,2
#define	DB3		PORTB,3	
#define	DB4		PORTB,4		
#define	DB5		PORTB,5
#define	DB6		PORTB,6
#define	DB7		PORTB,7
	
#define	E		PORTD,7	
#define	RW		PORTD,6	
#define	RS		PORTD,5	
#define	CS1		PORTD,4
#define	CS2		PORTD,3
;************************     Reset procesoru     *************************
	org	0x000000		; zacatek programu
 	goto	INIT		; skok na pocatecni inicializac
;--------------------------   Prerusenie high priority   -----------------------          
	org	0x000008			; vektor preruseni
	MOVWF W_TEMP 					; W_TEMP is in virtual bank
	MOVFF STATUS, STATUS_TEMP 		; STATUS_TEMP located anywhere
	MOVFF BSR, BSR_TEMP 			; BSR located anywhere
	;-------------------------------
;	movlb	1	
	movlw	61			;hodnotu 195 do tmr a vznine prrušenie 9,984ms
	movwf	TMR0L		;TMR0
	bcf		INTCON,TMR0IF

	MOVFF BSR_TEMP, BSR 			; Restore BSR
	MOVF W_TEMP, W					; Restore WREG
	MOVFF STATUS_TEMP,STATUS 		; Restore STATUS
	retfie
;--------------------------   Prerusenie low priority    -----------------------
;	org	0x000018			; vektor preruseni
;	retfie
;**********************   Inicializace procesoru    *********************
INIT	
;	movlb	15	
	movlw	b'000000'	; prednastaveni PORTu A
	movwf	PORTA
	movlw	b'00000000'	; prednastaveni PORTu B
	movwf	PORTB
	movlw	b'00000000'	; prednastaveni PORTu C
	movwf	PORTC
	movlw	b'00000000'	; přednastavení PORTu D
	movwf	PORTD		; 
	movlw	b'000'		; přednastavení PORTu E
	movwf	PORTE		; 

	movlw	b'00000110'	; A/D vstupy OFF
	movwf	ADCON1
	bcf		ADCON0,0	;converter module is shut-off

	movlw	b'11011'	; portA 5-0 0vstupy, 6vystupy
	movwf	TRISA
	movlw	b'00000000'	; portB 7-0, 7vystupy 1vystupy
	movwf	TRISB
	movlw	b'11111111'	; portc 7-0, 0vstupy, 8vystupy
	movwf	TRISC
	movlw	b'00000111'	; portd 7-0, 4vstupy, 4vystupy
	movwf	TRISD		
	movlw	b'00000111'		; porte 3-0, 1vstupy, 2vystupy
	movwf	TRISE		
	
;	bcf		T0CON,7		;timer1 stop
;	CLRWDT	
;	clrf	TMR0L	
;	clrf	TMR0H
	movlw	b'00100000'	; povolit preruseni od preteceni TMR0
	movwf	INTCON
	bsf		INTCON2,TMR0IP		;prerusenie tmr0 high
	movlw	b'11000111'
	movwf	T0CON

	clrf	TMR0L	
	clrf	TMR0H
	movlw	61			;hodnotu 195 do tmr a vznine prrušenie 9,984ms
	movwf	TMR0L		;TMR0
	CLRWDT	
	
	movlb	1
	
;	!!! zde napiste vynulovani a nastaveni promenych !!!************************************

	clrf	rdata
;	clrf	k
	clrf	riadok
	clrf	stlpec
	clrf	lp
	clrf	cast2
	clrf	adresa
	clrf	riadok1
	clrf	hod
	clrf	stop
	movlw	8
	movwf	cast2

	call	LCD			;ini lcd
	call	clcd

;	movlw	24
;	movwf	EE_ADR
;	call	writefsr

;	movlb	1
;	movlw	24			; pri prvom zapnuti načita eprom winamp do Ram
;	movwf	EE_ADR
;	call	readfsr
;	movlb	0
;************************     Hlavní program      *************************

;pisanie na displej
	call	clcd
	call	ls
	movlw	b'01000000'	;nastav sloupec na 0 (0-63)
	call	wrcmd
	movlw	b'11000000'	;na riadok 32	;b'11000000'	;nastav pocatecni radek na 0 (0-63)
;	movwf	hod
	call	wrcmd
;	movlw	b'10111000'	;nastav stranku (osmici bitu) na 0 (0-7)
;	movwf	riadok1
;	call	wrcmd

	movlw	128	;37;19;46;47
	movwf	cnt
	lfsr	FSR0,e		;fsr=ram+125
	clrf	l1

	movlw	64;32;16;32;64;8
	movwf	lp

	call	wrdata


;**************** lava alebo prava strana aktivna *****************
ls		
	bsf		CS1
	call	cek1		;*************
	bcf		CS2
	return

ps	bcf		CS1
	call	cek1		;*************
	bsf		CS2
	movlw	b'01000000'	;nastav sloupec na 0 (0-63)
	call	wrcmd
	movlw	b'11000000'	;na riadok 32	;b'11000000'	;nastav pocatecni radek na 0 (0-63)
	call	wrcmd
	movlw	b'10111000'	;nastav stranku (osmici bitu) na 0 (0-7)
	call	wrcmd
	return
;************************************************************
prevod
	movf	adata,0			
	sublw	7			
	btfsc	status,Z		
	retlw	128
	movf	adata,0			
	sublw	6		
	btfsc	status,Z		
	retlw	64
	movf	adata,0			
	sublw	5			
	btfsc	status,Z		
	retlw	32
	movf	adata,0			
	sublw	4			
	btfsc	status,Z		
	retlw	16
	movf	adata,0			
	sublw	3			
	btfsc	status,Z		
	retlw	8
	movf	adata,0			
	sublw	2			
	btfsc	status,Z		
	retlw	4
	movf	adata,0			
	sublw	1			
	btfsc	status,Z		
	retlw	2	
	movf	adata,0			
	sublw	0			
	btfsc	status,Z		
	retlw	1	
o	goto	o	
;************************************************************
LCD	    				 ;inicilizacia		128x64 bodov 
	call	inb			;PortB nastaveny ako IN
	call	cek1		;*************
	bsf		RW			;citanie
	call	cek1		;*************
	bcf		RS
	call	cek1		;*************
waitreset
	bsf		E
	call	cek1		;*************
	nop
	movf	PORTB,0
	movwf	rdata
	call	cek1		;*************
	bcf		E
	btfsc	rdata,4		;0-reset ukoncen	1-reset aktiv
	goto	waitreset
	btfsc	rdata,7		;0-radič pripraveny	1-radic zaneprazdneny
	goto	waitreset
	call	cek1		;*************
	bcf		RW			;zapis
	call	cek1		;*************
	call	outb		;PortB nastaveny ako OUT
	call	cek1		;*************
	bsf		CS1
	call	cek1		;*************
	bsf		CS2

	movlw	b'00111111'	;zapne displey
	call	wrcmd
clcd					;vymazanie LCD
	bsf		CS1
	call	cek1		;*************
	bsf		CS2
	call	cek1		;*************
	movlw	b'01000000'	;nastav sloupec na 0 (0-63)
	call	wrcmd
	movlw	b'10111000'	;nastav stranku (osmici bitu) na 0 (0-7)
	call	wrcmd
	movlw	b'11000000'	;nastav pocatecni radek na 0 (0-63)
	call	wrcmd
	
	movlw	b'10111000'	;nastav stranku (osmici bitu) na 0 (0-7)
	movwf	riadok
riadok8
	movf	riadok,0
	call	wrcmd

	movlw	64
	movwf	stlpec
stlpec64
	movlw	b'00000000'
	call	wrdata
	decfsz	stlpec,1
	goto	stlpec64

	incf	riadok,1
	movf	riadok,0
	sublw	192
	btfss	status,Z
	goto	riadok8
	return
;++++++++++++++ podprogram prenosu do lcd ++++++++++++++++
wrcmd
	bcf		RS
wr1	movwf	PORTB
	call	cek1		;*************
	nop
	bsf		E
	call	cek1		;*************
	nop
	nop
	bcf		E
	nop
	call	cek1		;*************
;	test ci je radic este zaneprazdneny 
	call	inb			;PortB nastaveny ako IN
	call	cek1		;*************
	bsf		RW			;citanie
	call	cek1		;*************
waitready
	nop
	bsf		E
	nop
	call	cek1		;*************
	movf	PORTB,0
	movwf	rdata
	call	cek1		;*************
	bcf		E
	nop
	call	cek1		;*************
	btfsc	rdata,7		;0-radič pripraveny	1-radic zaneprazdneny
	goto	waitready
	call	cek1		;*************
	bcf		RW			;zapis
	call	cek1		;*************
	call	outb		;PortB nastaveny ako OUT
	call	cek1		;*************
	return
wrdata
	bsf		RS
	movwf	PORTB
	nop
	call	cek1		;*************
	bsf		E
	nop
	call	cek1		;*************
	bcf		E
	call	cek1		;*************
	return
;..........................................................................
cek1	MOVLW	6  ;6 DEC	;mikrosec
        MOVWF TMP0
        DECFSZ TMP0,F
        GOTO $-1			
		return

cek2	;Delay 2000001 cycles
        MOVLW 0x0B  ;11 DEC
        MOVWF TMP2
        MOVLW 0x26  ;38 DEC
        MOVWF TMP1
        MOVLW 0x5E  ;94 DEC
        MOVWF TMP0
        DECFSZ TMP0,F
        GOTO $-1
        DECFSZ TMP1,F
        GOTO $-7
        DECFSZ TMP2,F
        GOTO $-14
;End of Delay			
		return

cek3	MOVLW 5  ;53 DEC
        MOVWF TMP0
        DECFSZ TMP0,F
        GOTO $-1
;End of Delay		
		return
;..........................................................................
inb
;	bsf	STATUS,RP0		; nastaveni BANKY 1
	movlw	b'11111111'	; portB 7-0, 7vystupy 1vystupy
	movwf	TRISB
;	bcf	STATUS,RP0		; nastaveni BANKY 0
	return	
outb
;	bsf	STATUS,RP0		; nastaveni BANKY 1
	movlw	b'00000000'	; portB 7-0, 7vystupy 1vystupy
	movwf	TRISB
;	bcf	STATUS,RP0		; nastaveni BANKY 0
	return



;************************      Konec programu     *************************
	end

