欢迎大家来到PIC单片机学习网,如果您用http://www.pic16.com/无法顺利的访问本站,请改用镜像站点http://www.cxqmcu.com/试试.

ST套件上0-99秒计时,比较准的!(由网友wonderfulsf提供)

ST套件上0-99秒计时,比较准的!

;这是我学习PIC完成的第一个程序烧在了ST套件上不错,0-99秒计时

;如果用MPLAB模拟,用stopwach计时非常准

;ST套件上0-99秒表程序,根据原0-99键控程序上改写的,初学练习
;****************************************************************
  LIST P=16F84A,R=DEC    ;MCU:16F84,默认数制为十进制
;-----------------------------------------------
  __CONFIG B'11111111110001';_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC
                                              ;没有代码保护
                                              ;看门狗关闭
                                              ;上电廷时器开启
                                              ;振荡器模式为XT
;---------------------
RTCC       EQU 01H ;计数器
PC         EQU 02H  ;程序计数器
STATUS     EQU 03H ;状态寄存器
PORTA      EQU 05H
PORTB      EQU 06H
INTCON     EQU 0BH

OPTION_REG EQU 1H ;81H
TRISA      EQU 5H
TRISB      EQU 6H
;-----------------------STATUS
C          EQU 0
Z          EQU 2
RP0        EQU 5 ;寄存器体选
;-------------------------INTCON
T0IF       EQU 2 ;定时器0溢出中断标志位
T0IE       EQU 5 ;定时器0溢出中断允许/禁止
GIE        EQU 7 ;总中断允许/禁止
;-------------------------
TABADD     EQU 13H ;转换数码管地址
FLAGS      EQU 14H ;显示位选标志位
DISPBUF_H  EQU 15H ;显示器秒拾位
DISPBUF_L  EQU 16H ;显示器秒个位
DIGIT      EQU 1AH      ;5ms计数器
W_TEMP     EQU 1BH      ;W现场保护寄存器
STATUS_TEMP EQU 1CH     ;STATUS现场保护寄存器
;--------------------
     ORG 0000H
     GOTO MAIN
     ORG 004H
TMR0SERV
    MOVWF W_TEMP         ;现场保护
    SWAPF STATUS,W       ;用SWAPF才不会影响标志位
    MOVWF STATUS_TEMP    ;将W和STATUS存入各保护寄存器

    MOVLW 100            ;送定时器初值
    MOVWF RTCC
  BCF INTCON,T0IF        ;清定时器0溢出中断标志位

  MOVLW 0FFH
    MOVWF PORTB          ;先熄灭数码管以免闪烁
    BSF PORTA,1
    BSF PORTA,2

    MOVLW TABLE
    MOVWF TABADD        ;将转换表的首地址存入TABADD
    MOVFW DISPBUF_L    ;计数值(W)与转换表的起始地址相加
    BTFSS FLAGS,1 ;FLAGS1位为1时,显示低位
    MOVFW DISPBUF_H
    ADDWF TABADD,W
    CALL CONVERT       ;存入W后调用转换表子程序
    MOVWF PORTB        ;送RB口显示

    BTFSS FLAGS,1      ;根据标志位选择是点亮那一个数码管
    BCF PORTA,1
    BTFSC FLAGS,1
    BCF PORTA,2
    COMF FLAGS,1

  INCF DIGIT,1
  MOVLW 200      ;计数值为200后不再加1
    XORWF DIGIT,0
    BNZ TIMEND  
    CLRF DIGIT

  INCF DISPBUF_L,1 ;秒个位加1
  MOVLW 10
  XORWF DISPBUF_L,0
  BNZ TIMEND
  CLRF DISPBUF_L

  INCF DISPBUF_H,1 ;秒拾位加1
  MOVLW 10
  XORWF DISPBUF_H,0
  BNZ TIMEND
  CLRF DISPBUF_H

  
TIMEND
   SWAPF STATUS_TEMP,W     ;恢复中断前STATUS,W的值
   MOVWF STATUS
   SWAPF W_TEMP,F
   SWAPF W_TEMP,W          ;(用SWAPF才不会影响STATUS的值)
   RETFIE
;------------------------------------------------
MAIN
   CLRF PORTA
   CLRF PORTB         ;初始化IO口

   BSF STATUS,RP0     ;设置寄存器体1
   MOVLW 00000000B  
   MOVWF TRISA
   MOVLW 00000000B
   MOVWF TRISB
   MOVLW 10000100B
   MOVWF OPTION_REG    ;预分频器分配给定时器0,分频比1:32
   BCF STATUS,RP0     ;恢复寄存器体0

   MOVLW 100
   MOVWF RTCC         ;定时器送初值(256-100)*32US=4.992MS,每4.992MS一次中断
   MOVLW 0FFH         ;先让数码管全部不显示
   MOVWF PORTB
   CLRF DIGIT         ;显示计数器清0
   CLRF DISPBUF_L     ;数码管先显示00
   CLRF DISPBUF_H
   BCF INTCON,T0IF
   BSF INTCON,T0IE    ;定时器0溢出中断允许
   BSF INTCON,GIE      ;总中断允许
;--------------------------------------------------
LOOP
   GOTO LOOP         ;循环扫描

CONVERT
   MOVWF PC      ;将W寄存器内的7段显示码地址放入PC
TABLE            ;PC执行新地址指令, 跳到相对的地址执行?
   RETLW 081H ;0 ;RETLW指令,将七段显示码存入W后返回
   RETLW 0E7H ;1
   RETLW 092H ;2
   RETLW 0A2H ;3
   RETLW 0E4H ;4
   RETLW 0A8H ;5
   RETLW 088H ;6
   RETLW 0E3H ;7
   RETLW 080H ;8
   RETLW 0A0H ;9
;----- -----------------------------------------------
   END
                                         wonderfulsf奉上

 

PIC单片机学习网  http://www.pic16.com       http://www.cxqmcu.com