Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

00-99 COUNT UP & DOWN USING PIC16f887a

Status
Not open for further replies.
;************************************************* *****************
; (C) K8LH 2-Digit Up/Dn Counter, Isochronous Loop Example v2 *
;************************************************* *****************
list p=16f877A ; list directive to define processor
#include <p16f877A.inc> ; processor specific variable definitions
errorlevel -302

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF



number equ 0x20 ; packed BCD, 0x00..0x99
swlatch equ 0x21 ; switch state latch variable
swflags equ 0x22 ; switch flag bits
DelayHi equ 0x23 ; DelayCy() subsystem variable

#define Dn 3 ; RA3
#define Up 2 ; RA2

;************************************************* *****************
;
; K8LH DelayCy() subsystem macro generates four instructions
;
radix dec
clock equ 16 ; clock frequency in Megahertz
usecs equ clock/4 ; cycles/microsecond multiplier
msecs equ usecs*1000 ; cycles/millisecond multiplier

DelayCy macro delay ; 11..327690 cycle range
movlw high((delay-11)/5)+1
movwf DelayHi
movlw low ((delay-11)/5)
call uDelay-((delay-11)%5)
endm

;************************************************* *****************
;
; init hardware and program variables
;
org 0x000
Init
bsf STATUS, RP0 ; Select Bank 1
movlw 0x07
movwf CMCON
movlw 0x07 ; Configure all pins
movwf ADCON1 ; as digital inputs
movlw b'00001100' ; |B1
movwf TRISA ; RA3-RA2 inputs, others outputs |B1
clrf TRISB ; portb all outputs |B1
bcf STATUS,RP0 ; bank 0 |B0
clrf PORTB ; clear portb output latches |B0
movlw b'00000001' ; digit select bits (RA1-RA0) |B0
movwf PORTA ; select the 'ones' display |B0
clrf swlatch ; clear switch state latch |B0
clrf swflags ; clear switch flags |B0
clrf number ; number = 00 |B0
;
; isochronous 8 msec program loop (62.5 Hz display refresh rate)
;
Display
clrf PORTB ; blank the display |B0
movf PORTA,W ; |B0
xorlw b'00000011' ; flip digit select bits |B0
movwf PORTA ; |B0
swapf number,W ; W = tens in right nybble |B0
btfss PORTA,1 ; 10's display? yes, skip, else |B0
movf number,W ; W = ones in right nybble |B0
call segtbl ; get segment data |B0
movwf PORTB ; display new digit |B0
Buttons
comf PORTA,W ; sample active low switches |B0
andlw b'00001100' ; on RA3 and RA2 pins |B0
xorwf swlatch,W ; changes (press or release) |B0
xorwf swlatch,F ; update switch state latch |B0
andwf swlatch,W ; filter out "new release" bits |B0
movwf swflags ; save any "new press" bits |B0
CountUp
movf number,W ; |B0
addlw 7 ; increment + bcd adjust? |B0
skpdc ; yes, skip, else |B0
addlw -6 ; increment only |B0
btfsc swflags,Up ; Up press? no, skip, else |B0
movwf number ; update 'number' |B0
movf number,W ; |B0
xorlw 0xA0 ; upper limit 99? |B0
skpnz ; no, skip, else |B0
clrf number ; reset to 00 (rollover mode) |B0 <-
CountDn
movf number,W ; lower limit 00? |B0
skpnz ; no, skip, else |B0
movlw 0xA0 ; reset to 99 (rollover mode) |B0 <-
addlw -1 ; decrement only? |B0
skpdc ; yes, skip, else |B0
addlw -6 ; decrement + bcd adjust |B0
btfsc swflags,Dn ; Dn press? no, skip, else |B0
movwf number ; update 'number' |B0
DelayCy(8*msecs-41) ; precise 8 msec loop timing |B0
goto Display ; loop |B0
;
; segment data table (caveat, non-boundary tolerant)
;
segtbl
andlw 0x0F ; strip off upper nybble |B0
addwf PCL,F ; |B0
retlw b'00111111' ; "0" -|-|F|E|D|C|B|A |B0
retlw b'00000110' ; "1" -|-|-|-|-|C|B|- |B0
retlw b'01011011' ; "2" -|G|-|E|D|-|B|A |B0
retlw b'01001111' ; "3" -|G|-|-|D|C|B|A |B0
retlw b'01100110' ; "4" -|G|F|-|-|C|B|- |B0
retlw b'01101101' ; "5" -|G|F|-|D|C|-|A |B0
retlw b'01111101' ; "6" -|G|F|E|D|C|-|A |B0
retlw b'00000111' ; "7" -|-|-|-|-|C|B|A |B0
retlw b'01111111' ; "8" -|G|F|E|D|C|B|A |B0
retlw b'01101111' ; "9" -|G|F|-|D|C|B|A |B0
;
; K8LH DelayCy() subsystem 16-bit timing subroutine
;
nop ; entry for (delay-11)%5 == 4 |B0
nop ; entry for (delay-11)%5 == 3 |B0
nop ; entry for (delay-11)%5 == 2 |B0
nop ; entry for (delay-11)%5 == 1 |B0
uDelay addlw -1 ; subtract "loop" cycle time |B0
skpc ; borrow? no, skip, else |B0
decfsz DelayHi,F ; done? yes, skip, else |B0
goto uDelay ; do another loop |B0
return ; |B0

end
i need this code in c
 
I assume that this is a test at school. It does not help you if someone else writes the code for you. You will not understand the next part of your education in this subject. If everyone in your class fails this test then it shows you have not been taught properly. If only a few fail then they need to spend some more time trying to understand the subject.

Les.
 
I take it eng14 failed his assignment!! Pity.. Although mikes "state" machine to detect button "press only" took me a while to convert!!... I'm always impressed by his knowledge of binary manipulation!!! I ended up with my own interpretation!!!
 
Status
Not open for further replies.

Latest threads

Back
Top