;******************************************************************************* ; ; Winamp vezérlő soros portra ; ; Authur: pixels ; Version: 1.1 ; ;******************************************************************************* ; processzor: pic16f228 LIST P=16F628 #INCLUDE "P16F628.INC" ; belső RC oszcillátor, kódvédelem ki, watchdog be, alacsonyfesz. prog. ki, ; brown-out reset ki, mclre ki, power-on timer be __CONFIG _INTRC_OSC_NOCLKOUT&_CP_OFF&_WDT_ON&_LVP_OFF&_BODEN_OFF&_MCLRE_OFF&_PWRTE_ON ; kijelzés pozíciói az LCD-n DP_LIST_POS EQU .0 ; lista pozíció DP_LIST_LEN EQU .0 ; lista hossza DP_TRK_POS EQU .66 ; zeneszám pozció DP_TRK_LEN EQU .0 ; zeneszám hossza DP_TRK_TITLE EQU .0 ; zeneszám címe DP_PLR_STATUS EQU .65 ; lejátszó állapot ; a címkiírásra szánt karakterek száma CN_TITLE EQU .8 ; bank0-ból elérhető regiszterek CBLOCK 0X20 ; átmeneti regiszterek LCDT1 ; lcd adat mentésére LCDT2 ; lcd státuszbitek LCDT3 ; LCD_DELAY függvény LCDT4 ; lcd kijelzés számlálója DELAYT1 ; DELAY függvény DELAYT2 DTT1 ; zeneszám címének kiírásához DTT2 BUTTON1 ; gombok tárolói BUTTON2 ; konvertálás eredményei CONV0 CONV1 CONV2 ; a lejátszó állapotának tárolói LIST_LEN_H ; lista hossza LIST_LEN_L LIST_POS_H ; aktuális szám a listán LIST_POS_L TRK_LEN_H ; szám hossza TRK_LEN_M TRK_LEN_L TRK_POS_H ; szám poziciója TRK_POS_M TRK_POS_L TRK_TITLE_LEN ; szám címének hossza TRK_TITLE_POS ; görgetésének poziciója TRK_TITLE_DIR ; görgetés iránya + várakozás PLR_STATUS ; lejátszó állapota ENDC ; bármely bankból elérhető regiszterek CBLOCK 0X70 ; megszakításhoz átmeneti tárolók W_SAVE ; Wreg S_SAVE ; Status ; usart reveive megsz. regiszterek R_SAVE ; RCREG COMMAND ; "futó" parancs COUNTER ; számláló ; eeprom adattároló EE_DATA ENDC ; bankváltásra #DEFINE BANK0 BCF STATUS,RP0 #DEFINE BANK1 BSF STATUS,RP0 ; lcd vazérlőbitek #DEFINE LCD_EN BSF PORTA,0 #DEFINE LCD_DIS BCF PORTA,0 #DEFINE LCD_RD BSF PORTA,1 #DEFINE LCD_WR BCF PORTA,1 #DEFINE LCD_CH BSF PORTA,2 #DEFINE LCD_RS BCF PORTA,2 ; lcd státusz #DEFINE LCD_BUSY LCDT2,0 #DEFINE LCD_DISPLAY LCDT2,1 #DEFINE LCD_CLEAR LCDT2,2 ; LCD_CHR függcény cgramba, vagy dramba ír #DEFINE LCD_DRAM 0X80 #DEFINE LCD_CGRAM 0X40 ; megszakítások bitjei #DEFINE INTB_T0 INTCON,T0IF #DEFINE INTB_RC PIR1,RCIF ; PLR_STATUS lehetséges értékei #DEFINE ST_PLAYING .1 #DEFINE ST_PAUSED .3 #DEFINE ST_STOPPED .0 ; parancsbájtok, bcd kódolás miatt ezek a számok nem lehetnek a ; parancsbeli adatok között, a szöveges adatoknál pedig az F0..FF ; tartományt nem használjuk #DEFINE CMD_NOP 0XFF #DEFINE CMD_STATUS 0XFE #DEFINE CMD_TRK_POS 0XFD #DEFINE CMD_TRK_DATAS 0XFC #DEFINE CMD_TRK_TITLE 0XFB #DEFINE CMD_CLOSE 0XF0 ORG 0X0000 NOP CALL INIT ; inicializálás CALL LCD_UPLOAD_ICONS ; speciális karakterek feltöltése GOTO BEGIN ; főprogram indítása ORG 0X0004 INTERRUP ; megszakítás CLRWDT MOVWF W_SAVE ; W és STATUS mentése, és bank0 SWAPF STATUS,W MOVWF S_SAVE BANK0 BTFSC INTB_T0 ; megszakítást kiváltó periféria GOTO INT_T0 ; keresése - timer0 BTFSC INTB_RC GOTO INT_RC ; usart receive GOTO INT_END INT_T0 BCF INTB_T0 ; timer0 megszaktás nyugtázva DECFSZ LCDT4 GOTO IT_BUTTONS BSF LCD_DISPLAY ; minden 16. megszakítás után kijelző frissítés MOVLW .16 MOVWF LCDT4 IT_BUTTONS BTFSC LCD_BUSY ; ha nincs adatforgalom az lcd felé, GOTO INT_END MOVF PORTB,W ANDLW 0XF0 MOVWF BUTTON1 XORWF BUTTON2,W ; és a gombok állapota megváltozott, SKPNZ GOTO INT_END MOVF BUTTON1,W MOVWF BUTTON2 CALL USART_SEND ; kiküldjük a pc-re a gombok állapotát GOTO INT_END INT_RC BCF INTB_RC ; usart receive megsz. nyugtázva MOVF RCREG,W MOVWF R_SAVE MOVF COMMAND,W ; parancsnak megfelelő rutin kiválasztása XORLW CMD_STATUS SKPNZ GOTO INT_RC_STATUS MOVF COMMAND,W XORLW CMD_TRK_POS SKPNZ GOTO INT_RC_TRK_POS MOVF COMMAND,W XORLW CMD_TRK_DATAS SKPNZ GOTO INT_RC_TRK_DATAS MOVF COMMAND,W XORLW CMD_TRK_TITLE SKPNZ GOTO INT_RC_TRK_TITLE INT_RC_NOP_OR_ILLEGAL_COMMAND ; parancsbyte vétele (vagy érvénytelen parancsbájt) CLRWDT MOVF R_SAVE,W ; parancs kezdet jelzése MOVWF COMMAND CLRF COUNTER GOTO INT_END INT_RC_STATUS ; lejátszó státusz vétele CLRWDT MOVF R_SAVE,W MOVWF PLR_STATUS MOVLW CMD_NOP ; parancs vége jelzése MOVWF COMMAND GOTO INT_END INT_RC_TRK_POS ; zene pozíciójának vétele CLRWDT INCF COUNTER IRTP_1 MOVF COUNTER,W ; első byte XORLW .1 SKPZ GOTO IRTP_2 MOVF R_SAVE,W MOVWF TRK_POS_H GOTO INT_END IRTP_2 MOVF COUNTER,W ; második byte XORLW .2 SKPZ GOTO IRTP_3 MOVF R_SAVE,W MOVWF TRK_POS_M GOTO INT_END IRTP_3 MOVF R_SAVE,W ; harmadik byte MOVWF TRK_POS_L MOVLW CMD_NOP ; parancs vége jelzése MOVWF COMMAND GOTO INT_END INT_RC_TRK_DATAS ; zene és lista adatai CLRWDT ; (zene hossza, lista pozíció, lista hossza) INCF COUNTER IRTD_1 MOVF COUNTER,W ; zene hossza - első bájt XORLW .1 SKPZ GOTO IRTD_2 MOVF R_SAVE,W MOVWF TRK_LEN_H GOTO INT_END IRTD_2 MOVF COUNTER,W ; zene hossza - második byte XORLW .2 SKPZ GOTO IRTD_3 MOVF R_SAVE,W MOVWF TRK_LEN_M GOTO INT_END IRTD_3 MOVF COUNTER,W ; zene hossza - harmadik byte XORLW .3 SKPZ GOTO IRTD_4 MOVF R_SAVE,W MOVWF TRK_LEN_L GOTO INT_END IRTD_4 MOVF COUNTER,W ; lista pozíció - első byte XORLW .4 SKPZ GOTO IRTD_5 MOVF R_SAVE,W MOVWF LIST_POS_H GOTO INT_END IRTD_5 MOVF COUNTER,W ; lista pozíció - második byte XORLW .5 SKPZ GOTO IRTD_6 MOVF R_SAVE,W MOVWF LIST_POS_L GOTO INT_END IRTD_6 MOVF COUNTER,W ; lista hossza - első byte XORLW .6 SKPZ GOTO IRTD_7 MOVF R_SAVE,W MOVWF LIST_LEN_H GOTO INT_END IRTD_7 MOVF R_SAVE,W ; lista hossza - második byte MOVWF LIST_LEN_L MOVLW CMD_NOP ; parancs vége jelzés MOVWF COMMAND GOTO INT_END INT_RC_TRK_TITLE ; szám címe CLRWDT CLRF TRK_TITLE_LEN MOVF R_SAVE,W XORLW CMD_CLOSE SKPZ GOTO IRTT_NEXT_CHAR ; ha vége a címküldésnek, akkor MOVF COUNTER,W MOVWF TRK_TITLE_LEN ; cím hosszának rögzítése CLRF TRK_TITLE_POS ; pozíció nullázása MOVLW .16 MOVWF TRK_TITLE_DIR ; görgetés reset BSF LCD_CLEAR ; lcd törlés jelzés MOVLW CMD_NOP ; parancs vége jelzés MOVWF COMMAND GOTO INT_END IRTT_NEXT_CHAR CLRWDT MOVF R_SAVE,W ; ha nincs vége a címküldésnek, MOVWF EE_DATA ; akkor karakter rögzítáése az eeprom-ban MOVF COUNTER,W CALL EE_WRITE INCF COUNTER,F GOTO INT_END INT_END CLRWDT SWAPF S_SAVE,W ; W és STATUS visszatöltése, bankváltásra MOVWF STATUS ; nincs szükség, hiszen a STATUS regiszter SWAPF W_SAVE,F ; visszatöltésével megtörténik SWAPF W_SAVE,W RETFIE ; vasszatérés a megszaktásból BEGIN NOP NOP CLRWDT NOP NOP BTFSC LCD_DISPLAY GOTO DISPLAY BTFSC LCD_CLEAR GOTO CLEAR GOTO BEGIN CLEAR ; kijelző törlés BCF LCD_CLEAR MOVLW B'00000001' CALL LCD_REG GOTO BEGIN DISPLAY ; kijelző frissítés BCF LCD_DISPLAY CALL DISPLAY_TRK_TITLE CALL DISPLAY_PLR_STATUS CALL DISPLAY_TRK_POS ; CALL DISPLAY_TRK_LEN ; CALL DISPLAY_LIST_POS ; CALL DISPLAY_LIST_LEN GOTO BEGIN INIT ; általános regiszterek inicializálása CLRF LIST_LEN_H ; lista hossza 0000 CLRF LIST_LEN_L CLRF LIST_POS_H ; lista pozíciója 0000 CLRF LIST_POS_L CLRF TRK_LEN_H ; zeneszám hossza 00:00 CLRF TRK_LEN_M CLRF TRK_LEN_L CLRF TRK_POS_H ; zeneszám pozíciója 00:00 CLRF TRK_POS_M CLRF TRK_POS_L CLRF TRK_TITLE_LEN ; zeneszám címének hossza, CLRF TRK_TITLE_POS ; pozíciója 0, görgetés balra CLRF TRK_TITLE_DIR BSF TRK_TITLE_DIR,2 MOVLW ST_STOPPED ; lejátszó állapota: leállítva MOVWF PLR_STATUS MOVLW .16 ; lcd kijelzés minden 16. timer0 MOVWF LCDT4 ; megszakítás után CLRF LCDT2 ; LCD_BUSY és LCD_DISPLAY bitek = 0 MOVLW CMD_NOP ; nincs usart parancs MOVWF COMMAND CLRF COUNTER ; számláló nullázás CLRWDT ; processzor beállítása MOVLW B'00000111' ; porta bemenetei digitálisak MOVWF CMCON MOVLW B'11100000' ; timer0 megsz. be MOVWF INTCON BANK1 MOVLW B'11111000' ; porta 3..7 bemenetek MOVWF TRISA MOVLW B'00001011' ; portb 0,1,3 bemenetek MOVWF TRISB MOVLW B'10000101' ; portb felh. ell. ki, timer0 MOVWF OPTION_REG ; belső oszc., előosztás : 64 MOVLW B'00100000' MOVWF PIE1 ; RX megszakítás bekapcsolva MOVLW .207 MOVWF SPBRG ; 1200 bit per second MOVLW B'00100100' MOVWF TXSTA ; aszinkron 8-bites nagysebességű adás BANK0 MOVLW B'10010000' ; aszinkron 8-bites folyamatos vétel, MOVWF RCSTA ; port bekapcsolva CALL LCD_INIT ; lcd inicializálása RETURN ; kijelzés függvények DISPLAY_TRK_POS ; zeneszám pozíció kiírása (6 karakter) MOVLW LCD_DRAM | DP_TRK_POS CALL LCD_REG ; hely beállítása az lcd-n MOVF TRK_POS_H,W ; perc 1. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás karakterré MOVF CONV2,W XORLW '0' ; ha nem '0', akkor SKPNZ GOTO DTP_1 MOVF CONV2,W ; a kerakter kíírása CALL LCD_CHR GOTO DTP_2 DTP_1 MOVLW ' ' ; egyébként üres hely kiírása CALL LCD_CHR DTP_2 MOVF TRK_POS_M,W ; perc 2. és 3. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás karakterekké MOVF CONV1,W ; 2. karakter kiírása CALL LCD_CHR MOVF CONV2,W ; 3. karakter kiírása CALL LCD_CHR MOVLW ':' ; kettőspont a perc után CALL LCD_CHR MOVF TRK_POS_L,W ; másodperc 1. és 2. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás kaakterekké MOVF CONV1,W ; 1. karakter kiírása CALL LCD_CHR MOVF CONV2,W ; 3. karakter kiírása CALL LCD_CHR RETURN DISPLAY_TRK_LEN ; zeneszám hosszának kiírása (6 karakter) MOVLW LCD_DRAM | DP_TRK_LEN CALL LCD_REG ; hely beállítása az lcd-n MOVF TRK_LEN_H,W ; perc 1. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás karakterré MOVF CONV2,W XORLW '0' ; ha nem '0', akkor SKPNZ GOTO DTL_1 MOVF CONV2,W ; a kerakter kíírása CALL LCD_CHR GOTO DTL_2 DTL_1 MOVLW ' ' ; egyébként üres hely kiírása CALL LCD_CHR DTL_2 MOVF TRK_LEN_M,W ; perc 2. és 3. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás karakterekké MOVF CONV1,W ; 2. karakter kiírása CALL LCD_CHR MOVF CONV2,W ; 3. karakter kiírása CALL LCD_CHR MOVLW ':' ; kettőspont a perc után CALL LCD_CHR MOVF TRK_LEN_L,W ; másodperc 1. és 2. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás kaakterekké MOVF CONV1,W ; 1. karakter kiírása CALL LCD_CHR MOVF CONV2,W ; 3. karakter kiírása CALL LCD_CHR RETURN DISPLAY_LIST_POS ; lista pozíció (4 karakter) MOVLW LCD_DRAM | DP_LIST_POS CALL LCD_REG ; hely beállítása az lcd-n MOVF LIST_POS_H,W ; lista poz. 1. és 2. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás karakterekké MOVF CONV1,W ; 1. karakter kiírása CALL LCD_CHR MOVF CONV2,W ; 2. karakter kiírása CALL LCD_CHR MOVF LIST_POS_L,W ; lista poz. 3. és 4. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás kaakterekké MOVF CONV1,W ; 3. karakter kiírása CALL LCD_CHR MOVF CONV2,W ; 4. karakter kiírása CALL LCD_CHR RETURN DISPLAY_LIST_LEN ; lista hossz (4 karakter) MOVLW LCD_DRAM | DP_LIST_LEN CALL LCD_REG ; hely beállítása az lcd-n MOVF LIST_LEN_H,W ; listahossz 1. és 2. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás karakterekké MOVF CONV1,W ; 1. karakter kiírása CALL LCD_CHR MOVF CONV2,W ; 2. karakter kiírása CALL LCD_CHR MOVF LIST_LEN_L,W ; listahossz 3. és 4. számjegy (bcd) CALL BCD_TO_CHR ; konvertálás kaakterekké MOVF CONV1,W ; 3. karakter kiírása CALL LCD_CHR MOVF CONV2,W ; 4. karakter kiírása CALL LCD_CHR RETURN DISPLAY_PLR_STATUS ; lejátszó státusz (1 karakter) MOVLW LCD_DRAM | DP_PLR_STATUS CALL LCD_REG ; hely beállítása az lcd-n MOVF PLR_STATUS,W ; ikon kiírása CALL LCD_CHR RETURN DISPLAY_TRK_TITLE ; zeneszám címe (CN_TITLE számú karakter) CALL CALC_DTT ; pozíció számolása MOVF TRK_TITLE_LEN,W ; ha a zeneszám hossza 0, SKPNZ ; akkor nincs kijelzés RETURN MOVLW LCD_DRAM | DP_TRK_TITLE CALL LCD_REG ; hely beállítása az lcd-n MOVF TRK_TITLE_LEN,W ADDLW -CN_TITLE ; ha a kijelzésre szánt hely SKPNC ; hossza több mint a szám GOTO DTT_MAX_LEN ; címének hossza, MOVF TRK_TITLE_LEN,W ; akkor a kijelzés hossza a szám GOTO DTT_SET_LEN ; címének hossza, DTT_MAX_LEN MOVLW CN_TITLE ; egyébként a beállított maximális DTT_SET_LEN ; hossz MOVWF DTT1 ; kijelzés hossza a DTT1 reg.-ben MOVF TRK_TITLE_POS,W MOVWF DTT2 ; eeprom pozció a dtt2-ben DTT_CYCLE MOVF DTT2,W ; eeprom pozció a W-be CALL EE_READ ; eeprom olvasás CALL LCD_CHR ; krakter kirás INCF DTT2,F ; eeprom pozíció növelése DECFSZ DTT1,F ; kijelzés számláló csökkentése, GOTO DTT_CYCLE ; he kell, ugrás vissza RETURN CALC_DTT ; címkijelzés pozíció, MOVF TRK_TITLE_LEN,W ; cím görgetés frissítése ADDLW -CN_TITLE SKPNC GOTO CD_CALC CD_NO_CALC CLRF TRK_TITLE_POS RETURN CD_CALC MOVF TRK_TITLE_DIR,W ANDLW B'01111111' SKPNZ GOTO CD_NOSKIP DECF TRK_TITLE_DIR,F RETURN CD_NOSKIP BTFSC TRK_TITLE_DIR,7 GOTO CD_TORIGHT CD_TOLEFT MOVLW CN_TITLE SUBWF TRK_TITLE_LEN,W XORWF TRK_TITLE_POS,W SKPNZ GOTO CD_TOLEFT2 INCF TRK_TITLE_POS,F GOTO CD_END CD_TOLEFT2 MOVLW .16 + B'10000000' MOVWF TRK_TITLE_DIR GOTO CD_END CD_TORIGHT MOVF TRK_TITLE_POS,W SKPNZ GOTO CD_TORIGHT2 DECF TRK_TITLE_POS,F GOTO CD_END CD_TORIGHT2 MOVLW .16 MOVWF TRK_TITLE_DIR CD_END RETURN ; késleltető függvények DELAY ; kb w*1000 ciklus várakozás MOVWF DELAYT1 DELAYA MOVLW .250 MOVWF DELAYT2 DELAYB CLRWDT DECFSZ DELAYT2,F GOTO DELAYB DECFSZ DELAYT1,F GOTO DELAYA RETURN ; szám konvertáló függvény BCD_TO_CHR ; bcd -> 2 char MOVWF CONV1 SWAPF CONV1,F ANDLW 0X0F ADDLW '0' MOVWF CONV2 MOVF CONV1,W ANDLW 0X0F ADDLW '0' MOVWF CONV1 MOVLW ' ' MOVWF CONV0 RETURN ; usart függvények USART_SEND ; usárt küldés CLRWDT BTFSS PIR1,TXIF GOTO USART_SEND MOVWF TXREG RETURN ; eeprom függvények EE_READ ; eeprom olvasás BANK1 MOVWF EEADR BSF EECON1,RD MOVFW EEDATA MOVWF EE_DATA BANK0 RETURN EE_WRITE ; eeprom írás BANK1 MOVWF EEADR EE_WRITE_1 CLRWDT BTFSC EECON1,WR GOTO EE_WRITE_1 BCF INTCON,GIE MOVF EE_DATA,W MOVWF EEDATA BSF EECON1,WREN MOVLW 0X55 MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR BSF INTCON,GIE BANK0 RETURN ; lcd függvények LCD_INIT ; lcd inicializálás BSF LCD_BUSY LCD_WR LCD_RS MOVLW .50 CALL DELAY MOVLW 0X30 ; 0x30 kiírása háromszor MOVWF PORTB LCD_EN LCD_DIS MOVLW .5 CALL DELAY MOVLW 0X30 MOVWF PORTB LCD_EN LCD_DIS MOVLW .1 CALL DELAY MOVLW 0X30 MOVWF PORTB LCD_EN LCD_DIS MOVLW .1 CALL DELAY MOVLW 0X20 ; átállás 4 bites módba, innen használhatók MOVWF PORTB ; az LCD_CHR és LCD_REG függvények LCD_EN LCD_DIS BANK1 MOVLW B'11111011' ; portb bemenet (usart bit kimenet) MOVWF TRISB BANK0 MOVLW B'00001100' ; kijelző bekapcsolás CALL LCD_REG MOVLW B'00011100' ; kurzor jobbra mozog CALL LCD_REG MOVLW B'00101000' ; 4 bites, 2 soros mód, karakter 7 pixel magas CALL LCD_REG MOVLW B'00000001' ; kijelző törlése CALL LCD_REG MOVLW B'00000010' ; kurzor és kijelző alaphelyzetbe CALL LCD_REG RETURN LCD_CHR ; lcd karakter kiírás BSF LCD_BUSY MOVWF LCDT1 CALL LCD_WAIT LCD_CH GOTO LCD_WRITE LCD_REG ; lcd regiszter kiírás BSF LCD_BUSY MOVWF LCDT1 CALL LCD_WAIT LCD_RS LCD_WRITE CALL LCD_DELAY BANK1 MOVLW B'00001011' ; portb kimenet MOVWF TRISB BANK0 MOVF LCDT1,W ; felső 4 bit; ANDLW 0XF0 MOVWF PORTB LCD_EN LCD_DIS CALL LCD_DELAY SWAPF LCDT1,W ; alsó 4 bit; ANDLW 0XF0 MOVWF PORTB LCD_EN LCD_DIS CALL LCD_DELAY BANK1 MOVLW B'11111011' ; portb bemenet MOVWF TRISB BANK0 BCF LCD_BUSY RETURN LCD_DELAY ; rövid várakozás lcd-nek MOVLW .16 MOVWF LCDT3 LCD_DELAY_LOOP CLRWDT DECFSZ LCDT3,F GOTO LCD_DELAY_LOOP RETURN LCD_WAIT ; várakozás sz lcd művelet befejezéséig LCD_RS LCD_RD LCD_WAITA LCD_EN RLF PORTB,W LCD_DIS LCD_EN CLRWDT LCD_DIS SKPNC GOTO LCD_WAITA LCD_WR RETURN LCD_UPLOAD_ICONS ; a specióális ikonok felvitele; MOVLW LCD_CGRAM | .0 ; stop ikon CALL LCD_REG MOVLW B'00000000' CALL LCD_CHR MOVLW B'00000000' CALL LCD_CHR MOVLW B'00001110' CALL LCD_CHR MOVLW B'00001110' CALL LCD_CHR MOVLW B'00001110' CALL LCD_CHR MOVLW B'00000000' CALL LCD_CHR MOVLW B'00000000' CALL LCD_CHR MOVLW B'00000000' CALL LCD_CHR MOVLW B'00000000' ; play ikon CALL LCD_CHR MOVLW B'00001000' CALL LCD_CHR MOVLW B'00001100' CALL LCD_CHR MOVLW B'00001110' CALL LCD_CHR MOVLW B'00001100' CALL LCD_CHR MOVLW B'00001000' CALL LCD_CHR MOVLW B'00000000' CALL LCD_CHR MOVLW B'00000000' CALL LCD_CHR MOVLW LCD_CGRAM | .24 ; pause ikon CALL LCD_REG MOVLW B'00000000' CALL LCD_CHR MOVLW B'00010010' CALL LCD_CHR MOVLW B'00010010' CALL LCD_CHR MOVLW B'00010010' CALL LCD_CHR MOVLW B'00010010' CALL LCD_CHR MOVLW B'00010010' CALL LCD_CHR MOVLW B'00000000' CALL LCD_CHR MOVLW B'00000000' CALL LCD_CHR RETURN END