;----------------------------------------------------------------------; ; TMR04M.ASM Show TMR0 in decimal on LCD after counting 1 second ; ;----------------------------------------------------------------------; ; 555 V+ PIC16F84 ; .----------. | .-----------. ; gnd ---|gnd Vcc|--- V+ [R] -|RA2 RA1|----[LCD E] ; .-|trig dis|----------| -|RA3 RA0|----[LCD RS] ; RA4<--|-|out thres|--.--{r}--' in>-|RA4 OSC1|--|X|__ gnd ; V+ --|-|rst cont| |--|<---' V+--|MCLR OSC2|--|X| X = 4 MHz ; | '----------' | gnd--|Vss Vdd|--- V+ cer. res. ; '---------------' [LCD D4]----|RB0 RB7|- ; | C [LCD D5]----|RB1 RB6|- V+ = 4.5 or 5V ; '---||---gnd [LCD D6]----|RB2 RB5|---[PB]--- gnd ; C = 0.001-0.1 mfd [LCD D7]----|RB3 RB4|---[PB]--- gnd ; -{r}- = 33K '-----------' ; -|<- = 1n4148 [R] = 10K variable resistor -[PB]- = pushbutton ; LCD pin connections: ; 1 - gnd ground 2 - Vcc V+ 3 - cont. 10K pot V+ & gnd ; 4 - RS RA0 PIC(17) 5 - RW gnd 6 - E RA1 PIC(18) ; 7 - D0 gnd 8 - D1 gnd 9 - D2 gnd 10 - D3 gnd ; 11 - D4 RB0 (6) 12 - D5 RB1 (7) 13 - D6 RB2 (8) 14 - D7 (9) LIST P=16F84 ; 16F84 Runs at 4 MHz INCLUDE "p16f84.inc" __CONFIG _PWRTE_ON & _XT_OSC & _WDT_OFF ERRORLEVEL -224 ; supress annoying message from tris ERRORLEVEL -302 ; supress message fromf page change ; Define Information #DEFINE RS PORTA, 0 ; RA0 is RS line of LCD #DEFINE E PORTA, 1 ; RA1 is E line of LCD ; RB0-RB3 are D4-D7 of LCD #DEFINE upbutton PORTB, 4 ; RB4 is the up button #DEFINE dnbutton PORTB, 5 ; RB5 is the down button ; Macro EStrobe MACRO ; Strobe the "E" Bit bsf E bcf E ENDM CBLOCK 0CH Temp ; a temporary variable count ; counter precount ; holds value for prescalar bin ; binary number to be converted to BCD hundreds ; BCD hundreds result tens_and_ones ; BCD tens and ones result cntmsec ; used in counting milliseconds ENDC ORG 0 ; start at location 0 goto main ; jump over to main routine ;----------------------------------------------------------------------; ; Data for message to be output ; ;----------------------------------------------------------------------; shomsg: ; Message to Output addwf PCL, f ; Output the Characters m0 dt "TMR0 Value:", 0 m1 dt "Multiply by:", 0 ;----------------------------------------------------------------------; ; Ratios of Prescaler ; ;----------------------------------------------------------------------; preratio: addwf PCL, f ; select offset using W dt D'2',D'4',D'8',D'16',D'32',D'64',D'128' ;----------------------------------------------------------------------; ; Initialize the ports ; ;----------------------------------------------------------------------; Init: clrf PORTA clrf PORTB movlw B'00010000' ; RA4 input, others outputs tris PORTA movlw B'00110000' ; RB4, RB5 input, others outputs tris PORTB movlw B'00100001' ; pull-ups enabled ; prescaler assigned to RA4 ; prescaler set to 1:4 option clrf precount return ;----------------------------------------------------------------------; ; Initialize the LCD ; ;----------------------------------------------------------------------; initlcd: movlw D'40' call nmsec ; Wait 40 msecs before Reset bcf RS ; send an 8 bit instruction movlw 0x03 ; Reset Command call NybbleOut ; Send the Nybble call Dlay5 ; Wait 5 msecs before Sending Again EStrobe call Dlay160 ; Wait 160 usecs before Sending 2nd Time EStrobe call Dlay160 ; Wait 160 usecs before Sending 3rd Time bcf RS ; send an 8 bit instruction movlw 0x02 ; Set 4 Bit Mode call NybbleOut call Dlay160 movlw 0x028 ; 4 bit, 2 Line, 5x7 font call SendINS movlw 0x010 ; display shift off call SendINS movlw 0x001 ; Clear the Display RAM call SendINS call Dlay5 ; Note, Can take up to 4.1 msecs movlw 0x006 ; increment cursor call SendINS movlw 0x00C ; display on cursor off call SendINS return ;----------------------------------------------------------------------; ; Send the character in W out to the LCD ; ;----------------------------------------------------------------------; SendASCII addlw '0' ; Send nbr as ASCII character SendCHAR ; Send the Character to the LCD movwf Temp ; Save the Temporary Value swapf Temp, w ; Send the High Nybble bsf RS ; RS = 1 call NybbleOut movf Temp, w ; Send the Low Nybble bsf RS call NybbleOut return ;----------------------------------------------------------------------; ; Send an instruction in W out to the LCD ; ;----------------------------------------------------------------------; SendINS ; Send the Instruction to the LCD movwf Temp ; Save the Temporary Value swapf Temp, w ; Send the High Nybble bcf RS ; RS = 0 call NybbleOut movf Temp, w ; Send the Low Nybble bcf RS call NybbleOut return ;----------------------------------------------------------------------; ; Send the nibble in W out to the LCD ; ;----------------------------------------------------------------------; NybbleOut ; Send a Nybble to the LCD movwf PORTB EStrobe ; Strobe out the LCD Data call Dlay160 ; delay for 160 msec return ;----------------------------------------------------------------------; ; Output the message on the LCD ; ;----------------------------------------------------------------------; OutMessage: movwf FSR ; Point at first letter OutLoop: movf FSR, w ; Get pointer into W incf FSR, f ; Set up for next letter call shomsg ; Get character to output iorlw 0 ; At the End of the Message? btfsc STATUS, Z ; Skip if not at end return ; Yes - Equal to Zero call SendCHAR ; Output the ASCII Character goto OutLoop ; Get the next character ;----------------------------------------------------------------------; ; Change binary nbr in bin to BCD ; ;----------------------------------------------------------------------; binary_to_bcd ; by Scott Dattalo clrf hundreds ; found at http://www.piclist.com swapf bin, W addwf bin, W andlw B'00001111' skpndc addlw 0x16 skpndc addlw 0x06 addlw 0x06 skpdc addlw -0x06 btfsc bin,4 addlw 0x16 - 1 + 0x6 skpdc addlw -0x06 btfsc bin,5 addlw 0x30 btfsc bin, 6 addlw 0x60 btfsc bin,7 addlw 0x20 addlw 0x60 rlf hundreds, f btfss hundreds, 0 addlw -0x60 movwf tens_and_ones btfsc bin,7 incf hundreds, f return ;----------------------------------------------------------------------; ; time delay routines ; ;----------------------------------------------------------------------; Dlay160 movlw D'40' ; 160 usec delay entry point micro4 addlw H'FF' ; subtract 1 from 'W' btfss STATUS,Z ; skip when you reach zero goto micro4 ; more loops return Dlay5: movlw D'5' ; 5 msec delay entry point goto nmsec msec250: ; a subroutine to delay 250 msec movlw D'250' ;*** N millisecond delay routine *** nmsec: movwf cntmsec ; delay for N (in W) millisec msecloop: movlw D'248' ; 1 usec for load call micro4 ; this instruction is 995 usec nop ; 1 usec decfsz cntmsec,f ; 1 usec, (2 if skip taken) goto msecloop ; 2 usec here 995+5 = 1 msec return ;----------------------------------------------------------------------; ; Display binary value in W in decimal ; ; ;----------------------------------------------------------------------; DispDec movwf bin call binary_to_bcd movf hundreds, W call SendASCII swapf tens_and_ones, W andlw H'F' call SendASCII movf tens_and_ones, W andlw H'F' call SendASCII return ;----------------------------------------------------------------------; ; Return the prescalar ratio setting in W ; ;----------------------------------------------------------------------; getpre: bsf STATUS, RP0 ; change to page 1 movf OPTION_REG, W ; get OPTION register bcf STATUS, RP0 ; back to page 0 andlw 7 ; get 1st 3 bits in W return ;----------------------------------------------------------------------; ; Check pushbuttons and increment or decrement prescalar ; ;----------------------------------------------------------------------; ckbuttons: call getpre ; get prescalar ratio # in Temp movwf Temp btfss upbutton ; Skip if up button not pressed goto preup ; increment prescalar btfss dnbutton ; Skip if down button not pressed goto predown ; decrement prescalar return ; no buttons pressed, return preup: incf Temp, f ; up one btfsc Temp, 3 ; if reach 8, go back to zero clrf Temp goto newpre ; and fix new ratio predown: decf Temp, f ; down one movlw H'FF' ; check for underflow subwf Temp, W btfss STATUS, Z ; skip if underflow goto newpre ; and fix new ratio movlw 7 ; reset to 7 movwf Temp newpre: bsf STATUS, RP0 ; change to page 1 movlw B'11111000' ; mask out low three bits andwf OPTION_REG, W ; result in W bcf STATUS, RP0 ; back to page 0 iorwf Temp, W ; add in new prescalar ratio # option ; update OPTION return ; no debounce necessary because it ; will be one second till you get ; baclk to this routine, even if the ; button is still pressed. ;----------------------------------------------------------------------; ; The Main routine ; ;----------------------------------------------------------------------; main: call Init ; initialize ports, set up timer call initlcd ; initialize the LCD movlw H'80' ; position at 1st line column 0 call SendINS movlw m0 -2 ; send 'TMR0 Value:' message call OutMessage movlw H'C0' call SendINS ; position at 2nd line column 0 movlw m1 -2 ; send 'Multiply by:' message call OutMessage sholoop: call ckbuttons ; update prescalar if buttons pushed movlw H'CD' ; position at 2nd line column 13 call SendINS call getpre ; get prescalar ratio # in binary call preratio ; change to prescalar ratio call DispDec ; put it on LCD movlw H'8C' ; position at 1st line column 12 call SendINS bcf INTCON, T0IF ; clear timer zero interrupt flag clrf TMR0 ; zero TMR0 call msec250 ; wait a total of one second call msec250 call msec250 call msec250 movf TMR0, W ; retrieve timer zero btfsc INTCON, T0IF ; check if timer overflowed goto overload ; yes, display 'OVR' call DispDec ; display TMR0 value goto sholoop ; repeat forever overload movlw 'O' ; output 'OVR' call SendCHAR movlw 'V' call SendCHAR movlw 'R' call SendCHAR goto sholoop ; and continue end
file: /Techref/piclist/cheapic/tmr04m.asm, 14KB, , updated: 2000/12/7 16:35, local time: 2024/10/31 16:39,
52.14.234.213:LOG IN ©2024 PLEASE DON'T RIP! THIS SITE CLOSES OCT 28, 2024 SO LONG AND THANKS FOR ALL THE FISH!
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://sxlist.com/techref/piclist/cheapic/tmr04m.asm"> piclist cheapic tmr04m</A> |
Did you find what you needed? |
Welcome to sxlist.com!sales, advertizing, & kind contributors just like you! Please don't rip/copy (here's why Copies of the site on CD are available at minimal cost. |
Welcome to sxlist.com! |
.