本帖最后由 liht1634 于 2009-12-15 11:33 编辑
LIST P=16F946 ; list directive to define processor
#INCLUDE <;P16F946.INC> ; processor specific variable definitions
__CONFIG _FCMEN_OFF & _IESO_OFF & _CP_OFF & _WDT_OFF & _BOD_OFF & _MCLRE_ON & _PWRTE_OFF & _HS_OSC
;*******************************************
ORG 00H
NOP
GOTO START
;*******************************************
;注:PIC16F946器件在中断服务程序和主程序中使用GOTO,就必须在中断服务程序中保存和恢复PCLATH
ORG 04H ;进入中断;保护现场和恢复现场
MOVWF W_TEMP ;复制W到它的临时备份寄存器W_TEMP中
SWAPF STATUS,W ;将STATUS寄存器高低半字节交换后放入W
CLRF STATUS ;不管当前处在哪个体,都设置体0作当前体
MOVWF STATUS_TEMP ;保存STATUS到体0上的临时寄存器STATUS_TEMP
MOVF PCLATH, W ;把寄存器PCLATH内容复制到W中
MOVWF PCLATH_TEMP ;经W将PCLATH内容转到临时寄存器PCLATH_TEMP
CLRF PCLATH ;不管当前处在哪页,都把PCLATH设置成指向页0(中断服务程序的核心部分)
CALL INT_SERV ;调用中断服务子程序
MOVF PCLATH_TEMP,W ;经过W转移
MOVWF PCLATH ;恢复PCLATH内容
SWAPF STATUS_TEMP,W ;将STATUS_TEMP寄存器高低半字节交换后放入W
MOVWF STATUS ;把W内容移动到STATUS寄存器(同时也把当前体恢复到原先的体上)
SWAPF W_TEMP,F ;将W_TEMP内容高低半字节交换后放回
SWAPF W_TEMP,W ;再次将W_TEMP内容高低半字节交换后放入W
RETFIE
;///////////////////////////////////////////
INT_SERV ;中断服务判断
BANKSEL PIR2 ;当使能PLVD模块后,应该使用软件延时以确保正确读取模块的状态
BTFSC PIR2,LVDIF ;PLVD稳定时间预计小于50uS(当VDD=5V时)
CALL WRBYTES
BTFSC INTCON,T0IF ;是TMR0中断吗?
CALL SVC_TMR0 ;是,转TMR0中断服务程序
RETURN
;*******************************************
SVC_TMR0 ;TMR0子程序
BCF INTCON,T0IF ;TMRO增1一次的时间=(晶振频率F÷4÷分频比)的倒数
MOVLW 0ECH ;中断时间T=(0FFH-TMRO)*128=(256-236)*128=2560uS=2.56mS
MOVWF TMR0
BANKSEL PORTC
BSF PORTC,3 ;打开指示
BANKSEL FLAG
MOVLW 80H ;死机RC1无输出脉冲
XORWF FLAG,1
BTFSC FLAG,7
BSF PORTC,1 ;RC1输出高电平
BTFSS FLAG,7
BCF PORTC,1 ;RC1输出低电平
CALL SCANKEYS ;键盘扫描
CALL DISPLAY ;LED显示
BANKSEL FLAG
BTFSC FLAG,7
RETURN
;///////////////////////////////////////////
BANKSEL TEMP_SW
INCF TEMP_SW
BTFSS TEMP_SW,2
GOTO TMR0_END1
CLRF TEMP_SW
TMR0_END1
BANKSEL TEMP_SW
MOVF TEMP_SW,0
ANDLW 0FFH
MOVWF PORTF
BSF PORTF,5
BSF PORTF,4
BANKSEL PORTE
BSF PORTE,7
RETURN
;*******************************************
START
BANKSEL PORTA ;BANK0
CLRF PORTA ;PORTA-F寄存器初始化
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BANKSEL PORTF
CLRF PORTF
CLRF PORTG
CALL TRIS_INIT ;TRISA-F初始化
BANKSEL PORTE
BSF PORTE,7 ;显示初始化关闭显示RE7
CLRF ADCON0 ;AD结果格式左对齐;参考电压VSS/VDD;初始通道AN0
CLRF FLAG ;清标志寄存器
CLRF PIR2
CLRF INTCON
MOVLW 0ECH
MOVWF TMR0
BANKSEL PORTF
BSF PORTF,4 ;显示初始化关闭显示RF4
BSF PORTF,5 ;显示初始化关闭显示RF5
BCF PORTF,0
BCF PORTF,1
CLRF FLAG_SW5
CLRF FLAG_SW4
CLRF FLAG_SW
CLRF TEMP_SW
BSF FLAG_SW5,1 ;水温设定
BSF FLAG_SW4,1 ;温度设定
BSF FLAG_SW,4 ;打开电源灯
BANKSEL LVDCON ;使能低电压检测(VPLD)模块
MOVLW 07H
MOVWF LVDCON
BANKSEL PIE2
BCF INTCON,PEIE
BCF PIE2,LVDIE
BANKSEL LVDCON
BSF LVDCON,LVDEN
;///////////////////////////////////////////
BANKSEL START_DEL_BUF ;上电延时100mS
MOVLW .100 ;此段程序不可以去掉,用于使能低电压检测模块后
MOVWF START_DEL_BUF ;确保能正确读取模块的状态
START1
CALL DELAY500uS
CLRWDT
DECFSZ START_DEL_BUF,1
GOTO START1
;///////////////////////////////////////////
START2
CALL RDBYTES
BSF INTCON,GIE
BSF INTCON,T0IE ;允许T0中断
;*******************************************
LOOP
CALL TRIS_INIT ;TRIS_INIT初始化
CLRWDT
GOTO LOOP
;*******************************************
TRIS_INIT
BANKSEL CMCON0
MOVLW 07h ;Set RA<2:0> to digital I/O,关闭比较器
MOVWF CMCON0
CLRF ANSEL ;Make all PORTA I/O
MOVLW 0FFh
MOVWF TRISA
MOVLW 00H
MOVWF TRISB
MOVLW 0C0H
MOVWF TRISC
BANKSEL LCDCON
CLRF LCDCON ;Disable VLCD<3:1> inputs on RC<2:0>
BANKSEL TRISD
MOVLW 00H
MOVWF TRISD
MOVLW 3FH
MOVWF TRISE
CLRF ANSEL
BANKSEL TRISF
MOVLW 0C0H
MOVWF TRISF
BANKSEL ANSEL
CLRF ANSEL
BANKSEL TRISG
MOVLW 00h
MOVWF TRISG
MOVLW B'11000111' ;禁止PORTB上拉功能;RB0/INT引脚上升沿触发中断
MOVWF OPTION_REG ;预分频器分配给Timer0模块;分频比1:256
RETURN
;*******************************************
DELAY500uS ;延时500uS子程序;1条指令0.5uS
BANKSEL DEL500uS_BUF
MOVLW 0C8H ;(4+(1+1+1+2)*200-1)*0.5=501.5uS
MOVWF DEL500uS_BUF
DELAY500uS_1
CLRF INTCON
BANKSEL PIE2
BCF PIE2,LVDIF
DECFSZ DEL500uS_BUF,1
GOTO DELAY500uS_1
;*******************************************
WRBYTES ;向I2C写入N字节,写入的起始地址在ADDR中,源数据起始地址指针在W中
CLRF INTCON
BANKSEL PIE2
BCF PIE2,LVDIE
RETURN
;*******************************************
RDBYTES
RETURN
;*******************************************
END
程序执行到BSF LVDCON,LVDEN后,就使能了低电压检测模块,这时PIR2,LVDIF就被置1了,程序进入低电压检测中断,我己经禁止了此中断。大家帮忙看看是哪里的问题,不甚感激!!! |