⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 picclock.asm

📁 利用PIC16系列单片机开发的时钟
💻 ASM
📖 第 1 页 / 共 2 页
字号:

set_loop      call    chk_hsel        ; Check for H12/H24 display change.
              btfss   PORTA,BIT_MSET  ; If pin is high then switch is open.
              goto    set_mins        ; Bit not set, switch closed, set minutes.
              btfss   PORTA,BIT_HSET  ; If pin is high then switch is open.
              goto    set_hours       ; Bit not set, switch closed, set hours.
              btfss   PORTA,BIT_TSET  ; If pin is high then switch is open.
              goto    set_loop        ; Bit not set, switch closed, loop.

              bcf     state,BIT_SET   ; Clear the 'set mode' bit.
              call    wr_state        ; Update the state output latch.

chk_tset_idc  decfsz  idc,F           ; Decrement idc. If zero we can reenable interrupts.
              retlw   1               ; Return without enabling interrupts.
chk_tset_done movlw   H'90'           ; Constant for GIE and T0IE.
              movwf   INTCON          ; Set interrupt register.
              retlw   1               ; Return.

set_mins      incf    mins,F          ; Increment minute count.
              movf    mins,W          ; Get it into W.
              sublw   D'60'           ; Is it 60 (W=60-W)?
              btfsc   STATUS,Z        ; Test zero flag, skip clear if no set.
              clrf    mins            ; Clear minutes.
              call    wr_mins         ; Write minutes.

debounce_mset btfss   PORTA,BIT_MSET  ; Wait for MSET button to be released.
              goto    debounce_mset   ; Loop.
              goto    set_loop        ; Released so recheck buttons.

set_hours     call    inc_hours       ; Increment hours and display.
debounce_hset btfss   PORTA,BIT_HSET  ; Wait for HSET button to be released.
              goto    debounce_hset   ; Loop.
              goto    set_loop        ; Released so recheck buttons.

;------------------------------------------------------------------------------
; Increment hours, set PM indicator bit as necessary.

inc_hours     btfsc   state,BIT_H24   ; 12h display?
              goto    reset_on24      ; No,  so we reset when we get to 24.

reset_on12    movf    hours,W         ; Get hours
              sublw   D'12'           ; Is it 12 (W=12-W)?
              btfsc   STATUS,Z        ; Test zero flag, skip clear if no set.
              clrf    hours           ; Clear hours.
              incf    hours,F         ; Increment hours.
              call    wr_hours        ; Write it.
              movf    hours,W         ; Get hours
              sublw   D'12'           ; Is it 12 (W=12-W)?
              btfss   STATUS,Z        ; Test zero flag.
              return                  ; Zero not set, so not 12, so return.
              movlw   MASK_PM         ; Get PM state bit mask.
              xorwf   state,F         ; Toggle PM state bit in state.
              call    wr_state        ; Update state outputs.
              return                  ; Return.

reset_on24    incf    hours,F         ; Incrment hours.
              movf    hours,W         ; Get it in W.
              sublw   D'24'           ; Is it 24 (W=24-W)?
              btfsc   STATUS,Z        ; Test zero flag, skip clear if no set.
              clrf    hours           ; Clear hours 24->0.
              call    wr_hours        ; Write hours to display.
              return

;------------------------------------------------------------------------------
; Get seconds value, split to get BCD pair and write to port.
wr_secs       movf    secs,W          ; Get seconds.
              call    bin2bcd         ; Convert to BCD.
              movwf   bcd             ; Save result.
              andlw   0xF0            ; Mask BCD pair to leave upper digit in W upper nibble.
              iorlw   0x0A            ; Select strobe.
              movwf   PORTB           ; Write to PORTB.
              andlw   0xF0            ; Clear strobe (by selecting Q0).
              movwf   PORTB           ; Write to PORTB.
              swapf   bcd,W           ; Get lower BCD digit in to W upper nibble.
              andlw   0xF0            ; Mask of strobe selection bits.
              iorlw   0x0C            ; Set WR strobe.
              movwf   PORTB           ; Write to PORTB.
              andlw   0xF0            ; Clear strobe.
              movwf   PORTB           ; Write to PORTB.
              return                  ; Return.

;------------------------------------------------------------------------------
; Get minutes value, split to get BCD pair and write to port.
wr_mins       movf    mins,W          ; Get minutes value.
              call    bin2bcd         ; Convert to BCD.
              movwf   bcd             ; Save result.
              andlw   0xF0            ; Mask BCD pair to leave upper digit in W upper nibble.
              iorlw   0x06            ; Select strobe.
              movwf   PORTB           ; Write to PORTB.
              andlw   0xF0            ; Clear strobe (by selecting Q0).
              movwf   PORTB           ; Write to PORTB.
              swapf   bcd,W           ; Get lower BCD digit in to W upper nibble.
              andlw   0xF0            ; Mask of strobe selection bits.
              iorlw   0x08            ; Set WR strobe.
              movwf   PORTB           ; Write to PORTB.
              andlw   0xF0            ; Clear strobe.
              movwf   PORTB           ; Write to PORTB.
              return                  ; Return.

;------------------------------------------------------------------------------
; Get hours value, split to get BCD pair and write to port.
wr_hours      movf    hours,W         ; Get hours value/
              call    bin2bcd         ; Convert to BCD.
              movwf   bcd             ; Save result.
              andlw   0xF0            ; Mask BCD pair to leave upper digit in W upper nibble.
              iorlw   0x02            ; Select strobe.
              movwf   PORTB           ; Write to PORTB.
              andlw   0xF0            ; Clear strobe (by selecting Q0).
              movwf   PORTB           ; Write to PORTB.
              swapf   bcd,W           ; Get lower BCD digit in to W upper nibble.
              andlw   0xF0            ; Mask of strobe selection bits.
              iorlw   0x04            ; Set WR strobe.
              movwf   PORTB           ; Write to PORTB.
              andlw   0xF0            ; Clear strobe.
              movwf   PORTB           ; Write to PORTB.
              return                  ; Return.

;------------------------------------------------------------------------------
; Write state bits to state latch.
wr_state      swapf   state,W         ; Get state bits in to W<4:1>.
              iorlw   0x0E            ; Set WR strobe.
              movwf   PORTB           ; Write to PORTB.
              andlw   0xF0            ; Clear strobe by selecting Q0.
              movwf   PORTB           ; Write to PORTB.
              return

;------------------------------------------------------------------------------
; Routine to convert a binary value  (0..63) in to a BCD pair. The result is
; returned in W. The lookup is done as a 'calculated goto' by modifying PCL
; (the lower eight bits of the program counter). PCL is only eight bits wide
; with the top five bits coming from the PCLATH register. We use an ORG
; statement to ensure that addition of the offset (0..63) to the table address
; doesn't overflow the PCL register (any overflow would be lost and would result
; in a jump to some other part of the code).

              ORG     0x0100

bin2bcd       clrf    PCLATH          ; Clear PCLATH.
              bsf     PCLATH,0        ; Set bit zero so that goto yields an
                                      ; address 0x01xx.
              andlw   H'3F'           ; Ensure we limit lookup.
              addwf   PCL,F           ; Add offset in W to PCL to calc. goto.

              retlw   0x00
              retlw   0x01
              retlw   0x02
              retlw   0x03
              retlw   0x04
              retlw   0x05
              retlw   0x06
              retlw   0x07
              retlw   0x08
              retlw   0x09
              retlw   0x10
              retlw   0x11
              retlw   0x12
              retlw   0x13
              retlw   0x14
              retlw   0x15
              retlw   0x16
              retlw   0x17
              retlw   0x18
              retlw   0x19
              retlw   0x20
              retlw   0x21
              retlw   0x22
              retlw   0x23
              retlw   0x24
              retlw   0x25
              retlw   0x26
              retlw   0x27
              retlw   0x28
              retlw   0x29
              retlw   0x30
              retlw   0x31
              retlw   0x32
              retlw   0x33
              retlw   0x34
              retlw   0x35
              retlw   0x36
              retlw   0x37
              retlw   0x38
              retlw   0x39
              retlw   0x40
              retlw   0x41
              retlw   0x42
              retlw   0x43
              retlw   0x44
              retlw   0x45
              retlw   0x46
              retlw   0x47
              retlw   0x48
              retlw   0x49
              retlw   0x50
              retlw   0x51
              retlw   0x52
              retlw   0x53
              retlw   0x54
              retlw   0x55
              retlw   0x56
              retlw   0x57
              retlw   0x58
              retlw   0x59
              retlw   0x60
              retlw   0x61
              retlw   0x62
              retlw   0x63

              END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -