; 该程序用RC充电的方法实现温度的检测
; RA0 数码管个位选通 RA1 数码管百位选通
; RB7 数码管百位和负号选通
; RA2 检测电容高低电平
; RA3 对电容充电和放电 ;----------------- INCLUDE "P16F84A.INC" ;------------------ ;***************************************************** LIST P=16F84A,R=DEC ;定义器件,默认为十进制 ;----------------------------------------------------- __CONFIG B'11111111110001';_CP_OFF&_WDT_OFF&_PWRITE_ON&_XT_OSC ;没有代码保护 ;看门狗关闭 ;上电廷时器开启 ;振荡器模式为XT RC EQU 2 RVCC EQU 3 JIZIBZ EQU 2 TIMER EQU 30H BZH EQU 32H TIMER2 EQU 36H FRISTJSQ EQU 33H XIANZHIL EQU 34H XIANZHIH EQU 35H JSQ1 EQU 37H BCDLS EQU 38H SUM EQU 39H JSQ2 EQU 42H XIANZHIBAI EQU 40H ;显值百位 L EQU 0 H EQU 1 BAI EQU 7;显示百位 ZEROFZ EQU 2 ;负值标记 FP EQU 0 ;分频标记 MAIN ORG 000H BANKSEL TRISB CLRF TRISB CLRF TRISA BANKSEL PORTB CLRF PORTB CLRF PORTA BCF PORTA,H BCF PORTA,L CLRZ NOP LOOP BANKSEL TRISA BSF TRISA,RC BCF TRISA,RVCC BANKSEL PORTA LOOP1 CLRF TIMER CLRF SUM CLRF BCDLS CLRF TIMER2 CLRF XIANZHIH CLRF XIANZHIL MOVLW 0FFH MOVWF XIANZHIBAI CLRF BZH CLRF JSQ2 BSF PORTA,RVCC CALL CONG LOOP2 BTFSS PORTA,RC GOTO OUT INCF TIMER,1;TIMER ;GOTO LOOP2 ;http://211.100.30.165/search/?key=测试','_blank');" onmouseout=kwL(event); target=_blank>测试2 BTFSC BZH,FP ;选择分频 GOTO TWOFP MOVLW D'1' ;低分频单步短 o 5 XORWF TIMER,0 BTFSS STATUS,Z GOTO LOOP2 CLRF TIMER INCF TIMER2,1;TMER2最终计时 MOVLW D'60';判TIMER2是否到了60到了60采用另一分频 XORWF TIMER2,0 BTFSC STATUS,Z BSF BZH,FP GOTO LOOP2 TWOFP MOVLW D'1' ;高分频单步长o 11 XORWF TIMER,0 BTFSS STATUS,Z GOTO LOOP2 CLRF TIMER INCF TIMER2,1 MOVLW D'1' ;只有在-1的时候才显示负数 XORWF TIMER2,0;判断是否为-1在00时不显示负数 BTFSC STATUS,Z GOTO SETFH ;转到设置负号 MOVLW D'120';判是否到了120如果到了,则为负值 XORWF TIMER2,0 BTFSS STATUS,Z GOTO LOOP2 ;CALL SETFH BSF BZH,ZEROFZ;置负数标志,因为是00所以不能置负号 CLRF TIMER2 GOTO LOOP2 SETFH ;设置负号 MOVLW 0BFH;040H MOVWF XIANZHIBAI GOTO LOOP2 OUT BSF PORTA,RVCC BTFSC BZH,ZEROFZ;如果是负值就不用减,如果是正值就应该减 GOTO CLFZ MOVF TIMER2,0 SUBLW D'120' MOVWF TIMER2 MOVF TIMER2,0 ;判断TIMER是不是有百位数 MOVWF JSQ2 MOVLW D'100' SUBWF JSQ2,1 BTFSS STATUS,C GOTO OUT_1 MOVLW 0F9H;006H MOVWF XIANZHIBAI MOVF JSQ2,0 MOVWF TIMER2 OUT_1 CALL BCDBIT GOTO XIANSHI CLFZ ;负值处理 CALL BCDBIT GOTO XIANSHI BCDBIT MOVLW D'8' MOVWF JSQ1 BCD_1 RLF TIMER2 RLF BCDLS,1 DECFSZ JSQ1,1 GOTO TIAOZHEN RETURN TIAOZHEN MOVLW D'3' ADDWF BCDLS,0 MOVWF SUM BTFSC SUM,3 MOVWF BCDLS MOVLW 030H ADDWF BCDLS,0 MOVWF SUM BTFSC SUM,7 MOVWF BCDLS GOTO BCD_1 CONG BSF PORTA,RVCC MOVLW D'200' MOVWF 43H DECFSZ 43H GOTO $-1 BCF PORTA,RVCC RETURN XIANSHI MOVLW D'8' MOVWF JSQ2 ;一次显示循环次数,以免闪泺 ;-----------显示L------- XS MOVF BCDLS,0;读出两位十进制数 ANDLW 00FH;去掉高四位 MOVWF XIANZHIL;低四位放在L SWAPF BCDLS,1 ;高低交换,高在低位 MOVLW 00FH;取高位值 ANDWF BCDLS,0; MOVWF XIANZHIH;放到显示H中 SWAPF BCDLS,1;恢复BCDLS值 BCF PORTA,H;关H BCF PORTA,L;关L CLRF PORTB MOVF XIANZHIL,0 CALL TAB MOVWF PORTB BCF PORTB,BAI BSF PORTA,L;打开L CALL YS;延时 ;-----------显示H------- BCF PORTA,H;关闭显示 BCF PORTA,L CLRF PORTB MOVF XIANZHIH,0 CALL TAB MOVWF PORTB BCF PORTB,7 BSF PORTA,H;开高 CALL YS ;-----------显示BAI------- BCF PORTA,H;关 BCF PORTA,L ;BCF PORTA,BAI CLRF PORTB MOVF XIANZHIBAI,0 MOVWF PORTB BSF PORTB,7 ; BSF PORTA,BAI CALL YS DECFSZ JSQ2,1;判断循环4次到了没有 GOTO XS BCF PORTB,7 WAIT ;CALL CONG GOTO LOOP1 TAB ADDWF PCL,F RETLW 0XC0;0 RETLW 0XF9;1 RETLW 0XA4;2 RETLW 0XB0;3 RETLW 0X99;4 RETLW 0X92;5 RETLW 0X82;6 RETLW 0XF8;7 RETLW 0X80;8 RETLW 0X90;9 RETURN YS MOVLW H'0F' MOVWF 20H YS_1 MOVLW H'0F' MOVWF 21H DECFSZ 21H,1 GOTO $-1 DECFSZ 20H,1 GOTO YS_1 RETURN
END
|