十年专注单片机方案开发的方案公司英锐恩,分享ST套件上0-99秒计时。英锐恩现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。
;这是我学习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