RG 0008H
;-------------------------------------------------
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
RETLW 0C0H ;A
RETLW 08CH ;b
RETLW 09EH ;c
RETLW 086H ;d
RETLW 098H ;E
RETLW 0D8H ;F
;----- -----------------------------------------------
TMR0SERV
MOVWF W_TEMP ;现场保护
SWAPF STATUS,W ;用SWAPF才不会影响标志位
MOVWF STATUS_TEMP ;将W和STATUS存入各保护寄存器
MOVLW 0FFH
MOVWF PORTB ;先熄灭所有数码管以免闪烁
BSF PORTA,1
BSF PORTA,2
MOVLW TABLE
MOVWF TABADD ;将转换表的首地址存入TABADD
MOVFW DISPBUF_L ;计数值(W)与转换表的起始地址相加
BTFSS FLAGS,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
MOVLW 155 ;送定时器初值
MOVWF RTCC
BCF INTCON,T0IF ;清定时器0溢出中断标志位
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 0F8H ;将RMT设置为输入,S2输入其它IO口设置为输出
MOVWF TRISA
MOVLW 00H ;
MOVWF TRISB
MOVLW 84H
MOVWF OPTION_REG ;预分频器分配给定时器0,分频比1:32;
BCF STATUS,RP0 ;恢复寄存器体0
MOVLW 155
MOVWF RTCC ;定时器送初值(255-155)*32US=3.2MS,每3.2MS一次中断
MOVLW 0FFH ;先让数码管全部不显示
MOVWF PORTB
CLRF DISPBUF_L ;数码管先显示00
CLRF DISPBUF_H
CLRF COUNTER ;按键计数送初值
BCF INTCON,T0IF
BSF INTCON,T0IE ;定时器0溢出中断允许
BSF INTCON,GIE ;总中断允许
;--------------------------------------------------
LOOP
BTFSS PORTA,3 ;是否按下S9
GOTO KEY ;跳转键处理
BTFSS PORTA,RMT ;是否有遥控器按下
GOTO RCV ;跳转遥控接收程序
GOTO LOOP ;反复检测
;--------------------------------------------------
KEY
CLRF CNT0 ;消除键抖动
MOVLW 100
MOVWF C