中国·深圳市龙岗区坂田环城南路坂田国际中心C2栋815
4007-888-234
enroo@enroo.com
0
点击次数:856次 更新时间:2012-08-22
;****************************************************************
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