| ;  该程序用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
 |