;*************************** ;* SPACE DEEJAY RED & BLUE * ;*************************** PROCESSOR 16F872 include "P16F872.INC" ;*************************** ;* User defined Registers ;*************************** F_reg3 equ 20 F_reg2 equ 21 F_reg1 equ 22 F_reg0 equ 23 ;--------------------------- auto_rg equ 24 ;REGISTR OBSAHUJICI POCET MINUT do samovypnuti PORTX equ 25 G_stat equ 26 menu_rg equ 27 ;--------------------------- startup equ 28 HLP equ 29 off_rg equ 2a INPUT equ 2b ;--------------------------- DATA0 equ 2c DATA1 equ 2d DATA2 equ 2e DATA3 equ 2f DATA4 equ 30 DATA5 equ 31 DATA6 equ 32 DATA7 equ 33 kb_dly equ 34 kb_dlyh equ 35 std_dly equ 36 Inter equ 37 test equ 38 ;testovaci registr pro BH1415 0,1,2,3 ee_chan equ 39 ;adresa v eeprom (kanal) lite_of equ 3a ;registr odpocitavajici samovypinani podsviceni max_men equ 3b ;d'10'-BLUE d'4'-RED pocet polozek menu: SP-DJ RED 4, SP-DJ BLUE 10 equal equ 3c ;pomocny registr equalizeru 0-FLAT 1-_LOW 2-HIGH 3-LOUD ;--------------------------- IN0 equ 40 IN1 equ 41 IN2 equ 42 IN3 equ 43 IN4 equ 44 IN5 equ 45 ;--------------------------- Fr0_b2 equ 46 Fr1_b2 equ 47 Fr2_b2 equ 48 Fr3_b2 equ 49 ;--------------------------- CHAN_b2 equ 4a HLP_b2 equ 4b DAT_b2 equ 4c LOOP_b2 equ 4d ;***************************** ;* User defined constants ;***************************** kb_rate equ d'15' ;delay for fast repeating of keys kb_zob equ d'192' ;doba po kterou zustavaji posledni zobrazeni aktivni, nez se prepne do vychoz. stavu del_v equ d'40' ;zpozdeni v procedure DELAY _down equ 4 ;PORTB _right equ 5 ;PORTB _up equ 6 ;PORTB _left equ 7 ;PORTB lobat equ 2 ;PORTD extpwr equ 3 ;PORTD stereo equ 6 ;G_stat econo equ 7 ;G_stat l_in equ 4 ;PORTX l_out equ 5 ;PORTX mute equ 6 ;PORTX lcd_lig equ 7 ;PORTX ;************************** ;* User defined bits ;************************** dat equ 0 ;PORTA data bit for communication with EEPR & FM clk equ 1 ;PORTA clock bit for communication with EEPR & FM ;************************** ;************************** ;* Initial Procedure * ;************************** ;************************** goto init_ ;************************** dly return ;************************** ;* Main loop ;************************** Main decfsz Inter,1 ;zpozdovani /256 dokola, stale.. goto prn ;-------------------------- decfsz off_rg,1 goto prn movf auto_rg,0 btfss STATUS,Z ;pokud je v auto_rg=0min, je zakaz autovypinani goto tot_off prn ;************************** ;* Sending Data for LCD Multiplex 0 ;************************** d_to_l0 movlw b'00000010' bsf STATUS,RP0 movwf TRISC bcf STATUS,RP0 goto l0a ;-------------------------- bak_l0a call delay ;-------------------------- call dly goto l0b ;-------------------------- bak_l0b call delay ;-------------------------- ;************************** ;* Sending Data for LCD Multiplex 1 ;************************** d_to_l1 movlw b'00000001' bsf STATUS,RP0 movwf TRISC bcf STATUS,RP0 goto l1a ;-------------------------- bak_l1a call delay ;-------------------------- call dly goto l1b ;-------------------------- bak_l1b call delay ;-------------------------- decfsz startup,1 goto str_up incf startup,1 ;po dobehnuti stop az do konce decfsz lite_of,1 goto break6 incf lite_of,1 bcf PORTX,7 ;podsviceni LCD OFF movf PORTX,0 movwf PORTB bsf PORTC,2 bcf PORTC,2 ;------------------------- break6 movlw d'128' ;po 2,5sec prepnout LCD na ukazani akt. hodnoty v menu subwf std_dly,0 btfsc STATUS,Z call upd_akt movf std_dly,1 btfss STATUS,Z ;pokud se nic nemacka (std _dly=0) tak se zobrazeni LCD neupdatuje break5 decfsz std_dly,1 ;po zmene se ceka 5 sec, pak se provede zobrazeni frekvence (default) goto Main ;jeste neuplynulo od stisknuti dele nez cca 5sec ;------------------------- break2 clrf lite_of ;zacit s odpocitavanim zhasnuti podsviceni displeje bcf DATA6,5 ;zapnout LCD Ch bcf DATA7,2 ;zapnout LCD MHz bcf G_stat,3 ;zapnout LCD des. tecka bsf DATA6,6 ;vypnout LCD Min clrf menu_rg ;nastavi aktualni menu "1" - ladeni frekvence call upd_la ;zobrazit aktualni vysilaci frekvenci btfsc PORTX,6 ;mute bcf DATA6,6 ;zobrazit MUTE ON (AM) goto Main ;************************** upd_akt movf menu_rg,0 clrf PCLATH addwf PCL,1 goto upd_fr ;po 2,5s zobrazi akt. freq goto tr_out ;po 2,5s zobrazi akt stav transmitteru FM goto au_out ;po 2,5s zobrazi akt hodnotu samovypinani (min) goto st_out ;po 2,5s zobrazi stav 'stereo" goto rds_out goto fm_out ;zzz goto mut_out goto mic_out goto eq_out goto men_out ;************************** ;* Prepocty frekvence na 0-9 digits ;************************** upd_fr bcf DATA7,2 ;zap. LCD MHz bcf G_stat,3 ;zap. LCD des. carka goto upd_IN ;************************** upd_la incf ee_chan,0 ;zobrazit aktualni pozici v pameti+1 (Ch) kanal(1 az 5), ciselne 0-4 andlw b'00000111' movwf IN4 movlw 0 movwf IN5 ;IN6 je pristupny individualne goto upd_ne ;-------------------------- upd_IN movf menu_rg,0 movwf IN4 movlw 0xa ;_ movwf IN5 upd_ne movlw d'246' ;prepocet na 0-9 subwf F_reg0,0 movwf IN0 movlw d'246' subwf F_reg1,0 movwf IN1 movlw d'246' subwf F_reg2,0 movwf IN2 movlw d'246' subwf F_reg3,0 movwf IN3 ;*************************** ; Nacteni aktualnich hodnot pro zobrazeni LCD ;*************************** cont_up movf IN0,0 call Get_tab movwf DATA0 movf IN1,0 call Get_tab movwf DATA1 movf IN2,0 call Get_tab movwf DATA2 movf IN3,0 btfsc STATUS,Z ;jestli je to "0" tak ji nezobrazovat movlw 0xb ;blank call Get_tab movwf DATA3 cont_eq movf IN4,0 call Get_tab movwf DATA4 movf IN5,0 call Get_tab movwf DATA5 bsf DATA5,7 btfss G_stat,4 ;des.tecka_1 bcf DATA5,7 bsf DATA4,7 btfss G_stat,3 ;des.tecka_2 bcf DATA4,7 cont_m movf PORTX,0 movwf PORTB bsf PORTC,2 bcf PORTC,2 ;************************** ;* Navrat z obsluhy MENU ;************************** cont retlw 0 ;navrat z procedury DELAY - patri k instrukci "call DELAY" ;************************** ; Stisk klavesy "0 - menu select" ;************************** key0 bsf DATA7,2 ;vypnout LCD MHz bsf G_stat,3 ;vyp. LCD des. carka clrf kb_dlyh ;pri klavese "down" nepoustet rychly increment decf menu_rg,1 incfsz menu_rg,0 goto next_k0 decf max_men,0 ;max. pocet menu movwf menu_rg next_k0 bsf PCLATH,2 ;adresa 400H movf menu_rg,0 movwf PCL ;odkazy na MENU jsou umisteny od adresy 0x300h ;************************** k_set bsf DATA7,2 ;vypnout LCD MHz bsf G_stat,3 ;vyp. LCD des. carka clrf kb_dlyh ;pri klavese "up" nepoustet rychly increment incf menu_rg,1 movf max_men,0 subwf menu_rg,0 btfsc STATUS,Z ;max 9 menu (0-8) clrf menu_rg movf menu_rg,0 bsf PCLATH,2 ;adresa od 400H movwf PCL ;************************** ; Stisk klavesy "1 - move right (UP)" ;************************** k_right movf menu_rg,0 clrf PCLATH addwf PCL,1 ;------------------------- goto right_0 goto r_tran goto r_auto goto r_ster ;------------------------- goto r_au goto r_fm ;zzz goto r_mut goto r_mic goto r_tst goto r_mout ;************************* ; Stisk klavesy "3 - move left (down)" ;************************* k_left movf menu_rg,0 clrf PCLATH addwf PCL,1 ;------------------------- goto left_0 goto l_tran goto l_auto goto l_ster ;------------------------- goto l_au goto l_fm ;zzz goto l_mut goto l_mic goto l_tst goto l_mout ;*************************** ;* Dekodovani zobrazovaneho znaku ;*************************** Get_tab clrf PCLATH addwf PCL,1 retlw b'10000001' ;0 retlw b'11100111' ;1 retlw b'10010010' ;2 retlw b'11000010' ;3 retlw b'11100100' ;4 retlw b'11001000' ;5 retlw b'10001000' ;6 retlw b'11100001' ;7 retlw b'10000000' ;8 retlw b'11000000' ;9 retlw b'11111011' ;- retlw b'11111111' ;blank retlw b'11111110' ;-1 retlw b'10100001' ;n retlw b'10111000' ;f retlw b'10000001' ;O ;-------------------------- retlw b'10000110' ;d retlw b'10001100' ;b ;************************** ; Delay procedure & ; Keyboard test ;************************** delay bsf STATUS,RP0 movlw b'11111111' movwf TRISB bcf STATUS,RP0 movlw del_v movwf HLP ;-------------------------- ; behem tohoto zpozdeni cekam na urovnani log. urovne na vstupu PORTB loop_x clrwdt decfsz HLP,1 goto loop_x ;-------------------------- break1 movlw b'00001111' ;vygumuje segmenty A/D iorwf DATA6,1 movf PORTB,0 ;nacteni vstupu movwf HLP movf PORTB,0 iorlw b'11110000' xorlw b'00001111' andwf DATA6,1 ;xxxx zobrazuje vstup na lcd seg6, odmaskovana klavesnice, pouze analog. vstup bsf STATUS,RP0 clrf TRISB ;presmerovani PORTB jako vystup bcf STATUS,RP0 bsf DATA7,5 btfsc PORTA,4 ;je ext PWR2? bcf DATA7,5 bsf DATA7,6 btfss PORTA,3 ;je lo_bat? bcf DATA7,6 bsf DATA7,1 btfsc PORTA,5 ;je fast_ch? goto menus bcf DATA7,1 bcf DATA7,6 goto menus ;************************** ;uz neni misto od 0x200h, tak je to tady mic_out btfss PORTX,2 ;je zapnut MIC? goto _off goto _on ;************************ l_mic bcf PORTX,2 ;mic _off goto _off ;------------------------ r_mic bsf PORTX,2 ;mic _on goto _on ;************************ men_out call init_rd ;presun do noveho menu (kanalu) incf ee_chan,0 goto tr_out1 ;------------------------ l_mout movlw b'00000011' andwf ee_chan,0 btfsc STATUS,Z goto nx_l1 decf ee_chan,1 goto men_out nx_l1 bsf ee_chan,1 bsf ee_chan,0 ;preskoci na '3' - 4 varianty nastaveni v EEPROM goto men_out ;------------------------ r_mout movlw 3 subwf ee_chan,0 btfsc STATUS,Z goto nx_rmt incf ee_chan,1 goto men_out nx_rmt movlw 0 movwf ee_chan goto men_out ;************************** ;************************** org 0x100 ;************************* menus swapf auto_rg,0 btfsc HLP,0 ;meni se vstup Audio (alespon na nejnizsim bitu)? movwf off_rg ;POKUD ANO, nulovat odpocitavani AUTO_OFF ;-------------------------- ;pokud ne, odpocitava se auto off movlw b'11110000' andwf INPUT,1 andwf HLP,0 ;v HLP je obsah PORTB subwf INPUT,0 btfss STATUS,Z ;beze zmen goto zmena ;-------------------------- movlw b'11110000' andwf HLP,0 btfsc STATUS,Z ;kdyz je alespon.. goto kb_0000 ;neni stisknuto nic decfsz kb_dlyh,1 ;..alespon 1 klavesa stisknuta goto cont ;-------------------------- break3 btfsc HLP,_down ;pokud je dlouze stisknuta klavesa MENU (down).. goto tot_off ;vypnout... btfsc HLP,_up ;pokud je dlouze stisknuta kl. UP goto wr_ee ;zapis do EEprom movlw 1 movwf kb_dlyh ; kdyz je stisknuto, jiz typematic rate bezi bez pocatec. prodlevy decfsz kb_dly,1 ;posun pri stisknute klavese goto cont break4 movlw b'00000000' ;jakoby predtim nebylo stisknuto nic movwf INPUT movlw kb_rate movwf kb_dly goto cont ;-------------------------- kb_0000 clrf kb_dlyh ;pri zmene kb znovu odpocitavat typematic rate movlw 0x00 movwf INPUT goto cont ;-------------------------- zmena bsf DATA6,5 ;zhasnout LCD Ch bsf PORTX,7 ;rozsvitit podsviceni LCD clrf lite_of ;nastavit odpocitavani pro zhasnuti podsvetleni movlw kb_zob ;pri stisku se nastavi max. doba zobrazovan movwf std_dly ;spustit odpocet - pro "0" je blokovan swapf auto_rg,0 movwf off_rg ;nastavit odpocitavani AUTO_OFF movlw 1 movwf startup ;zastavit welcome hlasku movlw kb_rate movwf kb_dly movf HLP,0 movwf INPUT btfsc INPUT,_down goto key0 btfsc INPUT,_right goto k_right btfsc INPUT,_up goto k_set btfsc INPUT,_left goto k_left goto cont ;nastane pokud drzim stisklou uklavesu dele nez 5 sec, vyhodnoti se zmena pri navratu ;**************************** ;* Obsluzne routines pro klavesnici ;**************************** right_0 bcf DATA7,2 ;zapnout LCD MHz bcf G_stat,3 ;zap. LCD des. carka incfsz F_reg0,1 goto upd_IN movlw d'246' movwf F_reg0 incfsz F_reg1,1 goto upd_IN movlw d'246' movwf F_reg1 incfsz F_reg2,1 goto f_100 movlw d'246' movwf F_reg2 f_1000n incfsz F_reg3,1 goto f_1000 movlw d'246' movwf F_reg3 goto cont ;*************************** f_100 movlw d'248' subwf F_reg2,0 btfss STATUS,Z goto upd_IN movlw d'254' movwf F_reg2 goto f_1000n f_1000 movlw d'248' subwf F_reg3,0 btfss STATUS,Z goto upd_IN movlw d'246' movwf F_reg3 goto upd_IN ;*************************** left_0 bcf DATA7,2 ;zapnout LCD MHz bcf G_stat,3 ;zap. LCD des. carka movlw d'245' decf F_reg0,1 subwf F_reg0,0 btfss STATUS,Z goto upd_IN movlw d'255' movwf F_reg0 movlw d'245' decf F_reg1,1 subwf F_reg1,0 btfss STATUS,Z goto upd_IN movlw d'255' movwf F_reg1 movlw d'245' decf F_reg2,1 subwf F_reg2,0 btfss STATUS,Z goto fl_100 movlw d'255' movwf F_reg2 fl_n movlw d'245' decf F_reg3,1 subwf F_reg3,0 btfss STATUS,Z goto upd_IN movlw d'247' movwf F_reg3 goto upd_IN ;*********************** fl_100 movlw d'253' subwf F_reg2,0 btfss STATUS,Z goto upd_IN movlw d'247' movwf F_reg2 goto fl_n ;************************ l_auto decf auto_rg,1 incfsz auto_rg,0 goto au_out movlw d'9' movwf auto_rg goto au_out ;------------------------ r_auto incf auto_rg,1 movlw d'10' subwf auto_rg,0 btfsc STATUS,Z clrf auto_rg goto au_out ;************************ au_out movf auto_rg,0 btfsc STATUS,Z goto au_zero tr_out1 movwf IN0 clrf IN1 tr_out2 movlw 0xb movwf IN2 tr_out3 movlw 0xb movwf IN3 tr_out4 movf menu_rg,0 movwf IN4 movlw 0xa ;_ movwf IN5 goto cont_up ;************************** r_tran bsf PORTX,1 ;zapne BH1415f movf PORTX,0 ;- movwf PORTB ;- bsf PORTC,2 ;- bcf PORTC,2 ;- clrf HLP bcf DATA7,3 ;LCD ZNAK PRO FM_on lopfm decfsz HLP,1 goto lopfm ;cekam na zapnuti FM ;xxxxxxxxxxxxxxxxxxxxxxxxx goto Send_FM ;poslat do FM aktualni frekvenci Back_FM ;xxxxxxxxxxxxxxxxx _on fmtr_on movlw d'15' movwf IN1 movlw d'13' movwf IN0 goto tr_out2 ;------------------------- l_tran bcf PORTX,1 ;vypne vysilani movf PORTX,0 ;- movwf PORTB ;- bsf PORTC,2 ;- bcf PORTC,2 ;- bsf DATA7,3 ;LCD ZNAK PRO FM_off _off fmtr_of au_zero movlw d'15' movwf IN2 movlw d'14' movwf IN1 movwf IN0 goto tr_out3 ;************************ tr_out btfss PORTX,1 ; je zapnuto vysilani? goto fmtr_of goto fmtr_on ;************************ mut_out btfss PORTX,6 ; je zapnuto mute? goto _off goto _on ;------------------------ l_mut bsf DATA6,6 bcf PORTX,6 ;MUTE OFF goto _off ;------------------------ r_mut bcf DATA6,6 bsf PORTX,6 ;MUTE ON goto _on ;************************ rds_out btfsc PORTX,0 ; je zapnuto RDS? goto _off goto _on ;----------------------- l_au bcf PORTX,0 ;RDS OFF goto _off ;------------------------ r_au bsf PORTX,0 ;RDS ON goto _on ;************************ fm_out btfss PORTX,5 ; je zapnuto FM 0db? goto l_db goto r_db ;------------------------ l_fm bcf PORTX,5 ;FM at -9db (OFF) l_db movlw d'12' ;- movwf IN3 movlw 9 ;9 movwf IN2 tr_au4 movlw d'16' ;d movwf IN1 movlw d'17' ;b movwf IN0 goto tr_out4 ;------------------------ r_fm bsf PORTX,5 ;FM at +0db on r_db movlw d'11' ;blank movwf IN3 movlw 0 ;0 movwf IN2 goto tr_au4 ;************************ ;************************ equ_out bcf PORTX,3 ;ekvalizer btfsc equal,1 bsf PORTX,3 bcf PORTX,4 btfss equal,0 bsf PORTX,4 eq_out movlw b'00000111' ;sem skoci zobraz. rutina (menu) andwf equal,0 goto tr_eq ;------------------------ l_tst movlw b'00000111' andwf equal,0 btfsc STATUS,Z goto nx_t1 decf equal,1 goto equ_out nx_t1 bsf equal,2 decf equal,1 goto equ_out ;------------------------ r_tst incf equal,1 btfsc equal,2 goto nx_t2 goto equ_out nx_t2 movlw b'11111000' andwf equal,1 goto equ_out ;************************ st_out btfss G_stat,6 ; je zapnuto STEREO? goto _off goto _on ;------------------------ l_ster bsf DATA7,4 bcf G_stat,6 ;stereo _off goto _off ;------------------------ r_ster bcf DATA7,4 bsf G_stat,6 ;stereo _on goto _on ;************************** ;************************** org 0x200 ;************************** init_ clrf PORTA clrf PORTC clrf PORTB ;-------------------------- bsf STATUS,RP0 movlw b'00000000' movwf TRISB movwf TRISC bcf STATUS,RP0 ;-------------------------- ;vynulovani ext. portu, zobrazeni vsech segmentu LCD bsf PORTC,2 bcf PORTC,2 movlw 0xFF movwf PORTB bsf PORTC,4 bcf PORTC,4 bsf PORTC,5 bcf PORTC,5 bsf PORTC,6 bcf PORTC,6 bsf PORTC,7 bcf PORTC,7 clrf Inter clrf INTCON ;-------------------------- bsf STATUS,RP0 movlw b'11111000' movwf TRISA movlw b'11111111' movwf TRISB ;pro pocatecni test, s predstihem movlw b'00000000' movwf TRISC movlw b'10001100' movwf OPTION_REG movlw 0x06 movwf ADCON1 bcf STATUS,RP0 ;----------------------------- ; movlw 0x2f ;adresa ulozeni SPDJ RED/BLUE ; call ee_rd ; iorwf max_men,1 ; ; btfss STATUS,Z movlw d'10' ; movlw 04 ;spdj RED movwf max_men ;----------------------------- clrf HLP clrf test ;normal operation of PLL bsf HLP,7 ;cekani je cca 2sec wait_on clrwdt decfsz startup,1 goto wait_on bsf PORTC,3 ;PWR on btfss PORTB,_up ;cekam na pusteni klavesy UP (on) goto cont_on decfsz HLP,1 ;pouze po nejakou dobu, kdyz drzim dlouze, rovnou skoci do menu "tran" goto wait_on cont_on nop ;----------------------------- ;initial setings for LCD movlw b'11111110' movwf DATA0 ;- movwf DATA1 movwf DATA2 movwf DATA3 movwf DATA4 movwf DATA5 movlw 0xFF ;( ) movwf DATA6 movwf DATA7 ;---------------------------- movlw 0x00 movwf PORTA movwf CHAN_b2 clrf INPUT movwf startup ;spustit hlasku po zapnuti movlw kb_zob ;zobraz. zpozdeni - doba po kterou se zobrazuje nazev menu movwf std_dly movlw kb_dlyh movlw b'01011000' ;Stereo_ON, vypnuty des. carky movwf G_stat clrf menu_rg movlw 0x3F ;adresa 63 call ee_rd andlw b'00000011' ;max 4 movwf ee_chan ;akt. kanal ;----------------------------- clrwdt btfsc PORTB,_up ;pokud je pri zapinani stisknuto "UP", ignoruji se data z EEprom, zustanou default z _INIT goto b_rd_er call init_rd ;kdyz neni stisknuto, nahraji se data z EEPROM ;----------------------------- back_rd swapf auto_rg,0 movwf off_rg ;nastavit odpocitavani AUTO_OFF clrf menu_rg bsf STATUS,RP0 clrf TRISB bcf STATUS,RP0 bcf PORTX,1 ;nemuze byt BH on bsf PORTX,7 ;light ON clrf lite_of ;odpocitavani podsviceni LCD movf PORTX,0 movwf PORTB bsf PORTC,2 bcf PORTC,2 bsf DATA7,4 btfsc G_stat,6 ;je STEREO on? bcf DATA7,4 ;----------------------------- clrf equal bcf equal,1 ;nastaveni pomoc. registru equalizeru btfsc PORTX,3 bsf equal,1 bcf equal,0 btfss PORTX,4 bsf equal,0 ;----------------------------- goto Main ;************************* ; tohle se natahne kdyz neodpovida EEPROM nebo je pri zapnuti stisknuto "UP" ;************************* b_rd_er movlw d'251' ;5 initial settings for FM freq movwf F_reg0 movlw d'253' ;7 movwf F_reg1 movlw d'254' ;8 movwf F_reg2 movlw d'246' ;0( ) movwf F_reg3 movlw 2 ;2 minuty do vypnuti default movwf auto_rg movlw b'01011000' ;Stereo_ON, vypnuty des. carky movwf G_stat clrf PORTX ;vse vypnuto goto back_rd ;************************** ; EEPROM initial READing ;************************** init_rd swapf ee_chan,1 movf ee_chan,0 call ee_rd movwf F_reg3 movlw 1 addwf ee_chan,0 call ee_rd movwf F_reg2 movlw 2 addwf ee_chan,0 call ee_rd movwf F_reg1 movlw 3 addwf ee_chan,0 call ee_rd movwf F_reg0 movlw 4 addwf ee_chan,0 call ee_rd movwf auto_rg movlw 5 addwf ee_chan,0 call ee_rd movwf HLP movlw b'10000010' andwf PORTX,1 movlw b'01111101' andwf HLP,0 iorwf PORTX,1 movlw 6 addwf ee_chan,0 call ee_rd movwf HLP bcf G_stat,6 ;stereo btfsc HLP,6 bsf G_stat,6 movlw 7 addwf ee_chan,0 call ee_rd swapf ee_chan,1 return ;************************** ee_rd bsf STATUS,RP1 bcf STATUS,RP0 movwf EEADR bsf STATUS,RP0 bcf EECON1,EEPGD ;pointer to dataMEM bsf EECON1,RD bcf STATUS,RP0 movf EEDATA,0 bcf STATUS,RP1 return ;************************** tr_eq andlw b'00000011' movwf HLP clrf PCLATH bsf PCLATH,1 ;(adresa 200H) ;-------------------------- movlw b'11100011' ;T movwf DATA0 movlw b'10000001' ;O movwf DATA1 movlw b'10111101' ;I movwf DATA2 movlw b'10011101' ;L movwf DATA3 ;-------------------------- bcf STATUS,C rlf HLP,1 bcf STATUS,C rlf HLP,1 bcf STATUS,C rlf HLP,0 ;-------------------------- addwf PCL,1 _flat nop movlw b'10100000' ;A movwf DATA1 movlw b'10011101' ;L movwf DATA2 movlw b'10111000' ;F movwf DATA3 goto tr_eq2 __low movlw b'00000101' ;W movwf DATA0 nop movlw b'10011101' ;L movwf DATA2 movlw b'11111111' ;_ movwf DATA3 goto tr_eq2 _high movlw b'10100100' ;H movwf DATA0 movlw b'10001000' ;G movwf DATA1 nop movlw b'10100100' ;H movwf DATA3 goto tr_eq2 _loud movlw b'10000110' ;d movwf DATA0 movlw b'10001111' ;u movwf DATA1 movlw b'10001110' ;o movwf DATA2 ; goto tr_eq2 ;************************** tr_eq2 movf menu_rg,0 movwf IN4 movlw 0xa ;_ movwf IN5 goto cont_eq ;************************** org 0x300 ;************************** Send_FM bcf PORTA,dat ;initial sett bcf PORTA,clk ;initial sett ;---------------------- movlw d'246' ;prepocet na 0-9 subwf F_reg0,0 movwf Fr0_b2 movlw d'246' ;prepocet na 0-9 subwf F_reg1,0 movwf Fr1_b2 movlw d'246' ;prepocet na 0-9 subwf F_reg2,0 movwf Fr2_b2 movlw d'246' ;prepocet na 0-9 subwf F_reg3,0 movwf Fr3_b2 ;---------------------- bsf PORTA,2 ;ENable communication with BH1415F ;----------------------- bcf STATUS,C rrf Fr0_b2,0 ;A/2, carry out bcf PORTA,dat btfsc STATUS,C ;SEND Bit0 bsf PORTA,dat ;----------------------- nop nop nop addwf Fr1_b2,0 ;A/2+B... bsf PORTA,clk bcf STATUS,C rlf Fr1_b2,1 ;Bx2 rlf Fr1_b2,1 ;Bx4 bcf PORTA,clk addwf Fr1_b2,1 ;A/2+5xB rrf Fr1_b2,0 ;(a/2+5xB)/2 nop bcf PORTA,dat btfsc STATUS,C ;SEND Bit1 bsf PORTA,dat ;----------------------- addwf Fr2_b2,0 ;(A/2+5xB)/2+C bcf STATUS,C rlf Fr2_b2,1 ;Cx2 rlf Fr2_b2,1 ;Cx4 rlf Fr2_b2,1 ;Cx8 bsf PORTA,clk addwf Fr2_b2,0 ;(A/2+5xB)/2+C+8xC bcf STATUS,C rlf Fr2_b2,1 ;Cx16 bcf PORTA,clk addwf Fr2_b2,0 ;(A/2+5xB)/2+25xC bcf STATUS,C movwf Fr2_b2 rrf Fr2_b2,1 ;((A/2+5xB)/2+25xC)/2 bcf PORTA,dat ;SEND Bit2 btfsc STATUS,C bsf PORTA,dat ;----------------------- movlw d'125' btfsc Fr3_b2,0 ;jsou 1000covky? addwf Fr2_b2,1 ;W+1000/8 ;----------------------- nop bsf PORTA,clk nop nop nop bcf PORTA,clk movlw 8 movwf HLP_b2 ;rotovat rrW->out Bit3 to Bit 11 loop_fm rrf Fr2_b2,1 bcf PORTA,clk nop nop bcf PORTA,dat btfsc STATUS,C bsf PORTA,dat nop nop bsf PORTA,clk decfsz HLP_b2,1 goto loop_fm bcf PORTA,clk nop nop ;---------------------- bcf PORTA,dat btfsc G_stat,6 ;stereo on b6=1 bsf PORTA,dat nop nop bsf PORTA,clk nop nop bcf PORTA,clk ;---------------------- nop nop bcf PORTA,dat ;test PD0 btfsc test,0 ;XXX bsf PORTA,dat ;XXX nop nop bsf PORTA,clk nop nop bcf PORTA,clk nop nop ;---------------------- nop nop bcf PORTA,dat ;test PD1 btfsc test,1 ;XXX bsf PORTA,dat ;XXX nop nop bsf PORTA,clk nop nop bcf PORTA,clk nop nop ;---------------------- nop nop bsf PORTA,dat nop nop bsf PORTA,clk nop nop bcf PORTA,clk nop nop ;---------------------- nop nop bcf PORTA,dat nop nop bsf PORTA,clk nop nop bcf PORTA,clk nop nop ;---------------------- bcf PORTA,dat bcf PORTA,2 ;zrusit ENable komunikacce s BH1415F bsf PORTA,dat bsf PORTA,clk nop nop clrf PORTA goto Back_FM ;************************** tot_off clrf PORTB ;vypnuti FM & uplne vseho, musi byt na vsech portech 0, aby nedoslo k samozapinani bsf PORTC,2 clrf PORTC clrf PORTA off_lp sleep goto off_lp ;************************** org 0x400 ;************************** ;************************** ; Menu routines ;************************** ;************************** goto Menu0 goto Menu1 goto Menu2 goto Menu3 goto Menu4 goto Menu5 goto Menu6 goto Menu7 goto Menu8 goto Menu9 ;************************** Menu0 movlw b'10000001' movwf DATA4 ;Menu 0 - FREQ movlw b'11011111' movwf DATA5 movlw b'00000001' movwf DATA0 movlw b'10011000' movwf DATA1 movlw b'00110000' movwf DATA2 movlw b'10111000' movwf DATA3 goto cont_m ;-------------------------- Menu1 movlw b'11100111' movwf DATA4 ;Menu 1 - TRAN movlw b'11011111' movwf DATA5 movlw b'10100001' movwf DATA0 movlw b'10100000' movwf DATA1 movlw b'00110000' movwf DATA2 movlw b'11100011' movwf DATA3 goto cont_m ;-------------------------- Menu2 movlw b'10010010' movwf DATA4 ;Menu 2 - AUTO movlw b'11011111' movwf DATA5 movlw b'10000001' movwf DATA0 movlw b'11100011' movwf DATA1 movlw b'10000101' movwf DATA2 movlw b'10100000' movwf DATA3 goto cont_m ;-------------------------- Menu3 movlw b'11000010' movwf DATA4 ;Menu 3 - STER movlw b'11011111' movwf DATA5 movlw b'00110000' movwf DATA0 movlw b'10011000' movwf DATA1 movlw b'11100011' movwf DATA2 movlw b'11001000' movwf DATA3 goto cont_m ;-------------------------- Menu4 movlw b'11100100' movwf DATA4 ;Menu 4 - RdS movlw b'11011111' movwf DATA5 movlw b'11001000' movwf DATA0 movlw b'10000110' movwf DATA1 movlw b'00110000' movwf DATA2 movlw b'11111111' movwf DATA3 goto cont_m ;-------------------------- Menu5 movlw b'11001000' movwf DATA4 ;Menu 5 - L-FM movlw b'11011111' movwf DATA5 movlw b'00100001' movwf DATA0 movlw b'10111000' movwf DATA1 movlw b'11111110' movwf DATA2 movlw b'10011101' movwf DATA3 goto cont_m ;-------------------------- Menu6 movlw b'10001000' movwf DATA4 ;Menu 6 - MUTE movlw b'11011111' movwf DATA5 movlw b'10011000' movwf DATA0 movlw b'11100011' movwf DATA1 movlw b'10000101' movwf DATA2 movlw b'00100001' movwf DATA3 goto cont_m ;-------------------------- Menu7 movlw b'11100001' movwf DATA4 ;Menu 7 - MIC movlw b'11011111' movwf DATA5 movlw b'10011001' movwf DATA0 movlw b'11100111' movwf DATA1 movlw b'00100001' movwf DATA2 movlw b'11111111' movwf DATA3 goto cont_m ;-------------------------- Menu8 movlw b'10000000' movwf DATA4 ;Menu 8 - EQU movlw b'11011111' movwf DATA5 movlw b'10000101' movwf DATA0 movlw b'00000001' movwf DATA1 movlw b'10011000' movwf DATA2 movlw b'11111111' movwf DATA3 goto cont_m ;-------------------------- Menu9 movlw b'11000000' movwf DATA4 ;Menu 9 - CHAN movlw b'11011111' movwf DATA5 movlw b'10100001' movwf DATA0 movlw b'10100000' movwf DATA1 movlw b'10100100' movwf DATA2 movlw b'10011001' movwf DATA3 goto cont_m ;************************** ;* Wellcome note ;************************** str_up bcf STATUS,C rrf startup,0 movwf HLP bcf STATUS,C rrf HLP,1 bcf STATUS,C rrf HLP,1 movf HLP,0 ;rozdelit na 32 skoku call str_tab movwf DATA0 incf HLP,1 movf HLP,0 call str_tab movwf DATA1 incf HLP,1 movf HLP,0 call str_tab movwf DATA2 incf HLP,1 movf HLP,0 call str_tab movwf DATA3 goto Main ;************************* str_tab clrf PCLATH bsf PCLATH,2 ;(adresa 400H) addwf PCL,1 ; retlw b'11111110' ;- retlw b'11111110' ;- retlw b'11111110' ;- retlw b'11111111' ; retlw b'11111111' ; retlw b'11111111' ; retlw b'11111111' ; retlw b'01110100' ;Y retlw b'10100000' ;A retlw b'10000111' ;J retlw b'10011000' ;E retlw b'10011000' ;E retlw b'10000110' ;d retlw b'11111111' ; retlw b'10011000' ;E retlw b'10011001' ;C retlw b'10100000' ;A retlw b'10110000' ;P retlw b'11001000' ;S retlw b'11111111' ; retlw b'10001110' ;o retlw b'10011100' ;t retlw b'11111111' ; retlw b'10011000' ;E retlw b'00100001' ;M retlw b'10000001' ;O retlw b'10011001' ;C retlw b'10011101' ;L retlw b'10011101' ;L retlw b'10011000' ;E retlw b'00000101' ;W retlw b'11111111' ; retlw b'11111111' ; retlw b'11111111' ; retlw b'11111111' ; ;************************** ;************************** org 0x500 ;************************** ; LCD print routines ;************************** l0a bsf PORTC,0 movf DATA0,0 movwf PORTB bsf PORTC,4 bcf PORTC,4 movf DATA1,0 movwf PORTB bsf PORTC,5 bcf PORTC,5 movf DATA2,0 movwf PORTB bsf PORTC,6 bcf PORTC,6 movf DATA3,0 movwf PORTB bsf PORTC,7 bcf PORTC,7 goto bak_l0a ;************************** l0b bcf PORTC,0 movlw 0xFF xorwf DATA0,0 movwf PORTB bsf PORTC,4 bcf PORTC,4 movlw 0xFF xorwf DATA1,0 movwf PORTB bsf PORTC,5 bcf PORTC,5 movlw 0xFF xorwf DATA2,0 movwf PORTB bsf PORTC,6 bcf PORTC,6 movlw 0xFF xorwf DATA3,0 movwf PORTB bsf PORTC,7 bcf PORTC,7 goto bak_l0b ;************************** l1a bsf PORTC,1 movf DATA4,0 movwf PORTB bsf PORTC,4 bcf PORTC,4 movf DATA5,0 movwf PORTB bsf PORTC,5 bcf PORTC,5 movf DATA6,0 movwf PORTB bsf PORTC,6 bcf PORTC,6 movf DATA7,0 movwf PORTB bsf PORTC,7 bcf PORTC,7 goto bak_l1a ;************************** l1b bcf PORTC,1 movlw 0xFF xorwf DATA4,0 movwf PORTB bsf PORTC,4 bcf PORTC,4 movlw 0xFF xorwf DATA5,0 movwf PORTB bsf PORTC,5 bcf PORTC,5 movlw 0xFF xorwf DATA6,0 movwf PORTB bsf PORTC,6 bcf PORTC,6 movlw 0xFF xorwf DATA7,0 movwf PORTB bsf PORTC,7 bcf PORTC,7 goto bak_l1b ;************************** ;* org 0x600 ;************************** wr_ee ;bsf G_stat,7 movf ee_chan,0 movwf HLP movlw 0x3f call wr_wr swapf ee_chan,1 movf F_reg3,0 movwf HLP movlw 0 addwf ee_chan,0 call wr_wr movf F_reg2,0 movwf HLP movlw 1 addwf ee_chan,0 call wr_wr movf F_reg1,0 movwf HLP movlw 2 addwf ee_chan,0 call wr_wr movf F_reg0,0 movwf HLP movlw 3 addwf ee_chan,0 call wr_wr movf auto_rg,0 movwf HLP movlw 4 addwf ee_chan,0 call wr_wr movf PORTX,0 movwf HLP movlw 5 addwf ee_chan,0 call wr_wr movf G_stat,0 movwf HLP movlw 6 addwf ee_chan,0 call wr_wr movlw 0xaa movwf HLP movlw 7 addwf ee_chan,0 call wr_wr swapf ee_chan,1 goto cont ;-------------------------- wr_wr bsf STATUS,RP1 bcf STATUS,RP0 movwf EEADR movf HLP,0 movwf EEDATA bsf STATUS,RP0 bcf EECON1,EEPGD bsf EECON1,WREN movlw 0x55 movwf EECON2 movlw 0xaa movwf EECON2 bsf EECON1,WR clrf HLP wr_lo btfsc EECON1,WR goto wr_lo bcf EECON1,WREN bcf STATUS,RP0 bcf STATUS,RP1 return ;************************** org 0x700 ;************************** org 0x2007 dw b'11110100111111' ;RC;WDT_off;BrownOut_on;CP_off;LVP_off nop end