FREQUENCIMETRO COM PIC 16F628 16F84 E DISPLAY LCD 16X2


FREQUENCIMETRO COM PIC 16F628 16F84 E DISPLAY LCD 16X2

16F628 ASM E HEX
Para  PIC 16F628A
Para PIC 16F628-04








ASM 16F628
Para  PIC 16F628A

********************************************************************

;===============================================================================
;    Filename: freq_628.asm                                                
;    Date: 23/03/2004                                                 
;    File Version: 1.0                                                
;    Orig. Files: Peter Halicky  OM3CPH & Peter Halicky Jr., OM2PH ex OM2APH
;    Rewrite: Vila Real para QRP BR ask from PY2RLM - RENATO
;================================================================================
;    Files required: vdisplay.inc                                                  
;================================================================================
;    Notes:
; Remoção das rotinas de Lcd, inclusão da vdisplay.inc
; Correção da diretiva Radix
; Inclusão de pag. de memória
; Relocação de variáveis
; Recálculo de T1=241,T2=5 ,T3=46,T4=7,Z=2 p/ 20MHz
;      T1=252,T2=11,T3=4 ,T4=2,Z=3 p/ 4MHz 
;================================================================================

;================================================================================
;DIRETIVAS DE COMPILAÇÃO
;================================================================================
LIST P=16F628A ;list directive to define processor
#INCLUDE <p16f628A.inc> ;processor specific variable definitions
__IDLOCS      2003 ;dados a serem gravados na EEPROM
    ERRORLEVEL      -302      ;suppress bank selection messages
    RADIX           DEC ;set to decimal
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_BODEN_OFF&_LVP_OFF


;=================================================================================
;VARIABLE DEFINITIONS
;=================================================================================
CBLOCK 0x20 ;endereço inicial p/ variáveis
Index               ;dummy register
Count               ;inkremental register
Help                ;dummy register

LED0              
LED1              
LED2              
LED3        
LED4        
LED5        
LED6        

TimerH               ;the highest byte of SW counter
LowB              ;low byte of resulted frequency
MidB                 ;middle byte of resulted frequency
HigB                 ;high byte of resulted frequency
TEMP                 ;temporary register
HIndex               ;index register
LEDIndex             ;LED pointer
R1                   ;Timing counters
R2          
R3          

temp   
w_temp ;variable used for context saving 
status_temp ;variable used for context saving
tmpLcdRegister  ;devem permanecer no final
LcdDelayCounter ;pois ocupam 4 bytes
ENDC

;=================================================================================
;PAGINAÇÃO DE MEMÓRIA
;=================================================================================
#DEFINE BANK0 BCF STATUS,RP0 ;seta bank0 de memória
#DEFINE BANK1 BSF STATUS,RP0 ;seta bank1 de memória

;=================================================================================
;Timing Loop values    ; QRP BR - AQUI SÃO OS AJUSTES
;=================================================================================
T1          equ       252               ;first timing loop     
T2          equ       11          ;second timing loop
T3          equ       4         ;third timing loop
T4          equ       2        ;last timing loop

;=================================================================================
;Vetor de Reset
;=================================================================================
        org     0x00
        goto    Init

;=================================================================================
;Inicialização
;=================================================================================
Init        clrf       STATUS      ; Do initialization, Select bank 0
            clrf       INTCON      ; Clear int-flags, Disable interrupts
            clrf       PCLATH      ; Keep in lower 2KByte
            clrf       PORTA       ; ALL PORT output should output Low.
            clrf       PORTB

            clrf       Index
            clrf       LEDIndex

            clrf       LED0
            clrf       LED1
            clrf       LED2
            clrf       LED3
            clrf       LED4
            clrf       LED5
            clrf       LED6

            clrf       LowB
            clrf       MidB
            clrf       HigB

            bsf        STATUS,RP0

            movlw      b'00010000' ; RA0..RA3 outputs
            movwf      TRISA       ; RA4 input

            movlw      0xF0        ; RB0..RB3 outputs, rest inputs
            movwf      TRISB

            bsf        OPTION_REG,NOT_RBPU ; Disable PORTB pull-ups

            clrwdt
            movlw      b'10100111' ; Prescaler -> TMR0,
            movwf      OPTION_REG  ; 1:256, rising edge
            bcf        STATUS,RP0  ;

BANK1
    movlw      0x0F
    andwf      TRISB,W
    movwf      TRISB      ; Set Port for output
BANK0

;=================================================================================
;Initialization of LCD display
call LcdInit
call ShowLoad
call ShowName
call ShowHello
call LcdClear
call ShowName
;=================================================================================
            goto    Start         

;=================================================================================
; Numeric routines
;=================================================================================
; 3 byte substraction of the constant from the table which sets carry if
; result is negative
;=================================================================================
Subc24      clrf       TEMP       ; it will TEMPorary save C
            movf       Index,W    ; pointer to low byte of constant
            movwf      HIndex     ; W -> HIndex
            call       DecTable   ; W returned with low byte of constant
            bsf        STATUS,C   ; set C
            subwf      LowB,F     ; LowB - W -> LowB
                                  ; if underflow -> C=0
            btfsc      STATUS,C
            goto       Step1
            bsf        STATUS,C
            movlw      1
            subwf      MidB,F     ; decrement MidB
                                  ; if underflow -> C=0
            btfsc      STATUS,C
            goto       Step1

            bsf        STATUS,C
            movlw      1
            subwf      HigB,F     ; decrement HigB
            btfsc      STATUS,C   ; if underflow -> C=0
            goto       Step1
            bsf        TEMP,C     ; set C

Step1       decf       HIndex,F
            movf       HIndex,W   ; pointer to middle byte of const
            call       DecTable
            bsf        STATUS,C
            subwf      MidB,F     ; MidB - W -> MidB
            btfsc      STATUS,C   ; if underflow -> C=0
            goto       Step2
            bsf        STATUS,C
            movlw      1
            subwf      HigB,1     ; decrement HigB
            btfsc      STATUS,C   ; if underflow -> C=0
            goto       Step2
            bsf        TEMP,C     ; set C

Step2       decf       HIndex,F
            movf       HIndex,W   ; pointer to middle byte of constatnt
            call       DecTable
            bsf        STATUS,C
            subwf      HigB,F     ; HigB - W -> HigB
            btfsc      STATUS,C   ; if underflow -> C=0
            goto       ClearCF
            bsf        STATUS,C
            goto       SubEnd
ClearCF     rrf        TEMP,C     ; C -> STATUS
SubEnd      retlw      0

;=================================================================================
; 3 byte addition of the constant from the table which sets carry if
; result overflows
;=================================================================================
Addc24      clrf       TEMP       ; register for TEMPorary storage of C
            movf       Index,W    ; pointer to lower byte of const into W
            movwf      HIndex     ; save it into HIndex
            call       DecTable   ; W contains low byte of const
            bcf        STATUS,C   ; clear C
            addwf      LowB,1     ; W + LowB -> LowB
            btfss      STATUS,C   ; test overflow
            goto       Add2
            bcf        STATUS,C   ; clear C
            movlw      1
            addwf      MidB,F     ; increment MidB
            btfss      STATUS,C
            goto       Add2
            bcf        STATUS,C
            movlw      1
            addwf      HigB,F     ; increment HigB
            btfss      STATUS,C   ; test overflow
            goto       Add2
            bsf        TEMP,C     ; store C
Add2        decf       HIndex,F   ; pointer to middle byte into W
            movf       HIndex,W
            call       DecTable
            bcf        STATUS,C
            addwf      MidB,1     ; W + MidB -> MidB
            btfss      STATUS,C
            goto       Add3
            bcf        STATUS,C   ; clear C
            movlw      1
            addwf      HigB,1     ; increment HigB
            btfss      STATUS,C
            goto       Add3
            bsf        TEMP,C
Add3        decf       HIndex,F   ; pointer to higher byte into W
            movf       HIndex,W
            call       DecTable
            bsf        STATUS,C
            addwf      HigB,F     ; W + HigB -> HigB,
            btfss      STATUS,C
            goto       ClarCF
            bsf        STATUS,C
            goto       AddEnd
ClarCF      rrf        TEMP,C     ; C -> STATUS
AddEnd      retlw      0

;=================================================================================
;Tables for 3 byte constants
;Table of decades
;=================================================================================
DecTable    addwf      PCL,F      ; W + PCL -> PCL
            retlw      0          ; 10
            retlw      0          ;
            retlw      0Ah        ;

            retlw      0          ; 100
            retlw      0          ;
            retlw      064h       ;

            retlw      0          ; 1 000
            retlw      03h        ;
            retlw      0E8h       ;

            retlw      0          ; 10 000
            retlw      027h       ;
            retlw      010h       ;

            retlw      01h        ; 100 000
            retlw      086h       ;
            retlw      0A0h       ;

            retlw      0Fh        ; 1 000 000
            retlw      042h       ;
            retlw      040h       ;

;=================================================================================
;Entry point for main cycle
;=================================================================================
;Routine for the conversion of 3 byte number into 7 decimal numbers
;=================================================================================
Start       movlw      6*3-1      ; pointer to dec. table
            movwf      Index      ; 6*3-1 -> Index

            movlw      9          ; maximum of substractions
            movwf      Count      ; 9 -> Count

            clrf       Help

            movlw      6
            movwf      LEDIndex

Divide      call       Subc24     ; substract untill result is negative,
            btfsc      STATUS,C   ; add last substracted number
            goto       Add24      ; next digit
            incf       Help,F
            decf       Count,F
            btfss      STATUS,Z
            goto       Divide
            movlw      3
            subwf      Index,F
            goto       Next

Add24       call       Addc24
            movlw      03h
            subwf      Index,F

Next        movlw      9
            movwf      Count
            movlw      LED1       ; LED1 -> W
            addwf      LEDIndex,W ; LED1 + LEDIndex -> W
            movwf      TEMP
            decf       TEMP,F     ; LEDIndex+LED1-1 -> TEMP
            movf       TEMP,W

            movwf      FSR        ; W -> FSR
            movf       Help,W     ; Help -> W
            clrf       Help       ; save result at LEDx
            movwf      INDF       ; W -> LED(6..1)
            decf       LEDIndex,F

            movlw      1
            addwf      Index,W
            btfss      STATUS,Z
            goto       Divide

            movf       LowB,W
            movwf      LED0       ; the rest -> LED0

;=================================================================================
;registers LED0..LED6 are filled with values - ready to be displayed
;=================================================================================
            movlw      6
            movwf      LEDIndex

movlw      10H ;Locate LCD cursor on row 1, col 0
            call       LcdLocate
     
LEDCycle    movlw      LED0        ;LED0 -> W
            addwf      LEDIndex,W ;LED1 + LEDIndex -> W

            movwf      FSR        ;W -> FSR
            movf       INDF,W      ;LED(0..6) -> W

            iorlw      030h
            call       LcdSendData    ;Display character

            ;movlw      5            ;test for decimal point
            movlw      5             ;test for decimal point
            bsf        STATUS,Z
            subwf      LEDIndex,W
            btfss      STATUS,Z
            goto       NoDot
            movlw      '.'          ;this can be ' ' or ',' ......
            call       LcdSendData      ;Display character

NoDot       decfsz     LEDIndex,F
            goto       LEDCycle    ;continue with next number

            movlw      LED0        ;LED0 -> W
            addwf      LEDIndex,W  ;LED0 + LEDIndex -> W

            movwf      FSR          ;W -> FSR
            movf       INDF,W      ;[FSR] -> W

            iorlw      030h
call       LcdSendData      ;Display character

            movlw      ' '
            call       LcdSendData      ;Display character
            movlw      'M'
            call       LcdSendData      ;Display character
            movlw      'H'
            call       LcdSendData      ;Display character
            movlw      'z'
            call       LcdSendData      ;Display character

movlw    10H ;Locate LCD cursor on row 1, col 0
            call       LcdLocate

;=================================================================================
;It is time to prepare new measuring cycle
;=================================================================================
            clrf       TimerH
            clrf       TMR0
            nop                    ;it is SUGGESTED...
            nop

            clrf       LEDIndex

            movlw      T1          ;set initial counter values
            movwf      R1
            movlw      T2
            movwf      R2
            movlw      T3
            movwf      R3

            clrf       INTCON      ;global INT disable, TMR0 INT disable
                                   ;clear TMR0 overflow bite

;=================================================================================
;Start measurement:  RA3 + RA4 set input
;=================================================================================
            movlw      b'00010000' ;all ports set L, RA4 set H
            movwf      PORTA

            bsf        STATUS,RP0
            movlw      b'00011111' ;RA0..RA4 input
            movwf      TRISA
            bcf        STATUS,RP0

;=================================================================================
;It is opened now...
;=================================================================================
Cycle       btfss      INTCON,2   ;1   Test for TMR0 overflow
            goto       Nothing    ;3
            incf       TimerH,F   ;3
            bcf        INTCON,2   ;4
            goto       Nxt        ;6

Nothing     nop                   ;4
            nop                   ;5
            nop                   ;6

Nxt         decfsz     R1,F       ;7
            goto       Cycle      ;9
            movlw      T1         ;9*T1

            movwf      R1         ;9*T1+1
            decfsz     R2,F       ;9*T1+2
            goto       Cycle      ;9*T1+4
            movlw      T2         ;9*T1+4)*T2

            movwf      R2         ;(9*T1+4)*T2+1
            decfsz     R3,F       ;(9*T1+4)*T2+2
            goto       Cycle      ;(9*T1+4)*T2+4

;=================================================================================
;Final test for TMR0 overflow
;=================================================================================
            movlw      T4         ;((9*T1+4)*T2+4)*T3
            movwf      Help       ;((9*T1+4)*T2+4)*T3+1

Cycle2      btfss      INTCON,2   ;1
            goto       Not2Do     ;3
            incf       TimerH,F   ;3
            bcf        INTCON,2   ;4
            goto       Nx         ;6

Not2Do      nop                   ;4
            nop                   ;5
            nop                   ;6

Nx          decfsz     Help,F     ;7
            goto       Cycle2     ;9
            nop                   ;((9*T1+4)*T2+4)*T3+1+9*T4+Z
;=================================================================================
; Z times fine tuning nops        ; altere aqui os nop para calibrar, aumentando
            nop                   ; ou diminuindo.
            nop
            nop

;=================================================================================
; Stop the measurement
;=================================================================================
            clrw                   ;1
            movwf      PORTB       ;2
            movlw      b'00010000' ;3   RA0..RA3 = 0
            movwf      PORTA       ;4   W -> PORTA
                                   ;((9*T1+4)*T2+4)*T3+1+9*T4+Z+4
            bsf        STATUS,RP0  ;
            movlw      b'00010111' ;RA3 output
            movwf      TRISA       ;RA0..RA2,RA4 input
            bcf        STATUS,RP0  ;

;=================================================================================
; Analyse precounter and store counted value in registers
;=================================================================================
            movf       TMR0,W
            movwf      MidB        ;TMR0 -> MidB

            movf       TimerH,W
            movwf      HigB        ;TimerH -> HigB

            clrf       TEMP

CountIt     incf       TEMP,F
            bsf        PORTA,3     ;_| false impulz
            bcf        PORTA,3     ;|_

            bcf        INTCON,2
            movf       TMR0,W      ;actual TMR0 -> W
            bcf        STATUS,Z
            subwf      MidB,W
            btfsc      STATUS,Z
            goto       CountIt
            incf       TEMP,F
            comf       TEMP,F
            incf       TEMP,F
            incf       TEMP,W

            movwf      LowB
            goto       Start          ;start new cycle

;================================================================================
;Include Files
;================================================================================
#INCLUDE <vdisplay.inc>

END


************************************************************************

HEX 16F628
Para  PIC 16F628A

************************************************************************


:020000040000FA
:10000000012883018B018A0185018601A001B001CD
:10001000A301A401A501A601A701A801A901AB01A3
:10002000AC01AD01831610308500F03086008117D9
:100030006400A7308100831283160F300605860006
:10004000831232218721AD21CA214921AD21912876
:10005000AE012008AF007E200314AB0203183B283A
:1000600003140130AC0203183B2803140130AD0225
:1000700003183B282E14AF032F087E200314AC0274
:100080000318482803140130AD02031848282E1421
:10009000AF032F087E200314AD0203185128031468
:1000A00052282E0C0034AE012008AF007E20031031
:1000B000AB07031C662803100130AC07031C66283D
:1000C00003100130AD07031C66282E14AF032F0860
:1000D0007E200310AC07031C732803100130AD070A
:1000E000031C73282E14AF032F087E200314AD07C2
:1000F000031C7C2803147D282E0C00348207003456
:1001000000340A3400340034643400340334E834F6
:1001100000342734103401348634A0340F34423490
:1001200040341130A0000930A100A2010630B00017
:1001300028200318A228A20AA103031D982803302F
:10014000A002A52853200330A0020930A1002430CA
:100150003007AE00AE032E0884002208A201800002
:10016000B00301302007031D98282B08A300063098
:10017000B00010304E2123303007840000083038A2
:100180005921053003153002031DC8282E3059218E
:10019000B00BBB28233030078400000830385921C9
:1001A000203059214D305921483059217A30592178
:1001B00010304E21AA01810100000000B001FC3086
:1001C000B1000B30B2000430B3008B011030850059
:1001D00083161F30850083120B1DF128AA0A0B110C
:1001E000F428000000000000B10BEC28FC30B10046
:1001F000B20BEC280B30B200B30BEC280230A2009B
:100200000B1D0529AA0A0B11082900000000000097
:10021000A20B00290000000000000000030186007E
:100220001030850083161730850083120108AC005A
:100230002A08AD00AE01AE0A851585110B11010823
:1002400003112C0203191B29AE0AAE09AE0A2E0AAD
:10025000AB009128B900B8010000B80B2C29B90BEC
:100260002C2908001E302A210611061686160613B0
:10027000861380218021802106128616061386139C
:10028000802128305C2106305C210C305C21492122
:10029000080001305C2102302A210800B7008030BC
:1002A000B80037080F39B804371A381738085C21F6
:1002B000080006155F21080006115F210800B7003D
:1002C0000612861206138613371A0616B71A8616F2
:1002D000371B0617B71B86178021061286120613D6
:1002E000861337180616B718861637190617B71962
:1002F00086178021080018305C2196302A210800DA
:10030000861501302A21861101302A21080000308B
:100310004E214C3059216F305921613059216430C0
:100320005921693059216E305921673059212E30B9
:1003300059212E3059212E305921FF302A211030D9
:100340004E210D30B40023305921FF302A21B40B47
:10035000A329FF302A214921080000304E214630D0
:1003600059215230592145305921513059215530A8
:100370005921453059214E305921433059214930B6
:1003800059214130592120305921FF302A21FF3095
:100390002A21080010304E21513059215230592164
:1003A00050305921203059214230592152305921A1
:1003B0002030592146305921523059214530592198
:1003C000513059212030592121305921FF302A2123
:0E03D000FF302A21FF302A21FF302A210800A9
:084000000200000000000300B3
:02400E00213F50
:00000001FF

************************************************************************


ASM 
Para  PIC 16F628A


************************************************************************

MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  1


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

                      00001 ;===============================================================================
                      00002 ;    Filename: freq_628.asm                                                
                      00003 ;    Date: 23/03/2004                                                 
                      00004 ;    File Version: 1.0                                                
                      00005 ;    Orig. Files: Peter Halicky  OM3CPH & Peter Halicky Jr., OM2PH ex OM2APH
                      00006 ;    Rewrite: Vila Real para QRP BR ask from PY2RLM - RENATO
                      00007 ;================================================================================
                      00008 ;    Files required: vdisplay.inc                                                  
                      00009 ;================================================================================
                      00010 ;    Notes:
                      00011 ;               Remo  o das rotinas de Lcd, inclus o da vdisplay.inc
                      00012 ;               Corre  o da diretiva Radix
                      00013 ;               Inclus o de pag. de mem ria
                      00014 ;               Reloca  o de vari veis
                      00015 ;               Rec lculo de T1=241,T2=5 ,T3=46,T4=7,Z=2 p/ 20MHz
                      00016 ;                            T1=252,T2=11,T3=4 ,T4=2,Z=3 p/ 4MHz 
                      00017 ;================================================================================
                      00018 
                      00019 ;================================================================================
                      00020 ;DIRETIVAS DE COMPILA  O
                      00021 ;================================================================================
                      00022         LIST                    P=16F628A                       ;list directive to define processor
                      00023         #INCLUDE                <p16f628A.inc>          ;processor specific variable definitions
                      00001         LIST
                      00002 ; P16F628A.INC  Standard Header File, Version 1.10    Microchip Technology, Inc.
                      00265         LIST
2000   0002 0000 0000 00024         __IDLOCS        2003                            ;dados a serem gravados na EEPROM
       0003 
                      00025     ERRORLEVEL      -302                        ;suppress bank selection messages
                      00026     RADIX           DEC                                 ;set to decimal
2007   3F21           00027         __CONFIG                _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_BODEN_OFF&_LVP_OFF
                      00028 
                      00029 
                      00030 ;=================================================================================
                      00031 ;VARIABLE DEFINITIONS
                      00032 ;=================================================================================
                      00033         CBLOCK          0x20                            ;endere o inicial p/ vari veis
  00000020            00034                                 Index               ;dummy register
  00000021            00035                                 Count               ;inkremental register
  00000022            00036                                 Help                ;dummy register
                      00037 
  00000023            00038                                 LED0              
  00000024            00039                                 LED1              
  00000025            00040                                 LED2              
  00000026            00041                                 LED3        
  00000027            00042                                 LED4        
  00000028            00043                                 LED5        
  00000029            00044                                 LED6        
                      00045 
  0000002A            00046                                 TimerH               ;the highest byte of SW counter
                      00047                                 
  0000002B            00048                                 LowB                     ;low byte of resulted frequency
  0000002C            00049                                 MidB                 ;middle byte of resulted frequency
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  2


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

  0000002D            00050                                 HigB                 ;high byte of resulted frequency
                      00051                                 
  0000002E            00052                                 TEMP                 ;temporary register
  0000002F            00053                                 HIndex               ;index register
  00000030            00054                                 LEDIndex             ;LED pointer
                      00055                                 
  00000031            00056                                 R1                   ;Timing counters
  00000032            00057                                 R2          
  00000033            00058                                 R3          
                      00059 
  00000034            00060                                 temp   
  00000035            00061                                 w_temp                          ;variable used for context saving 
  00000036            00062                                 status_temp                     ;variable used for context saving
  00000037            00063                                 tmpLcdRegister          ;devem permanecer no final
  00000038            00064                                 LcdDelayCounter         ;pois ocupam 4 bytes
                      00065         ENDC                    
                      00066 
                      00067 ;=================================================================================
                      00068 ;PAGINA  O DE MEM RIA
                      00069 ;=================================================================================
                      00070 #DEFINE BANK0   BCF     STATUS,RP0      ;seta bank0 de mem ria
                      00071 #DEFINE BANK1   BSF     STATUS,RP0      ;seta bank1 de mem ria
                      00072 
                      00073 ;=================================================================================
                      00074 ;Timing Loop values    ; QRP BR - AQUI S O OS AJUSTES
                      00075 ;=================================================================================
  000000FC            00076 T1          equ       252               ;first timing loop     
  0000000B            00077 T2          equ       11                ;second timing loop
  00000004            00078 T3          equ       4                 ;third timing loop
  00000002            00079 T4          equ       2                 ;last timing loop
                      00080 
                      00081 ;=================================================================================
                      00082 ;Vetor de Reset
                      00083 ;=================================================================================
0000                  00084                 org     0x00
0000   2801           00085                 goto    Init
                      00086 
                      00087 ;=================================================================================
                      00088 ;Inicializa  o
                      00089 ;=================================================================================
0001   0183           00090 Init        clrf       STATUS      ; Do initialization, Select bank 0
0002   018B           00091             clrf       INTCON      ; Clear int-flags, Disable interrupts
0003   018A           00092             clrf       PCLATH      ; Keep in lower 2KByte
0004   0185           00093             clrf       PORTA       ; ALL PORT output should output Low.
0005   0186           00094             clrf       PORTB
                      00095 
0006   01A0           00096             clrf       Index
0007   01B0           00097             clrf       LEDIndex
                      00098 
0008   01A3           00099             clrf       LED0
0009   01A4           00100             clrf       LED1
000A   01A5           00101             clrf       LED2
000B   01A6           00102             clrf       LED3
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  3


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

000C   01A7           00103             clrf       LED4
000D   01A8           00104             clrf       LED5
000E   01A9           00105             clrf       LED6
                      00106 
000F   01AB           00107             clrf       LowB
0010   01AC           00108             clrf       MidB
0011   01AD           00109             clrf       HigB
                      00110 
0012   1683           00111             bsf        STATUS,RP0
                      00112 
0013   3010           00113             movlw      b'00010000' ; RA0..RA3 outputs
0014   0085           00114             movwf      TRISA       ; RA4 input
                      00115 
0015   30F0           00116             movlw      0xF0        ; RB0..RB3 outputs, rest inputs
0016   0086           00117             movwf      TRISB
                      00118 
0017   1781           00119             bsf        OPTION_REG,NOT_RBPU ; Disable PORTB pull-ups
                      00120 
0018   0064           00121             clrwdt
0019   30A7           00122             movlw      b'10100111' ; Prescaler -> TMR0,
001A   0081           00123             movwf      OPTION_REG  ; 1:256, rising edge
001B   1283           00124             bcf        STATUS,RP0  ;
                      00125 
001C   1683           00126                         BANK1
001D   300F           00127                 movlw      0x0F
001E   0506           00128                     andwf      TRISB,W
001F   0086           00129                     movwf      TRISB      ; Set Port for output
0020   1283           00130                         BANK0
                      00131 
                      00132 ;=================================================================================
                      00133 ;Initialization of LCD display
0021   2132           00134                         call    LcdInit
0022   2187           00135                         call    ShowLoad
0023   21AD           00136                         call    ShowName
0024   21CA           00137                         call    ShowHello       
0025   2149           00138                         call    LcdClear
0026   21AD           00139                         call    ShowName
                      00140 ;=================================================================================
0027   2891           00141             goto    Start         
                      00142 
                      00143 ;=================================================================================
                      00144 ; Numeric routines
                      00145 ;=================================================================================
                      00146 ; 3 byte substraction of the constant from the table which sets carry if
                      00147 ; result is negative
                      00148 ;=================================================================================
0028   01AE           00149 Subc24      clrf       TEMP       ; it will TEMPorary save C
0029   0820           00150             movf       Index,W    ; pointer to low byte of constant
002A   00AF           00151             movwf      HIndex     ; W -> HIndex
002B   207E           00152             call       DecTable   ; W returned with low byte of constant
002C   1403           00153             bsf        STATUS,C   ; set C
002D   02AB           00154             subwf      LowB,F     ; LowB - W -> LowB
                      00155                                   ; if underflow -> C=0
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  4


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

002E   1803           00156             btfsc      STATUS,C
002F   283B           00157             goto       Step1
0030   1403           00158             bsf        STATUS,C
0031   3001           00159             movlw      1
0032   02AC           00160             subwf      MidB,F     ; decrement MidB
                      00161                                   ; if underflow -> C=0
0033   1803           00162             btfsc      STATUS,C
0034   283B           00163             goto       Step1
                      00164 
0035   1403           00165             bsf        STATUS,C
0036   3001           00166             movlw      1
0037   02AD           00167             subwf      HigB,F     ; decrement HigB
0038   1803           00168             btfsc      STATUS,C   ; if underflow -> C=0
0039   283B           00169             goto       Step1
003A   142E           00170             bsf        TEMP,C     ; set C
                      00171 
003B   03AF           00172 Step1       decf       HIndex,F
003C   082F           00173             movf       HIndex,W   ; pointer to middle byte of const
003D   207E           00174             call       DecTable
003E   1403           00175             bsf        STATUS,C
003F   02AC           00176             subwf      MidB,F     ; MidB - W -> MidB
0040   1803           00177             btfsc      STATUS,C   ; if underflow -> C=0
0041   2848           00178             goto       Step2
0042   1403           00179             bsf        STATUS,C
0043   3001           00180             movlw      1
0044   02AD           00181             subwf      HigB,1     ; decrement HigB
0045   1803           00182             btfsc      STATUS,C   ; if underflow -> C=0
0046   2848           00183             goto       Step2
0047   142E           00184             bsf        TEMP,C     ; set C
                      00185 
0048   03AF           00186 Step2       decf       HIndex,F
0049   082F           00187             movf       HIndex,W   ; pointer to middle byte of constatnt
004A   207E           00188             call       DecTable
004B   1403           00189             bsf        STATUS,C
004C   02AD           00190             subwf      HigB,F     ; HigB - W -> HigB
004D   1803           00191             btfsc      STATUS,C   ; if underflow -> C=0
004E   2851           00192             goto       ClearCF
004F   1403           00193             bsf        STATUS,C
0050   2852           00194             goto       SubEnd
0051   0C2E           00195 ClearCF     rrf        TEMP,C     ; C -> STATUS
0052   3400           00196 SubEnd      retlw      0
                      00197 
                      00198 ;=================================================================================
                      00199 ; 3 byte addition of the constant from the table which sets carry if
                      00200 ; result overflows
                      00201 ;=================================================================================
0053   01AE           00202 Addc24      clrf       TEMP       ; register for TEMPorary storage of C
0054   0820           00203             movf       Index,W    ; pointer to lower byte of const into W
0055   00AF           00204             movwf      HIndex     ; save it into HIndex
0056   207E           00205             call       DecTable   ; W contains low byte of const
0057   1003           00206             bcf        STATUS,C   ; clear C
0058   07AB           00207             addwf      LowB,1     ; W + LowB -> LowB
0059   1C03           00208             btfss      STATUS,C   ; test overflow
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  5


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

005A   2866           00209             goto       Add2
005B   1003           00210             bcf        STATUS,C   ; clear C
005C   3001           00211             movlw      1
005D   07AC           00212             addwf      MidB,F     ; increment MidB
005E   1C03           00213             btfss      STATUS,C
005F   2866           00214             goto       Add2
0060   1003           00215             bcf        STATUS,C
0061   3001           00216             movlw      1
0062   07AD           00217             addwf      HigB,F     ; increment HigB
0063   1C03           00218             btfss      STATUS,C   ; test overflow
0064   2866           00219             goto       Add2
0065   142E           00220             bsf        TEMP,C     ; store C
0066   03AF           00221 Add2        decf       HIndex,F   ; pointer to middle byte into W
0067   082F           00222             movf       HIndex,W
0068   207E           00223             call       DecTable
0069   1003           00224             bcf        STATUS,C
006A   07AC           00225             addwf      MidB,1     ; W + MidB -> MidB
006B   1C03           00226             btfss      STATUS,C
006C   2873           00227             goto       Add3
006D   1003           00228             bcf        STATUS,C   ; clear C
006E   3001           00229             movlw      1
006F   07AD           00230             addwf      HigB,1     ; increment HigB
0070   1C03           00231             btfss      STATUS,C
0071   2873           00232             goto       Add3
0072   142E           00233             bsf        TEMP,C
0073   03AF           00234 Add3        decf       HIndex,F   ; pointer to higher byte into W
0074   082F           00235             movf       HIndex,W
0075   207E           00236             call       DecTable
0076   1403           00237             bsf        STATUS,C
0077   07AD           00238             addwf      HigB,F     ; W + HigB -> HigB,
0078   1C03           00239             btfss      STATUS,C
0079   287C           00240             goto       ClarCF
007A   1403           00241             bsf        STATUS,C
007B   287D           00242             goto       AddEnd
007C   0C2E           00243 ClarCF      rrf        TEMP,C     ; C -> STATUS
007D   3400           00244 AddEnd      retlw      0
                      00245 
                      00246 ;=================================================================================
                      00247 ;Tables for 3 byte constants
                      00248 ;Table of decades
                      00249 ;=================================================================================
007E   0782           00250 DecTable    addwf      PCL,F      ; W + PCL -> PCL
007F   3400           00251             retlw      0          ; 10
0080   3400           00252             retlw      0          ;
0081   340A           00253             retlw      0Ah        ;
                      00254 
0082   3400           00255             retlw      0          ; 100
0083   3400           00256             retlw      0          ;
0084   3464           00257             retlw      064h       ;
                      00258 
0085   3400           00259             retlw      0          ; 1 000
0086   3403           00260             retlw      03h        ;
0087   34E8           00261             retlw      0E8h       ;
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  6


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

                      00262 
0088   3400           00263             retlw      0          ; 10 000
0089   3427           00264             retlw      027h       ;
008A   3410           00265             retlw      010h       ;
                      00266 
008B   3401           00267             retlw      01h        ; 100 000
008C   3486           00268             retlw      086h       ;
008D   34A0           00269             retlw      0A0h       ;
                      00270 
008E   340F           00271             retlw      0Fh        ; 1 000 000
008F   3442           00272             retlw      042h       ;
0090   3440           00273             retlw      040h       ;
                      00274 
                      00275 ;=================================================================================
                      00276 ;Entry point for main cycle
                      00277 ;=================================================================================
                      00278 ;Routine for the conversion of 3 byte number into 7 decimal numbers
                      00279 ;=================================================================================
0091   3011           00280 Start       movlw      6*3-1      ; pointer to dec. table
0092   00A0           00281             movwf      Index      ; 6*3-1 -> Index
                      00282 
0093   3009           00283             movlw      9          ; maximum of substractions
0094   00A1           00284             movwf      Count      ; 9 -> Count
                      00285 
0095   01A2           00286             clrf       Help
                      00287 
0096   3006           00288             movlw      6
0097   00B0           00289             movwf      LEDIndex
                      00290 
0098   2028           00291 Divide      call       Subc24     ; substract untill result is negative,
0099   1803           00292             btfsc      STATUS,C   ; add last substracted number
009A   28A2           00293             goto       Add24      ; next digit
009B   0AA2           00294             incf       Help,F
009C   03A1           00295             decf       Count,F
009D   1D03           00296             btfss      STATUS,Z
009E   2898           00297             goto       Divide
009F   3003           00298             movlw      3
00A0   02A0           00299             subwf      Index,F
00A1   28A5           00300             goto       Next
                      00301 
00A2   2053           00302 Add24       call       Addc24
00A3   3003           00303             movlw      03h
00A4   02A0           00304             subwf      Index,F
                      00305 
00A5   3009           00306 Next        movlw      9
00A6   00A1           00307             movwf      Count
00A7   3024           00308             movlw      LED1       ; LED1 -> W
00A8   0730           00309             addwf      LEDIndex,W ; LED1 + LEDIndex -> W
00A9   00AE           00310             movwf      TEMP
00AA   03AE           00311             decf       TEMP,F     ; LEDIndex+LED1-1 -> TEMP
00AB   082E           00312             movf       TEMP,W
                      00313 
00AC   0084           00314             movwf      FSR        ; W -> FSR
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  7


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

00AD   0822           00315             movf       Help,W     ; Help -> W
00AE   01A2           00316             clrf       Help       ; save result at LEDx
00AF   0080           00317             movwf      INDF       ; W -> LED(6..1)
00B0   03B0           00318             decf       LEDIndex,F
                      00319 
00B1   3001           00320             movlw      1
00B2   0720           00321             addwf      Index,W
00B3   1D03           00322             btfss      STATUS,Z
00B4   2898           00323             goto       Divide
                      00324 
00B5   082B           00325             movf       LowB,W
00B6   00A3           00326             movwf      LED0       ; the rest -> LED0
                      00327 
                      00328 ;=================================================================================
                      00329 ;registers LED0..LED6 are filled with values - ready to be displayed
                      00330 ;=================================================================================
00B7   3006           00331             movlw      6
00B8   00B0           00332             movwf      LEDIndex
                      00333 
00B9   3010           00334                         movlw      10H                          ;Locate LCD cursor on row 1, col 0
00BA   214E           00335             call       LcdLocate
                      00336      
00BB   3023           00337 LEDCycle    movlw      LED0                     ;LED0 -> W
00BC   0730           00338             addwf      LEDIndex,W               ;LED1 + LEDIndex -> W
                      00339 
00BD   0084           00340             movwf      FSR                      ;W -> FSR
00BE   0800           00341             movf       INDF,W                   ;LED(0..6) -> W
                      00342 
00BF   3830           00343             iorlw      030h
00C0   2159           00344             call       LcdSendData      ;Display character
                      00345 
                      00346             ;movlw      5                       ;test for decimal point
00C1   3005           00347             movlw      5                        ;test for decimal point
00C2   1503           00348             bsf        STATUS,Z
00C3   0230           00349             subwf      LEDIndex,W
00C4   1D03           00350             btfss      STATUS,Z
00C5   28C8           00351             goto       NoDot
00C6   302E           00352             movlw      '.'                      ;this can be ' ' or ',' ......
00C7   2159           00353             call       LcdSendData      ;Display character
                      00354 
00C8   0BB0           00355 NoDot       decfsz     LEDIndex,F
00C9   28BB           00356             goto       LEDCycle                 ;continue with next number
                      00357 
00CA   3023           00358             movlw      LED0                     ;LED0 -> W
00CB   0730           00359             addwf      LEDIndex,W               ;LED0 + LEDIndex -> W
                      00360 
00CC   0084           00361             movwf      FSR                      ;W -> FSR
00CD   0800           00362             movf       INDF,W                   ;[FSR] -> W
                      00363 
00CE   3830           00364             iorlw      030h
00CF   2159           00365                         call       LcdSendData          ;Display character
                      00366 
00D0   3020           00367             movlw      ' '
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  8


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

00D1   2159           00368             call       LcdSendData      ;Display character
00D2   304D           00369             movlw      'M'
00D3   2159           00370             call       LcdSendData      ;Display character
00D4   3048           00371             movlw      'H'
00D5   2159           00372             call       LcdSendData      ;Display character
00D6   307A           00373             movlw      'z'
00D7   2159           00374             call       LcdSendData      ;Display character
                      00375 
00D8   3010           00376                         movlw      10H                          ;Locate LCD cursor on row 1, col 0
00D9   214E           00377             call           LcdLocate
                      00378 
                      00379 ;=================================================================================
                      00380 ;It is time to prepare new measuring cycle
                      00381 ;=================================================================================
00DA   01AA           00382             clrf       TimerH
00DB   0181           00383             clrf       TMR0
00DC   0000           00384             nop                    ;it is SUGGESTED...
00DD   0000           00385             nop
                      00386 
00DE   01B0           00387             clrf       LEDIndex
                      00388 
00DF   30FC           00389             movlw      T1          ;set initial counter values
00E0   00B1           00390             movwf      R1
00E1   300B           00391             movlw      T2
00E2   00B2           00392             movwf      R2
00E3   3004           00393             movlw      T3
00E4   00B3           00394             movwf      R3
                      00395 
00E5   018B           00396             clrf       INTCON      ;global INT disable, TMR0 INT disable
                      00397                                    ;clear TMR0 overflow bite
                      00398 
                      00399 ;=================================================================================
                      00400 ;Start measurement:  RA3 + RA4 set input
                      00401 ;=================================================================================
00E6   3010           00402             movlw      b'00010000' ;all ports set L, RA4 set H
00E7   0085           00403             movwf      PORTA
                      00404 
00E8   1683           00405             bsf        STATUS,RP0
00E9   301F           00406             movlw      b'00011111' ;RA0..RA4 input
00EA   0085           00407             movwf      TRISA
00EB   1283           00408             bcf        STATUS,RP0
                      00409 
                      00410 ;=================================================================================
                      00411 ;It is opened now...
                      00412 ;=================================================================================
00EC   1D0B           00413 Cycle       btfss      INTCON,2   ;1   Test for TMR0 overflow
00ED   28F1           00414             goto       Nothing    ;3
00EE   0AAA           00415             incf       TimerH,F   ;3
00EF   110B           00416             bcf        INTCON,2   ;4
00F0   28F4           00417             goto       Nxt        ;6
                      00418 
00F1   0000           00419 Nothing     nop                   ;4
00F2   0000           00420             nop                   ;5
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE  9


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

00F3   0000           00421             nop                   ;6
                      00422 
00F4   0BB1           00423 Nxt         decfsz     R1,F       ;7
00F5   28EC           00424             goto       Cycle      ;9
00F6   30FC           00425             movlw      T1         ;9*T1
                      00426 
00F7   00B1           00427             movwf      R1         ;9*T1+1
00F8   0BB2           00428             decfsz     R2,F       ;9*T1+2
00F9   28EC           00429             goto       Cycle      ;9*T1+4
00FA   300B           00430             movlw      T2         ;9*T1+4)*T2
                      00431 
00FB   00B2           00432             movwf      R2         ;(9*T1+4)*T2+1
00FC   0BB3           00433             decfsz     R3,F       ;(9*T1+4)*T2+2
00FD   28EC           00434             goto       Cycle      ;(9*T1+4)*T2+4
                      00435 
                      00436 ;=================================================================================
                      00437 ;Final test for TMR0 overflow
                      00438 ;=================================================================================
00FE   3002           00439             movlw      T4         ;((9*T1+4)*T2+4)*T3
00FF   00A2           00440             movwf      Help       ;((9*T1+4)*T2+4)*T3+1
                      00441 
0100   1D0B           00442 Cycle2      btfss      INTCON,2   ;1
0101   2905           00443             goto       Not2Do     ;3
0102   0AAA           00444             incf       TimerH,F   ;3
0103   110B           00445             bcf        INTCON,2   ;4
0104   2908           00446             goto       Nx         ;6
                      00447 
0105   0000           00448 Not2Do      nop                   ;4
0106   0000           00449             nop                   ;5
0107   0000           00450             nop                   ;6
                      00451 
0108   0BA2           00452 Nx          decfsz     Help,F     ;7
0109   2900           00453             goto       Cycle2     ;9
010A   0000           00454             nop                   ;((9*T1+4)*T2+4)*T3+1+9*T4+Z
                      00455 ;=================================================================================
                      00456 ; Z times fine tuning nops        ; altere aqui os nop para calibrar, aumentando
010B   0000           00457             nop                   ; ou diminuindo.
010C   0000           00458             nop
010D   0000           00459             nop
                      00460 
                      00461 ;=================================================================================
                      00462 ; Stop the measurement
                      00463 ;=================================================================================
010E   0103           00464             clrw                   ;1
010F   0086           00465             movwf      PORTB       ;2
0110   3010           00466             movlw      b'00010000' ;3   RA0..RA3 = 0
0111   0085           00467             movwf      PORTA       ;4   W -> PORTA
                      00468                                    ;((9*T1+4)*T2+4)*T3+1+9*T4+Z+4
0112   1683           00469             bsf        STATUS,RP0  ;
0113   3017           00470             movlw      b'00010111' ;RA3 output
0114   0085           00471             movwf      TRISA       ;RA0..RA2,RA4 input
0115   1283           00472             bcf        STATUS,RP0  ;
                      00473 
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 10


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

                      00474 ;=================================================================================
                      00475 ; Analyse precounter and store counted value in registers
                      00476 ;=================================================================================
0116   0801           00477             movf       TMR0,W
0117   00AC           00478             movwf      MidB        ;TMR0 -> MidB
                      00479 
0118   082A           00480             movf       TimerH,W
0119   00AD           00481             movwf      HigB        ;TimerH -> HigB
                      00482 
011A   01AE           00483             clrf       TEMP
                      00484 
011B   0AAE           00485 CountIt     incf       TEMP,F
011C   1585           00486             bsf        PORTA,3     ;_| false impulz
011D   1185           00487             bcf        PORTA,3     ;|_
                      00488 
011E   110B           00489             bcf        INTCON,2
011F   0801           00490             movf       TMR0,W      ;actual TMR0 -> W
0120   1103           00491             bcf        STATUS,Z
0121   022C           00492             subwf      MidB,W
0122   1903           00493             btfsc      STATUS,Z
0123   291B           00494             goto       CountIt
0124   0AAE           00495             incf       TEMP,F
0125   09AE           00496             comf       TEMP,F
0126   0AAE           00497             incf       TEMP,F
0127   0A2E           00498             incf       TEMP,W
                      00499 
0128   00AB           00500             movwf      LowB
0129   2891           00501             goto       Start          ;start new cycle
                      00502 
                      00503 ;================================================================================
                      00504 ;Include Files
                      00505 ;================================================================================
                      00506 #INCLUDE        <vdisplay.inc>                  
                      00001 ;===============================================================================
                      00002 ;    Filename: vdisplay.inc                                                
                      00003 ;    Date: 18/06/2003                                                 
                      00004 ;    File Version: 1.0 para QRP QB a pedido de PY2RLM
                      00005 ;    Original file: OM3CPH                                                
                      00006 ;    Author: Vila Real                                                    
                      00007 ;    Company: WVR-2000                                                
                      00008 ;================================================================================
                      00009 ;    Files required:                                                  
                      00010 ;================================================================================
                      00011 ;    Notes:
                      00012 ;================================================================================
                      00013 
                      00014 ;================================================================================
                      00015 ;CONSTANTS DEFINITIONS
                      00016 ;================================================================================
                      00017 ;LCD Control lines
  00000002            00018 LCD_RS          equ     2       ;Register Select
  00000003            00019 LCD_E           equ     3       ;Enable
                      00020 
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 11


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

                      00021 ;LCD data line bus
  00000004            00022 LCD_DB4         equ     4       ;LCD data line DB4
  00000005            00023 LCD_DB5         equ     5       ;LCD data line DB5
  00000006            00024 LCD_DB6         equ     6       ;LCD data line DB6
  00000007            00025 LCD_DB7         equ     7       ;LCD data line DB7
                      00026 
                      00027 ;=================================================================================
                      00028 ;Rotina de retardo, onde w=tempo em ms - clock=20MHz
                      00029 ;=================================================================================
012A   00B9           00030 LcdDelay                movwf   LcdDelayCounter+1       ;duas vari veis em uma
012B   01B8           00031                         clrf    LcdDelayCounter+0
                      00032                                 ;return                                         ;retorno p/debug********
                            *********
012C                  00033 LcdDelayLoop    ;goto   $+1                                     ;1 ms (about) internal loop
                      00034                                 ;goto   $+1                                     ;equivale a 2xnop
                      00035                                 ;goto   $+1                                     ;todas linhas comentadas
                      00036                                 ;goto   $+1                                     ;p/ 4Mhz
                      00037                                 ;goto   $+1                                     ;
                      00038                                 ;goto   $+1                                     ;
                      00039                                 ;goto   $+1                                     ;
                      00040                                 ;goto   $+1                                     ;
012C   0000           00041                                 nop                                                     ;
012D   0BB8           00042                 decfsz  LcdDelayCounter+0,F             ;dec. o prim. cont.
012E   292C           00043                 goto    LcdDelayLoop
012F   0BB9           00044                 decfsz  LcdDelayCounter+1,F             ;dec. o seg. cont.
0130   292C           00045                 goto    LcdDelayLoop
0131   0008           00046                 return
                      00047 
                      00048 ;=================================================================================
                      00049 ;Rotinas de controle do LCD
                      00050 ;=================================================================================
0132   301E           00051 LcdInit                 movlw   30              ;Wait 30 ms
0133   212A           00052                 call    LcdDelay
                      00053 
0134   1106           00054                 bcf     PORTB,LCD_RS    ;Set LCD command mode
                      00055 
0135   1606           00056                 bsf     PORTB,LCD_DB4   ;0011->48
0136   1686           00057                 bsf     PORTB,LCD_DB5           
0137   1306           00058                 bcf     PORTB,LCD_DB6
0138   1386           00059                 bcf     PORTB,LCD_DB7
0139   2180           00060                 call    LcdPulse_E              ;sequ ncia de reset
013A   2180           00061                 call    LcdPulse_E
013B   2180           00062                 call    LcdPulse_E
                      00063 
013C   1206           00064                 bcf     PORTB,LCD_DB4   ;0010->32
013D   1686           00065                 bsf     PORTB,LCD_DB5
013E   1306           00066                 bcf     PORTB,LCD_DB6
013F   1386           00067                 bcf     PORTB,LCD_DB7
0140   2180           00068                 call    LcdPulse_E
                      00069 
0141   3028           00070                 movlw   28H                             ;Set 4 bit data bus length
0142   215C           00071                 call    LcdSendCommand
0143   3006           00072                 movlw   06H                             ;Entry mode set, increment, no shift
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 12


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

0144   215C           00073                 call    LcdSendCommand
0145   300C           00074                 movlw   0CH                             ;Display ON, Curson OFF, Blink OFF
0146   215C           00075                 call    LcdSendCommand
0147   2149           00076                 call    LcdClear                ;clear display
0148   0008           00077                 return
                      00078 
0149   3001           00079 LcdClear                movlw   01H
014A   215C           00080                 call    LcdSendCommand
014B   3002           00081                 movlw   2               ;Wait 2 ms
014C   212A           00082                 call    LcdDelay
014D   0008           00083                 return
                      00084 
014E   00B7           00085 LcdLocate       movwf   tmpLcdRegister+0        ;Locate cursor on LCD
014F   3080           00086                                 movlw   80H                                     ;W = D7-D4 row, D3-D0 co
                            l
0150   00B8           00087                                 movwf   tmpLcdRegister+1        ;00h=linha0/10h=linha1
0151   0837           00088                 movf    tmpLcdRegister+0,W
0152   390F           00089                 andlw   0FH
0153   04B8           00090                 iorwf   tmpLcdRegister+1,F
0154   1A37           00091                 btfsc   tmpLcdRegister+0,4
0155   1738           00092                 bsf     tmpLcdRegister+1,6
0156   0838           00093                 movf    tmpLcdRegister+1,W
0157   215C           00094                 call    LcdSendCommand
0158   0008           00095                 return
                      00096 
0159   1506           00097 LcdSendData                     bsf     PORTB,LCD_RS
015A   215F           00098                         call    LcdSendByte
015B   0008           00099                     return
                      00100 
015C   1106           00101 LcdSendCommand          bcf     PORTB,LCD_RS
015D   215F           00102                         call    LcdSendByte
015E   0008           00103                         return
                      00104 
015F   00B7           00105 LcdSendByte             movwf   tmpLcdRegister          ;Send a byte to LCD by 4 bit data bus
                      00106                 
0160   1206           00107                 bcf     PORTB,LCD_DB4           ;Send highter four bits
0161   1286           00108                 bcf     PORTB,LCD_DB5
0162   1306           00109                 bcf     PORTB,LCD_DB6
0163   1386           00110                 bcf     PORTB,LCD_DB7
                      00111 
0164   1A37           00112                 btfsc   tmpLcdRegister,4
0165   1606           00113                 bsf     PORTB,LCD_DB4
0166   1AB7           00114                 btfsc   tmpLcdRegister,5
0167   1686           00115                 bsf     PORTB,LCD_DB5
0168   1B37           00116                 btfsc   tmpLcdRegister,6
0169   1706           00117                 bsf     PORTB,LCD_DB6
016A   1BB7           00118                 btfsc   tmpLcdRegister,7
016B   1786           00119                 bsf     PORTB,LCD_DB7
                      00120 
016C   2180           00121                 call    LcdPulse_E
                      00122                 
016D   1206           00123                 bcf     PORTB,LCD_DB4           ;Send lower four bits
016E   1286           00124                 bcf     PORTB,LCD_DB5
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 13


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

016F   1306           00125                 bcf     PORTB,LCD_DB6
0170   1386           00126                 bcf     PORTB,LCD_DB7
                      00127 
0171   1837           00128                 btfsc   tmpLcdRegister,0
0172   1606           00129                 bsf     PORTB,LCD_DB4
0173   18B7           00130                 btfsc   tmpLcdRegister,1
0174   1686           00131                 bsf     PORTB,LCD_DB5
0175   1937           00132                 btfsc   tmpLcdRegister,2
0176   1706           00133                 bsf     PORTB,LCD_DB6
0177   19B7           00134                 btfsc   tmpLcdRegister,3
0178   1786           00135                 bsf     PORTB,LCD_DB7
                      00136 
0179   2180           00137                                 call    LcdPulse_E
017A   0008           00138                 return
                      00139 
017B   3018           00140 LcdShiftL               movlw   18h                             ;Shift Mensagem 
017C   215C           00141                                 call    LcdSendCommand
017D   3096           00142                                 movlw   150     
017E   212A           00143                                 call    LcdDelay
017F   0008           00144                                 return
                      00145 
0180   1586           00146 LcdPulse_E              bsf     PORTB,LCD_E     ;Enables LCD
0181   3001           00147                 movlw   1               ;Wait 1ms
0182   212A           00148                 call    LcdDelay
0183   1186           00149                 bcf     PORTB,LCD_E     ;Disabled LCD
0184   3001           00150                 movlw   1               ;Wait 1ms
0185   212A           00151                 call    LcdDelay
0186   0008           00152                 return
                      00153 
                      00154 ;===============================================================================
                      00155 ;Rotinas gen ricas
                      00156 ;===============================================================================
0187   3000           00157 ShowLoad                movlw   00H                             ;Locate LCD cursor on row 0, col 0
0188   214E           00158                 call    LcdLocate
0189   304C           00159                 movlw   'L'                             ;Shows "Loading..." string on LCD
018A   2159           00160                 call    LcdSendData
018B   306F           00161                 movlw   'o'
018C   2159           00162                 call    LcdSendData
018D   3061           00163                 movlw   'a'
018E   2159           00164                 call    LcdSendData
018F   3064           00165                 movlw   'd'
0190   2159           00166                 call    LcdSendData
0191   3069           00167                 movlw   'i'
0192   2159           00168                 call    LcdSendData
0193   306E           00169                 movlw   'n'
0194   2159           00170                 call    LcdSendData
0195   3067           00171                 movlw   'g'
0196   2159           00172                 call    LcdSendData
0197   302E           00173                 movlw   '.'
0198   2159           00174                 call    LcdSendData
0199   302E           00175                 movlw   '.'
019A   2159           00176                 call    LcdSendData
019B   302E           00177                 movlw   '.'
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 14


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

019C   2159           00178                 call    LcdSendData
019D   30FF           00179                 movlw   255                             ;retardo p/ efeito
019E   212A           00180                                 call    LcdDelay
                      00181 
019F   3010           00182                 movlw   10H                             ;Locate LCD cursor on row 1, col 0
01A0   214E           00183                 call    LcdLocate
                      00184 
01A1   300D           00185                 movlw   13                              ;n mero de vezes que o caracter vai
01A2   00B4           00186                                 movwf   temp                    ;se repetir
01A3   3023           00187 PutChar                 movlw   '#'                             ;car cter a ser impresso
01A4   2159           00188                 call    LcdSendData
01A5   30FF           00189                 movlw   255
01A6   212A           00190                                 call    LcdDelay
01A7   0BB4           00191                                 decfsz  temp,f
01A8   29A3           00192                                 goto    PutChar
                      00193 
01A9   30FF           00194                 movlw   255                             ;retardo p/ efeito
01AA   212A           00195                                 call    LcdDelay
01AB   2149           00196                                 call    LcdClear                ;limpa LCD
01AC   0008           00197                                 return
                      00198 
01AD   3000           00199 ShowName                movlw   00H                             ;Locate LCD cursor on row 0, col 0
01AE   214E           00200                 call    LcdLocate
01AF   3046           00201                 movlw   'F'                             ;Shows "WVR-2002" string on LCD
01B0   2159           00202                 call    LcdSendData
01B1   3052           00203                 movlw   'R'
01B2   2159           00204                 call    LcdSendData
01B3   3045           00205                 movlw   'E'
01B4   2159           00206                 call    LcdSendData
01B5   3051           00207                 movlw   'Q'
01B6   2159           00208                 call    LcdSendData
01B7   3055           00209                 movlw   'U'
01B8   2159           00210                 call    LcdSendData
01B9   3045           00211                 movlw   'E'
01BA   2159           00212                 call    LcdSendData
01BB   304E           00213                 movlw   'N'
01BC   2159           00214                 call    LcdSendData
01BD   3043           00215                 movlw   'C'
01BE   2159           00216                 call    LcdSendData
01BF   3049           00217                 movlw   'I'
01C0   2159           00218                 call    LcdSendData
01C1   3041           00219                 movlw   'A'
01C2   2159           00220                 call    LcdSendData
01C3   3020           00221                 movlw   ' '
01C4   2159           00222                 call    LcdSendData
01C5   30FF           00223                 movlw   255                             ;retardo p/ efeito
01C6   212A           00224                                 call    LcdDelay
01C7   30FF           00225                 movlw   255             
01C8   212A           00226                                 call    LcdDelay
01C9   0008           00227                                 return
                      00228 
01CA   3010           00229 ShowHello               movlw   10H                             ;Locate LCD cursor on row 1, col 0
01CB   214E           00230                 call    LcdLocate
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 15


LOC  OBJECT CODE     LINE SOURCE TEXT
  VALUE

01CC   3051           00231                 movlw   'Q'                             ;Shows "HELLO WORLD" string on LCD
01CD   2159           00232                 call    LcdSendData
01CE   3052           00233                 movlw   'R'
01CF   2159           00234                 call    LcdSendData
01D0   3050           00235                 movlw   'P'
01D1   2159           00236                 call    LcdSendData
01D2   3020           00237                 movlw   ' '
01D3   2159           00238                 call    LcdSendData
01D4   3042           00239                 movlw   'B'
01D5   2159           00240                 call    LcdSendData
01D6   3052           00241                 movlw   'R'
01D7   2159           00242                 call    LcdSendData
01D8   3020           00243                 movlw   ' '
01D9   2159           00244                 call    LcdSendData
01DA   3046           00245                 movlw   'F'
01DB   2159           00246                 call    LcdSendData
01DC   3052           00247                 movlw   'R'
01DD   2159           00248                 call    LcdSendData
01DE   3045           00249                 movlw   'E'
01DF   2159           00250                 call    LcdSendData
01E0   3051           00251                 movlw   'Q'
01E1   2159           00252                 call    LcdSendData
01E2   3020           00253                 movlw   ' '
01E3   2159           00254                 call    LcdSendData
01E4   3021           00255                 movlw   '!'
01E5   2159           00256                 call    LcdSendData
01E6   30FF           00257                 movlw   255                             ;retardo p/ efeito
01E7   212A           00258                                 call    LcdDelay
01E8   30FF           00259                 movlw   255             
01E9   212A           00260                                 call    LcdDelay
01EA   30FF           00261                 movlw   255             
01EB   212A           00262                                 call    LcdDelay
01EC   30FF           00263                 movlw   255             
01ED   212A           00264                                 call    LcdDelay
01EE   0008           00265                 return
                      00266 
                      00507 
                      00508                         END
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 16


SYMBOL TABLE
  LABEL                             VALUE 

ADEN                              00000003
Add2                              00000066
Add24                             000000A2
Add3                              00000073
AddEnd                            0000007D
Addc24                            00000053
BANK0                             BCF     STATUS,RP0
BANK1                             BSF     STATUS,RP0
BRGH                              00000002
C                                 00000000
C1INV                             00000004
C1OUT                             00000006
C2INV                             00000005
C2OUT                             00000007
CCP1CON                           00000017
CCP1IE                            00000002
CCP1IF                            00000002
CCP1M0                            00000000
CCP1M1                            00000001
CCP1M2                            00000002
CCP1M3                            00000003
CCP1X                             00000005
CCP1Y                             00000004
CCPR1H                            00000016
CCPR1L                            00000015
CIS                               00000003
CM0                               00000000
CM1                               00000001
CM2                               00000002
CMCON                             0000001F
CMIE                              00000006
CMIF                              00000006
CREN                              00000004
CSRC                              00000007
ClarCF                            0000007C
ClearCF                           00000051
Count                             00000021
CountIt                           0000011B
Cycle                             000000EC
Cycle2                            00000100
DC                                00000001
DecTable                          0000007E
Divide                            00000098
EEADR                             0000009B
EECON1                            0000009C
EECON2                            0000009D
EEDATA                            0000009A
EEIE                              00000007
EEIF                              00000007
F                                 00000001
FERR                              00000002
FSR                               00000004
GIE                               00000007
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 17


SYMBOL TABLE
  LABEL                             VALUE 

HIndex                            0000002F
Help                              00000022
HigB                              0000002D
INDF                              00000000
INTCON                            0000000B
INTE                              00000004
INTEDG                            00000006
INTF                              00000001
IRP                               00000007
Index                             00000020
Init                              00000001
LCD_DB4                           00000004
LCD_DB5                           00000005
LCD_DB6                           00000006
LCD_DB7                           00000007
LCD_E                             00000003
LCD_RS                            00000002
LED0                              00000023
LED1                              00000024
LED2                              00000025
LED3                              00000026
LED4                              00000027
LED5                              00000028
LED6                              00000029
LEDCycle                          000000BB
LEDIndex                          00000030
LcdClear                          00000149
LcdDelay                          0000012A
LcdDelayCounter                   00000038
LcdDelayLoop                      0000012C
LcdInit                           00000132
LcdLocate                         0000014E
LcdPulse_E                        00000180
LcdSendByte                       0000015F
LcdSendCommand                    0000015C
LcdSendData                       00000159
LcdShiftL                         0000017B
LowB                              0000002B
MidB                              0000002C
NOT_BO                            00000000
NOT_BOD                           00000000
NOT_BOR                           00000000
NOT_PD                            00000003
NOT_POR                           00000001
NOT_RBPU                          00000007
NOT_T1SYNC                        00000002
NOT_TO                            00000004
Next                              000000A5
NoDot                             000000C8
Not2Do                            00000105
Nothing                           000000F1
Nx                                00000108
Nxt                               000000F4
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 18


SYMBOL TABLE
  LABEL                             VALUE 

OERR                              00000001
OPTION_REG                        00000081
OSCF                              00000003
PCL                               00000002
PCLATH                            0000000A
PCON                              0000008E
PEIE                              00000006
PIE1                              0000008C
PIR1                              0000000C
PORTA                             00000005
PORTB                             00000006
PR2                               00000092
PS0                               00000000
PS1                               00000001
PS2                               00000002
PSA                               00000003
PutChar                           000001A3
R1                                00000031
R2                                00000032
R3                                00000033
RBIE                              00000003
RBIF                              00000000
RCIE                              00000005
RCIF                              00000005
RCREG                             0000001A
RCSTA                             00000018
RD                                00000000
RP0                               00000005
RP1                               00000006
RX9                               00000006
RX9D                              00000000
SPBRG                             00000099
SPEN                              00000007
SREN                              00000005
STATUS                            00000003
SYNC                              00000004
ShowHello                         000001CA
ShowLoad                          00000187
ShowName                          000001AD
Start                             00000091
Step1                             0000003B
Step2                             00000048
SubEnd                            00000052
Subc24                            00000028
T0CS                              00000005
T0IE                              00000005
T0IF                              00000002
T0SE                              00000004
T1                                000000FC
T1CKPS0                           00000004
T1CKPS1                           00000005
T1CON                             00000010
T1OSCEN                           00000003
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 19


SYMBOL TABLE
  LABEL                             VALUE 

T2                                0000000B
T2CKPS0                           00000000
T2CKPS1                           00000001
T2CON                             00000012
T3                                00000004
T4                                00000002
TEMP                              0000002E
TMR0                              00000001
TMR1CS                            00000001
TMR1H                             0000000F
TMR1IE                            00000000
TMR1IF                            00000000
TMR1L                             0000000E
TMR1ON                            00000000
TMR2                              00000011
TMR2IE                            00000001
TMR2IF                            00000001
TMR2ON                            00000002
TOUTPS0                           00000003
TOUTPS1                           00000004
TOUTPS2                           00000005
TOUTPS3                           00000006
TRISA                             00000085
TRISB                             00000086
TRMT                              00000001
TX9                               00000006
TX9D                              00000000
TXEN                              00000005
TXIE                              00000004
TXIF                              00000004
TXREG                             00000019
TXSTA                             00000098
TimerH                            0000002A
VR0                               00000000
VR1                               00000001
VR2                               00000002
VR3                               00000003
VRCON                             0000009F
VREN                              00000007
VROE                              00000006
VRR                               00000005
W                                 00000000
WR                                00000001
WREN                              00000002
WRERR                             00000003
Z                                 00000002
_BODEN_OFF                        00003FBF
_BODEN_ON                         00003FFF
_BOREN_OFF                        00003FBF
_BOREN_ON                         00003FFF
_CP_OFF                           00003FFF
_CP_ON                            00001FFF
_DATA_CP_OFF                      00003FFF
MPASM 03.50 Released                                FREQ3.ASM   1-8-2005  11:46:37         PAGE 20


SYMBOL TABLE
  LABEL                             VALUE 

_DATA_CP_ON                       00003EFF
_ER_OSC_CLKOUT                    00003FFF
_ER_OSC_NOCLKOUT                  00003FFE
_EXTCLK_OSC                       00003FEF
_HS_OSC                           00003FEE
_INTOSC_OSC_CLKOUT                00003FFD
_INTOSC_OSC_NOCLKOUT              00003FFC
_INTRC_OSC_CLKOUT                 00003FFD
_INTRC_OSC_NOCLKOUT               00003FFC
_LP_OSC                           00003FEC
_LVP_OFF                          00003F7F
_LVP_ON                           00003FFF
_MCLRE_OFF                        00003FDF
_MCLRE_ON                         00003FFF
_PWRTE_OFF                        00003FFF
_PWRTE_ON                         00003FF7
_RC_OSC_CLKOUT                    00003FFF
_RC_OSC_NOCLKOUT                  00003FFE
_WDT_OFF                          00003FFB
_WDT_ON                           00003FFF
_XT_OSC                           00003FED
__16F628A                         00000001
status_temp                       00000036
temp                              00000034
tmpLcdRegister                    00000037
w_temp                            00000035


MEMORY USAGE MAP ('X' = Used,  '-' = Unused)

0000 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0040 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0080 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
00C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0100 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0140 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
0180 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX
01C0 : XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXX- ----------------
2000 : XXXX---X-------- ---------------- ---------------- ----------------

All other memory blocks unused.

Program Memory Words Used:   495
Program Memory Words Free:  1553


Errors   :     0
Warnings :     0 reported,     0 suppressed
Messages :     0 reported,     8 suppressed




************************************************************************
Para  PIC 16F628A



*******************************************************

Para PIC 16F628-04

ASM

;===============================================================================
;    Filename: freq_628.asm                                                
;    Date: 23/03/2004                                                 
;    File Version: 1.0                                                
;    Orig. Files: Peter Halicky  OM3CPH & Peter Halicky Jr., OM2PH ex OM2APH
;    Rewrite: Vila Real para QRP BR ask from PY2RLM - RENATO
;================================================================================
;    Files required: vdisplay.inc                                                  
;================================================================================
;    Notes:
; Remoção das rotinas de Lcd, inclusão da vdisplay.inc
; Correção da diretiva Radix
; Inclusão de pag. de memória
; Relocação de variáveis
; Recálculo de T1=241,T2=5 ,T3=46,T4=7,Z=2 p/ 20MHz
;      T1=252,T2=11,T3=4 ,T4=2,Z=3 p/ 4MHz 
;================================================================================

;================================================================================
;DIRETIVAS DE COMPILAÇÃO
;================================================================================
LIST P=16F628 ;list directive to define processor
#INCLUDE <p16f628.inc> ;processor specific variable definitions
__IDLOCS      2003 ;dados a serem gravados na EEPROM
    ERRORLEVEL      -302      ;suppress bank selection messages
    RADIX           DEC ;set to decimal
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC&_BODEN_OFF&_LVP_OFF


;=================================================================================
;VARIABLE DEFINITIONS
;=================================================================================
CBLOCK 0x20 ;endereço inicial p/ variáveis
Index               ;dummy register
Count               ;inkremental register
Help                ;dummy register

LED0              
LED1              
LED2              
LED3        
LED4        
LED5        
LED6        

TimerH               ;the highest byte of SW counter
LowB              ;low byte of resulted frequency
MidB                 ;middle byte of resulted frequency
HigB                 ;high byte of resulted frequency
TEMP                 ;temporary register
HIndex               ;index register
LEDIndex             ;LED pointer
R1                   ;Timing counters
R2          
R3          

temp   
w_temp ;variable used for context saving 
status_temp ;variable used for context saving
tmpLcdRegister  ;devem permanecer no final
LcdDelayCounter ;pois ocupam 4 bytes
ENDC

;=================================================================================
;PAGINAÇÃO DE MEMÓRIA
;=================================================================================
#DEFINE BANK0 BCF STATUS,RP0 ;seta bank0 de memória
#DEFINE BANK1 BSF STATUS,RP0 ;seta bank1 de memória

;=================================================================================
;Timing Loop values    ; QRP BR - AQUI SÃO OS AJUSTES
;=================================================================================
T1          equ       252               ;first timing loop     
T2          equ       11          ;second timing loop
T3          equ       4         ;third timing loop
T4          equ       2        ;last timing loop

;=================================================================================
;Vetor de Reset
;=================================================================================
        org     0x00
        goto    Init

;=================================================================================
;Inicialização
;=================================================================================
Init        clrf       STATUS      ; Do initialization, Select bank 0
            clrf       INTCON      ; Clear int-flags, Disable interrupts
            clrf       PCLATH      ; Keep in lower 2KByte
            clrf       PORTA       ; ALL PORT output should output Low.
            clrf       PORTB

            clrf       Index
            clrf       LEDIndex

            clrf       LED0
            clrf       LED1
            clrf       LED2
            clrf       LED3
            clrf       LED4
            clrf       LED5
            clrf       LED6

            clrf       LowB
            clrf       MidB
            clrf       HigB

            bsf        STATUS,RP0

            movlw      b'00010000' ; RA0..RA3 outputs
            movwf      TRISA       ; RA4 input

            movlw      0xF0        ; RB0..RB3 outputs, rest inputs
            movwf      TRISB

            bsf        OPTION_REG,NOT_RBPU ; Disable PORTB pull-ups

            clrwdt
            movlw      b'10100111' ; Prescaler -> TMR0,
            movwf      OPTION_REG  ; 1:256, rising edge
            bcf        STATUS,RP0  ;

BANK1
    movlw      0x0F
    andwf      TRISB,W
    movwf      TRISB      ; Set Port for output
BANK0

;=================================================================================
;Initialization of LCD display
call LcdInit
call ShowLoad
call ShowName
call ShowHello
call LcdClear
call ShowName
;=================================================================================
            goto    Start         

;=================================================================================
; Numeric routines
;=================================================================================
; 3 byte substraction of the constant from the table which sets carry if
; result is negative
;=================================================================================
Subc24      clrf       TEMP       ; it will TEMPorary save C
            movf       Index,W    ; pointer to low byte of constant
            movwf      HIndex     ; W -> HIndex
            call       DecTable   ; W returned with low byte of constant
            bsf        STATUS,C   ; set C
            subwf      LowB,F     ; LowB - W -> LowB
                                  ; if underflow -> C=0
            btfsc      STATUS,C
            goto       Step1
            bsf        STATUS,C
            movlw      1
            subwf      MidB,F     ; decrement MidB
                                  ; if underflow -> C=0
            btfsc      STATUS,C
            goto       Step1

            bsf        STATUS,C
            movlw      1
            subwf      HigB,F     ; decrement HigB
            btfsc      STATUS,C   ; if underflow -> C=0
            goto       Step1
            bsf        TEMP,C     ; set C

Step1       decf       HIndex,F
            movf       HIndex,W   ; pointer to middle byte of const
            call       DecTable
            bsf        STATUS,C
            subwf      MidB,F     ; MidB - W -> MidB
            btfsc      STATUS,C   ; if underflow -> C=0
            goto       Step2
            bsf        STATUS,C
            movlw      1
            subwf      HigB,1     ; decrement HigB
            btfsc      STATUS,C   ; if underflow -> C=0
            goto       Step2
            bsf        TEMP,C     ; set C

Step2       decf       HIndex,F
            movf       HIndex,W   ; pointer to middle byte of constatnt
            call       DecTable
            bsf        STATUS,C
            subwf      HigB,F     ; HigB - W -> HigB
            btfsc      STATUS,C   ; if underflow -> C=0
            goto       ClearCF
            bsf        STATUS,C
            goto       SubEnd
ClearCF     rrf        TEMP,C     ; C -> STATUS
SubEnd      retlw      0

;=================================================================================
; 3 byte addition of the constant from the table which sets carry if
; result overflows
;=================================================================================
Addc24      clrf       TEMP       ; register for TEMPorary storage of C
            movf       Index,W    ; pointer to lower byte of const into W
            movwf      HIndex     ; save it into HIndex
            call       DecTable   ; W contains low byte of const
            bcf        STATUS,C   ; clear C
            addwf      LowB,1     ; W + LowB -> LowB
            btfss      STATUS,C   ; test overflow
            goto       Add2
            bcf        STATUS,C   ; clear C
            movlw      1
            addwf      MidB,F     ; increment MidB
            btfss      STATUS,C
            goto       Add2
            bcf        STATUS,C
            movlw      1
            addwf      HigB,F     ; increment HigB
            btfss      STATUS,C   ; test overflow
            goto       Add2
            bsf        TEMP,C     ; store C
Add2        decf       HIndex,F   ; pointer to middle byte into W
            movf       HIndex,W
            call       DecTable
            bcf        STATUS,C
            addwf      MidB,1     ; W + MidB -> MidB
            btfss      STATUS,C
            goto       Add3
            bcf        STATUS,C   ; clear C
            movlw      1
            addwf      HigB,1     ; increment HigB
            btfss      STATUS,C
            goto       Add3
            bsf        TEMP,C
Add3        decf       HIndex,F   ; pointer to higher byte into W
            movf       HIndex,W
            call       DecTable
            bsf        STATUS,C
            addwf      HigB,F     ; W + HigB -> HigB,
            btfss      STATUS,C
            goto       ClarCF
            bsf        STATUS,C
            goto       AddEnd
ClarCF      rrf        TEMP,C     ; C -> STATUS
AddEnd      retlw      0

;=================================================================================
;Tables for 3 byte constants
;Table of decades
;=================================================================================
DecTable    addwf      PCL,F      ; W + PCL -> PCL
            retlw      0          ; 10
            retlw      0          ;
            retlw      0Ah        ;

            retlw      0          ; 100
            retlw      0          ;
            retlw      064h       ;

            retlw      0          ; 1 000
            retlw      03h        ;
            retlw      0E8h       ;

            retlw      0          ; 10 000
            retlw      027h       ;
            retlw      010h       ;

            retlw      01h        ; 100 000
            retlw      086h       ;
            retlw      0A0h       ;

            retlw      0Fh        ; 1 000 000
            retlw      042h       ;
            retlw      040h       ;

;=================================================================================
;Entry point for main cycle
;=================================================================================
;Routine for the conversion of 3 byte number into 7 decimal numbers
;=================================================================================
Start       movlw      6*3-1      ; pointer to dec. table
            movwf      Index      ; 6*3-1 -> Index

            movlw      9          ; maximum of substractions
            movwf      Count      ; 9 -> Count

            clrf       Help

            movlw      6
            movwf      LEDIndex

Divide      call       Subc24     ; substract untill result is negative,
            btfsc      STATUS,C   ; add last substracted number
            goto       Add24      ; next digit
            incf       Help,F
            decf       Count,F
            btfss      STATUS,Z
            goto       Divide
            movlw      3
            subwf      Index,F
            goto       Next

Add24       call       Addc24
            movlw      03h
            subwf      Index,F

Next        movlw      9
            movwf      Count
            movlw      LED1       ; LED1 -> W
            addwf      LEDIndex,W ; LED1 + LEDIndex -> W
            movwf      TEMP
            decf       TEMP,F     ; LEDIndex+LED1-1 -> TEMP
            movf       TEMP,W

            movwf      FSR        ; W -> FSR
            movf       Help,W     ; Help -> W
            clrf       Help       ; save result at LEDx
            movwf      INDF       ; W -> LED(6..1)
            decf       LEDIndex,F

            movlw      1
            addwf      Index,W
            btfss      STATUS,Z
            goto       Divide

            movf       LowB,W
            movwf      LED0       ; the rest -> LED0

;=================================================================================
;registers LED0..LED6 are filled with values - ready to be displayed
;=================================================================================
            movlw      6
            movwf      LEDIndex

movlw      10H ;Locate LCD cursor on row 1, col 0
            call       LcdLocate
     
LEDCycle    movlw      LED0        ;LED0 -> W
            addwf      LEDIndex,W ;LED1 + LEDIndex -> W

            movwf      FSR        ;W -> FSR
            movf       INDF,W      ;LED(0..6) -> W

            iorlw      030h
            call       LcdSendData    ;Display character

            ;movlw      5            ;test for decimal point
            movlw      5             ;test for decimal point
            bsf        STATUS,Z
            subwf      LEDIndex,W
            btfss      STATUS,Z
            goto       NoDot
            movlw      '.'          ;this can be ' ' or ',' ......
            call       LcdSendData      ;Display character

NoDot       decfsz     LEDIndex,F
            goto       LEDCycle    ;continue with next number

            movlw      LED0        ;LED0 -> W
            addwf      LEDIndex,W  ;LED0 + LEDIndex -> W

            movwf      FSR          ;W -> FSR
            movf       INDF,W      ;[FSR] -> W

            iorlw      030h
call       LcdSendData      ;Display character

            movlw      ' '
            call       LcdSendData      ;Display character
            movlw      'M'
            call       LcdSendData      ;Display character
            movlw      'H'
            call       LcdSendData      ;Display character
            movlw      'z'
            call       LcdSendData      ;Display character

movlw    10H ;Locate LCD cursor on row 1, col 0
            call       LcdLocate

;=================================================================================
;It is time to prepare new measuring cycle
;=================================================================================
            clrf       TimerH
            clrf       TMR0
            nop                    ;it is SUGGESTED...
            nop

            clrf       LEDIndex

            movlw      T1          ;set initial counter values
            movwf      R1
            movlw      T2
            movwf      R2
            movlw      T3
            movwf      R3

            clrf       INTCON      ;global INT disable, TMR0 INT disable
                                   ;clear TMR0 overflow bite

;=================================================================================
;Start measurement:  RA3 + RA4 set input
;=================================================================================
            movlw      b'00010000' ;all ports set L, RA4 set H
            movwf      PORTA

            bsf        STATUS,RP0
            movlw      b'00011111' ;RA0..RA4 input
            movwf      TRISA
            bcf        STATUS,RP0

;=================================================================================
;It is opened now...
;=================================================================================
Cycle       btfss      INTCON,2   ;1   Test for TMR0 overflow
            goto       Nothing    ;3
            incf       TimerH,F   ;3
            bcf        INTCON,2   ;4
            goto       Nxt        ;6

Nothing     nop                   ;4
            nop                   ;5
            nop                   ;6

Nxt         decfsz     R1,F       ;7
            goto       Cycle      ;9
            movlw      T1         ;9*T1

            movwf      R1         ;9*T1+1
            decfsz     R2,F       ;9*T1+2
            goto       Cycle      ;9*T1+4
            movlw      T2         ;9*T1+4)*T2

            movwf      R2         ;(9*T1+4)*T2+1
            decfsz     R3,F       ;(9*T1+4)*T2+2
            goto       Cycle      ;(9*T1+4)*T2+4

;=================================================================================
;Final test for TMR0 overflow
;=================================================================================
            movlw      T4         ;((9*T1+4)*T2+4)*T3
            movwf      Help       ;((9*T1+4)*T2+4)*T3+1

Cycle2      btfss      INTCON,2   ;1
            goto       Not2Do     ;3
            incf       TimerH,F   ;3
            bcf        INTCON,2   ;4
            goto       Nx         ;6

Not2Do      nop                   ;4
            nop                   ;5
            nop                   ;6

Nx          decfsz     Help,F     ;7
            goto       Cycle2     ;9
            nop                   ;((9*T1+4)*T2+4)*T3+1+9*T4+Z
;=================================================================================
; Z times fine tuning nops        ; altere aqui os nop para calibrar, aumentando
            nop                   ; ou diminuindo.
            nop
            nop

;=================================================================================
; Stop the measurement
;=================================================================================
            clrw                   ;1
            movwf      PORTB       ;2
            movlw      b'00010000' ;3   RA0..RA3 = 0
            movwf      PORTA       ;4   W -> PORTA
                                   ;((9*T1+4)*T2+4)*T3+1+9*T4+Z+4
            bsf        STATUS,RP0  ;
            movlw      b'00010111' ;RA3 output
            movwf      TRISA       ;RA0..RA2,RA4 input
            bcf        STATUS,RP0  ;

;=================================================================================
; Analyse precounter and store counted value in registers
;=================================================================================
            movf       TMR0,W
            movwf      MidB        ;TMR0 -> MidB

            movf       TimerH,W
            movwf      HigB        ;TimerH -> HigB

            clrf       TEMP

CountIt     incf       TEMP,F
            bsf        PORTA,3     ;_| false impulz
            bcf        PORTA,3     ;|_

            bcf        INTCON,2
            movf       TMR0,W      ;actual TMR0 -> W
            bcf        STATUS,Z
            subwf      MidB,W
            btfsc      STATUS,Z
            goto       CountIt
            incf       TEMP,F
            comf       TEMP,F
            incf       TEMP,F
            incf       TEMP,W

            movwf      LowB
            goto       Start          ;start new cycle

;================================================================================
;Include Files
;================================================================================
#INCLUDE <vdisplay.inc>

END
 Start          ;start new cycle

;================================================================================
;Include Files
;=================================================================










************************************************************************

Para PIC 16F628-04

HEX


:020000040000FA
:10000000012883018B018A0185018601A001B001CD
:10001000A301A401A501A601A701A801A901AB01A3
:10002000AC01AD01831610308500F03086008117D9
:100030006400A7308100831283160F300605860006
:10004000831232218721B921DA214921B92191284E
:10005000AE012008AF007E200314AB0203183B283A
:1000600003140130AC0203183B2803140130AD0225
:1000700003183B282E14AF032F087E200314AC0274
:100080000318482803140130AD02031848282E1421
:10009000AF032F087E200314AD0203185128031468
:1000A00052282E0C0034AE012008AF007E20031031
:1000B000AB07031C662803100130AC07031C66283D
:1000C00003100130AD07031C66282E14AF032F0860
:1000D0007E200310AC07031C732803100130AD070A
:1000E000031C73282E14AF032F087E200314AD07C2
:1000F000031C7C2803147D282E0C00348207003456
:1001000000340A3400340034643400340334E834F6
:1001100000342734103401348634A0340F34423490
:1001200040341130A0000930A100A2010630B00017
:1001300028200318A228A20AA103031D982803302F
:10014000A002A52853200330A0020930A1002430CA
:100150003007AE00AE032E0884002208A201800002
:10016000B00301302007031D98282B08A300063098
:10017000B00010304E2123303007840000083038A2
:100180005921053003153002031DC8282E3059218E
:10019000B00BBB28233030078400000830385921C9
:1001A000203059214D305921483059217A30592178
:1001B00010304E21AA01810100000000B001FC3086
:1001C000B1000B30B2000430B3008B011030850059
:1001D00083161F30850083120B1DF128AA0A0B110C
:1001E000F428000000000000B10BEC28FC30B10046
:1001F000B20BEC280B30B200B30BEC280230A2009B
:100200000B1D0529AA0A0B11082900000000000097
:10021000A20B00290000000000000000030186007E
:100220001030850083161730850083120108AC005A
:100230002A08AD00AE01AE0A851585110B11010823
:1002400003112C0203191B29AE0AAE09AE0A2E0AAD
:10025000AB009128B900B8010000B80B2C29B90BEC
:100260002C2908001E302A210611061686160613B0
:10027000861380218021802106128616061386139C
:10028000802128305C2106305C210C305C21492122
:10029000080001305C2102302A210800B7008030BC
:1002A000B80037080F39B804371A381738085C21F6
:1002B000080006155F21080006115F210800B7003D
:1002C0000612861206138613371A0616B71A8616F2
:1002D000371B0617B71B86178021061286120613D6
:1002E000861337180616B718861637190617B71962
:1002F00086178021080018305C2196302A210800DA
:10030000861501302A21861101302A21080000308B
:100310004E214330592161305921723059217230B8
:1003200059216530592167305921613059216E308A
:100330005921643059216F3059212E3059212E30E6
:1003400059212E3059212E3059212E3059212E304D
:100350005921FF302A2110304E210D30B4002330B6
:100360005921FF302A21B40BAF29FF302A2149211E
:10037000080000304E214630592152305921453075
:1003800059215130592155305921453059214E308C
:1003900059214330592149305921413059212030C8
:1003A00059212030592120305921FF302A21FF3096
:1003B0002A21080010304E21513059215230592144
:1003C000503059212D305921533059214530592170
:1003D0004D30592150305921523059214530592141
:1003E000213059212130592121305921FF302A2132
:0E03F000FF302A21FF302A21FF302A21080089
:084000000200000000000300B3
:02400E00213F50
:00000001FF
1513059215230592144
:1003C000503059212D305921533059214530592170
:1003D0004D30592150305921523059214530592141
:1003E000






************************************************************************


************************************************************************








************************************************************************











************************************************************************