📄 ex1001.asm
字号:
;
; LCD + PRECISION TIMER (00.00~99.99 SEC) (Timer0)
;
LIST P=16F877, R=DEC
#INCLUDE P16F877.INC
CBLOCK 0X20
ENDC
;
; define RAM
;
CBLOCK
TIMBFH, TIMBFL ; for precission timer
R0_PRC100mS
R0:2 ; reserve 2 bytes for LCD LINE2
W_BAK, STATUS_BAK ; back up RAM for w register
BCDBFH, BCDBFL ; buffers for HEX to BCD converter
ENDC
;
; define data
;
DATMR0 EQU 256-125 ; 125*16uS=2mS(for 16 MHz)
;
;
;.......................................................................
;
ORG 0
NOP
GOTO MAIN ; reset vector
;
ORG 4 ;
MOVWF W_BAK ; save w register
SWAPF STATUS,W ; save STATUS register
MOVWF STATUS_BAK
MOVLW DATMR0 ;
ADDWF TMR0 ; restore TMR0
DECF R0_PRC100mS
BCF INTCON,T0IF ; clear interrupt flag
SWAPF STATUS_BAK,W
MOVWF STATUS
SWAPF W_BAK
SWAPF W_BAK,W ; restore w register without affecting status
RETFIE ; return + (bsf INTCON,GIE)
;
;................................
;
MAIN:
;
BANKSEL OPTION_REG ; OPTION_REG is in bank1
MOVLW B'00000101' ; RBPU(0),INTEDG(0),T0CS(0=INT),T0SE(0)
; PSA(0=PRESC to timer)
; PS2~0(101=1/64)
MOVWF OPTION_REG
BANKSEL TMR0
MOVLW DATMR0 ; 64*125=2000uS for 16 MHz crystal
MOVWF TMR0 ; reset buffer of timer0
MOVLW 50 ; 50*2mS=100mS
MOVWF R0_PRC100mS ; reset 50*2mS counter
;
BSF INTCON,T0IE ; actuate timer0 interrupt
BSF INTCON,GIE ; actuate global interrupt
;
CLRF TIMBFH ; clear buffers of timer
CLRF TIMBFL
CLRF R0 ; clear buffers of LCD line 2
CLRF R0+1
;
;
MAIN1:
CALL PRC_100mS ; precission 100 mS timer
call L2homeLCD ; move cursor to the beginning of line 2
MOVLW ' '
CALL putcLCD
MOVLW ' '
CALL putcLCD
MOVF R0,W
CALL putHexLCD
;
MOVLW '.'
CALL putcLCD ; put the decimal point
;
MOVF R0+1,W
CALL putHexLCD
;
put_SEC:
MOVLW ' '
CALL putcLCD
;
MOVLW 'S'
CALL putcLCD
;
MOVLW 'e'
CALL putcLCD
;
MOVLW 'c'
CALL putcLCD
;
GOTO MAIN1
;
;
;.............................................................................
;
; precission 100mS timer
;
PRC_100mS:
TSTF R0_PRC100mS
SKPZ
GOTO PRC_100mS
;
MOVLW 50
MOVWF R0_PRC100mS ; restore 50*2 mS counter
;
MOVLW .10 ; only ten digit of TIMBFL is used
ADDWF TIMBFL ; hence add .10 every time
MOVF TIMBFL,W
CALL HX2BCD
MOVF BCDBFL,W
MOVWF R0+1
SKPZ ; Adjust sec every 10*0.1 sec
GOTO PRC_100mS1 ; end of suroutine
MOVWF TIMBFL ; 0x0a-->.10
INCF TIMBFH ; TIMBFH+1
MOVF TIMBFH,W
CALL HX2BCD
MOVF BCDBFL,W
MOVWF R0
SKPNZ
MOVWF TIMBFH ; 0x64-->.100
PRC_100mS1:
RETURN
;
;
;---------------------------------------------------------------;
;
#INCLUDE <LCD.INC> ;
;
; Defines for I/O ports that provide LCD data & control ;
;
LCD_DATA equ PORTB ;
LCD_CNTL equ PORTB ;
;
RS equ 5 ; RS=PORTB,5 ;
E equ 4 ;
;
;===============================================================;
;---------------------------------------------------------------;
;
#INCLUDE <HX2BCD.INC> ;
;
;===============================================================;
;
;
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -