|
;**********************************************************
TMR0 EQU 01H ;定义定时器/计数器0寄存器地址
PCL EQU 02H ;定义程序计数器低字节寄存器地址
STATUS EQU 03H ;定义状态寄存器地址
PORTA EQU 05H ;定义RA口数据寄存器地址
TRISA EQU 85H ;定义RA口方向控制寄存器地址
PORTB EQU 06H ;定义RB的数据寄存器地址
TRISB EQU 86H ;定义RB的方向控制寄存器地址
PORTC EQU 07H ;定义RC口数据寄存器地址
TRISC EQU 87H ;定义RC口方向控制寄存器地址
PORTD EQU 08H ;定义RD口数据寄存器地址
TRISD EQU 88H ;定义RD口方向控制寄存器地址
PORTE EQU 09H ;定义RE口数据寄存器地址
TRISE EQU 89H ;定义RE口方向控制寄存器地址
INTCON EQU 0BH ;定义中断控制寄存器地址
OPTION_REG EQU 81H ;定义选项寄存器地址
ADCON1 EQU 9FH ;定义ADC模块控制寄存器1的地址
C EQU 0 ;定义进位标志位的位地址
Z EQU 2 ;定义0标志位的位地址
RP0 EQU 5 ;定义状态寄存器中的页选位RP0
W EQU 0 ;定义传送目标寄存器为W的指示位
F EQU 1 ;定义传送目标寄存器为RAM的指示位
T0IF EQU 2 ;定义TMR0中断标志位的位地址
T0IE EQU 5 ;定义TMR0中断使能位的位地址
INTE EQU 4 ;定义外部中断使能位的位地址
INTF EQU 1 ;定义外部中断标志位的位地址
RBIF EQU 0 ;
DC EQU 1 ;
RBIE EQU 3 ;
GIE EQU 7 ;
PSA EQU 3 ;
RB4 EQU 4 ;
RB5 EQU 5 ;
RB6 EQU 6 ;
RB7 EQU 7 ;
FLAG EQU 20H ;
N1 EQU D'2' ;
N2 EQU D'30' ;
DATA1 EQU 21H ;
DATA2 EQU 22H ;
DATA3 EQU 23H ;
DATA4 EQU 24H ;
BUF EQU 28H ;
BUF1 EQU 29H ;
BUF2 EQU 2AH ;
BUF3 EQU 2BH ;
BUF4 EQU 2CH ;
BUF5 EQU 2DH ;
CNT1 EQU 2EH ;
CNT2 EQU 2FH ;
CNT3 EQU 30H ;
CNT4 EQU 31H ;
PORTB_B EQU 27H ;
PORTC_B EQU 32H ;
OPTION_TEMP EQU 33H ;
PCLATH_B EQU 34H ;
W_TEMP EQU 7FH ;W现场保护寄存器
STATUS_TEMP EQU 35H ;STATUS现场保护寄存器
BUF_TEMP EQU 36H ;
BUF_TEMP1 EQU 37H ;
BUF1_TEMP EQU 38H ;
BUF1_TEMP1 EQU 39H ;
PORTB_TEMP EQU 3AH ;
PORTD_B EQU 3BH ;
BUF2_TEMP EQU 3CH ;
BUF2_TEMP1 EQU 3DH ;
BUFF EQU 3EH ;
ORG 000H ;
NOP ;放置一条ICD必需的空操作指令
GOTO MAIN ;
ORG 004H ;
GOTO INTSERV ;
ORG 008H ;
MAIN
BSF STATUS,RP0 ;设置寄存器体1
MOVLW 07H ;PSA=0 for tmr0, PS2,PS1,PS0=1 分频比1:256
MOVWF OPTION_REG ;预分频器分配给定时器0,开启RB口弱上拉.
MOVLW 07H ;
MOVWF ADCON1 ;设置RA口全部为普通数字IO口
MOVLW 00H ;
MOVWF TRISC ;RC口全部为输出
MOVWF TRISD ;RD口全部为输出
MOVLW 0FFH ;
MOVWF TRISB ;RB口全部为输入
BCF STATUS,RP0 ;恢复寄存器体0
;**********************************
KEYLOOP
CALL DISP2 ;
MOVF PORTB,W ;
ANDLW B'00110111' ;
XORLW B'00110111' ;
BTFSC STATUS,Z ;
GOTO KEYLOOP ;
CALL delay10ms ;
MOVF PORTB,W ;
ANDLW B'00110111' ;
XORLW B'00110111' ;
BTFSC STATUS,Z ;
GOTO KEYLOOP ;
;*********************************
BTFSS PORTB, 0 ;
GOTO KEY0 ;
BTFSS PORTB, 1 ;
GOTO KEY1 ;
BTFSS PORTB, 2 ;
GOTO KEY2 ;
BTFSS PORTB, 4 ;
GOTO KEY3 ;
BTFSS PORTB, 5 ;
GOTO KEY4 ;
GOTO KEYLOOP ;
;*********************************
KEY0 MOVLW 0A0H ;
MOVWF INTCON ;
MOVLW .16 ;
MOVWF CNT2 ;
MOVLW .12 ;
MOVWF TMR0 ;
GOTO WAITREL ;
;*********************************
KEY4 MOVLW 00H ;
MOVWF INTCON ;
GOTO WAITREL ;
;*********************************
KEY1 INCF BUF1, 1 ;
MOVF BUF1, W ;
ANDLW 0FH ;
XORLW 0AH ;
BTFSC STATUS,Z ;
GOTO MIN_L ;
GOTO WAITREL ;
MIN_L MOVF BUF1, W ;
ANDLW 0F0H ;
MOVWF BUF1 ;
GOTO WAITREL ;
KEY2 MOVLW 10H ;
ADDWF BUF1, F ;
MOVF BUF1, W ;
ANDLW 0F0H ;
XORLW 60H ;
BTFSC STATUS,Z ;
GOTO MIN_H ;
GOTO WAITREL ;
MIN_H MOVF BUF1, W ;
ANDLW 0FH ;
MOVWF BUF1 ;
GOTO WAITREL ;
KEY3 INCF BUF2, 1 ;
MOVF BUF2, W ;
ANDLW 0FH ;
XORLW 0AH ;
BTFSC STATUS,Z ;
GOTO HOUR_L ;
GOTO HOUR_H ;
HOUR_L MOVF BUF2, W ;
ANDLW 0F0H ;
MOVWF BUF2 ;
MOVLW 10H ;
ADDWF BUF2, F ;
MOVF BUF2, W ;
ANDLW 0F0H ;
XORLW 20H ;
BTFSC STATUS,Z ;
GOTO HOUR_H ;
HOUR_H MOVF BUF2, W ;
XORLW 24H ;
BTFSC STATUS,Z ;
CLRF BUF2 ;
WAITREL CALL DISP2 ;
MOVF PORTB,W ;
ANDLW B'00110111' ;
XORLW B'00110111' ;
BTFSC STATUS,Z ;
GOTO KEYLOOP1 ;
GOTO WAITREL ;
KEYLOOP1 CALL delay10ms ;
GOTO KEYLOOP ;
;*********************************
INTSERV
MOVWF W_TEMP ;
SWAPF STATUS,W ;
CLRF STATUS ;
MOVWF STATUS_TEMP ;
BCF INTCON,T0IF ;
DECFSZ CNT2,1 ;
GOTO KEYOUT ;
MOVLW .16 ;
MOVWF CNT2 ;
INCF BUF,1 ;
MOVF BUF,W ;
ANDLW 0FH ;
XORLW 0AH ;
BTFSS STATUS,Z ;
GOTO KEYOUT ;
MOVF BUF,W ;
ANDLW 0F0H ;
MOVWF BUF ;
MOVLW 10H ;
ADDWF BUF,1 ;
MOVF BUF,W ;
ANDLW 0F0H ;
XORLW 60H ;
BTFSS STATUS,Z ;
GOTO KEYOUT ;
CLRF BUF ;
INCF BUF1,1 ;
MOVF BUF1,W ;
ANDLW 0FH ;
XORLW 0AH ;
BTFSS STATUS,Z ;
GOTO KEYOUT ;
MOVF BUF1,W ;
ANDLW 0F0H ;
MOVWF BUF1 ;
MOVLW 10H ;
ADDWF BUF1,1 ;
MOVF BUF1,W ;
ANDLW 0F0H ;
XORLW 60H ;
BTFSS STATUS,Z ;
GOTO KEYOUT ;
CLRF BUF1 ;
INCF BUF2,1 ;
MOVF BUF2,W ;
ANDLW 0FH ;
XORLW 0AH ;
BTFSS STATUS,Z ;
GOTO HOUR_OUT ;
MOVF BUF2,W ;
ANDLW 0F0H ;
MOVWF BUF2 ;
MOVLW 10H ;
ADDWF BUF2,1 ;
MOVF BUF2,W ;
ANDLW 0F0H ;
XORLW 20H ;
BTFSS STATUS,Z ;
GOTO HOUR_OUT ;
HOUR_OUT MOVF BUF2, W ;
XORLW 24H ;
BTFSC STATUS,Z ;
CLRF BUF2 ;
KEYOUT MOVLW .12 ;
MOVWF TMR0 ;
SWAPF STATUS_TEMP,W ;
MOVWF STATUS ;
SWAPF W_TEMP,F ;
SWAPF W_TEMP,W ;
RETFIE ;
;*********************************
; 显示子程序 ;
;*********************************
DISP2 MOVF BUF, W ;
ANDLW 0FH ;
CALL convert ;
MOVWF PORTC ;
BCF PORTD,0 ;
CALL DELAY ;
BSF PORTD,0 ;
MOVF BUF, W ;
MOVWF BUF_TEMP ;
SWAPF BUF_TEMP,W ;
ANDLW 0FH ;
CALL convert ;
MOVWF PORTC ;
BCF PORTD,1 ;
CALL DELAY ;
BSF PORTD,1 ;
MOVF BUF1, W ;
ANDLW 0FH ;
CALL convert ;
MOVWF PORTC ;
BCF PORTD,2 ;
CALL DELAY ;
BSF PORTD,2 ;
MOVF BUF1, W ;
MOVWF BUF1_TEMP ;
SWAPF BUF1_TEMP,W ;
ANDLW 0FH ;
CALL convert ;
MOVWF PORTC ;
BCF PORTD,3 ;
CALL DELAY ;
BSF PORTD,3 ;
MOVF BUF2, W ;
ANDLW 0FH ;
CALL convert ;
MOVWF PORTC ;
BCF PORTD,4 ;
CALL DELAY ;
BSF PORTD,4 ;
MOVF BUF2, W ;
MOVWF BUF2_TEMP ;
SWAPF BUF2_TEMP,W ;
ANDLW 0FH ;
CALL convert ;
MOVWF PORTC ;
BCF PORTD,5 ;
CALL DELAY ;
BSF PORTD,5 ;
RETURN ;
;*********************************
DELAY ;{2+[2+(1+2)*(DATA2-1)+2+1+2]*(DATA1-1)+2+2}=0.382MS
MOVLW N1 ;(1)
MOVWF DATA1 ;(1)
DEL1 MOVLW N2 ;(1)
MOVWF DATA2 ;(1)
DEL2 DECFSZ DATA2,1 ;(1\2)DATA2-1=0?
GOTO DEL2 ;(2)
DECFSZ DATA1,1 ;(1\2)DATA1-1=0?
GOTO DEL1 ;(2)
RETURN ;(2)
;;********************************
delay10ms
MOVLW .4 ;将外层循环参数值送到DATA3
MOVWF DATA3 ;
LP0
MOVLW .3 ;将内层循环参数值送到DATA4
MOVWF DATA4 ;
LP1 CALL DISP2 ;(382*4+44)uS=1.572MS
DECFSZ DATA4,1 ;变量DATA4内容递减,若为0则跳跃
GOTO LP1 ;跳转到LP1
DECFSZ DATA3,1 ;变量DATA3内容递减,若为0则跳跃
GOTO LP0 ;跳转到LP0
RETURN ;返回主程序
;**********************************
convert
ADDWF PCL,1 ;
TABLE RETLW 0C0H ; 0
RETLW 0F9H ; 1
RETLW 0A4H ; 2
RETLW 0B0H ; 3
RETLW 99H ; 4
RETLW 92H ; 5
RETLW 82H ; 6
RETLW 0F8H ; 7
RETLW 80H ; 8
RETLW 90H ; 9
END
参考链接:[img]http://www.picavr.com/news/2008-06/6755.htm]http://www.picavr.com/news/2008-06/6755.htm
|
|