⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 时间继电器
💻 ASM
字号:
;-----------------------
;系统程序设计
;----几个重要子程序及主子程序之间的关系
;-----------------------
;以下为特殊功能存储器的定义
;-----------------------
	INCLUDE "PIC12F683.INC"
	__config (_INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF)
;--------------------- --
;以下为I/O口定义
;-----------------------
#DEFINE	ANJIAN  GP5		;按键,低电平有效
#DEFINE AD01 GP4		;启动时间调节
#DEFINE	AD02 GP2		;闭合时间延时
;-----------------------
;以下为内部RAM的定义
;-----------------------
WBUF	EQU 20H		;W保护单元,含0A0H单元
STBUF	EQU 21H		;STATUS保护单元
FSBUF	EQU 22H		;FSR保护单元
PCBUF	EQU 23H		;PCLATH保护单元
R0	EQU 24H		;R0~7工作寄存器
R1	EQU 25H		;R0~7循环变量或中间结果
R2	EQU 26H
R3	EQU 27H
R4	EQU 28H
R5	EQU 29H
R6	EQU 2AH
R7	EQU 2BH
DSBUF0	EQU 2CH		;2.5mS加1计数器
DSFL	EQU 2DH		;显示位闪烁控制
DELAY1	EQU 2EH		;继电器启动延时
DELAY2	EQU 2FH		;继电器闭合延时
;-----------------------
;-----------------------
PORT	EQU 30H		;I/O口映射器
;-----------------------
#DEFINE LED1 PORT,0	;启动指示
#DEFINE LED2 PORT,1	;闭合指示
;-----------------------
KEY1	EQU 31H		;键值1,触发型
;------
#DEFINE K0 KEY1,5
;------
LKEY1	EQU 32H		;旧键值1,控制型
;------
#DEFINE LK0 LKEY1,5
;------
KCAP	EQU 33H		;键值滤波单元
;余下的12个RAM待用
;-----------------------
;-----------------------
TIMER	EQU 40H		;定时器,基准5mS
STA	EQU 41H		;工作状态寄存器
STA1	EQU 42H		; 
STA2	EQU 43H		; 
R8	EQU 44H		;
R9	EQU 45H		;
SEC	EQU 46H		;秒单元
FLAG	EQU 47H		;标志位
#DEFINE	OUT1 FLAG,0	;
#DEFINE	OUT2 FLAG,1	;
;-----------------------
;宏定义,W,STATUS,FSR,PCLATH进栈
;-----------------------
PUSH	MACRO
	MOVWF WBUF
	SWAPF WBUF,1
	SWAPF STATUS,W
	BCF   RP0
	MOVWF STBUF
	SWAPF FSR,W
	MOVWF FSBUF
	SWAPF PCLATH,W
	MOVWF PCBUF
	ENDM
;-----------------------
;宏定义,W,STATUS,FSR,PCLATH出栈
;-----------------------
POP	MACRO
	BCF   RP0
	SWAPF PCBUF,W
	MOVWF PCLATH
	SWAPF FSBUF,W
	MOVWF FSR
	SWAPF STBUF,W
	MOVWF STATUS
	SWAPF WBUF,W
	ENDM
;-----------------------
;宏定义,RAM体选择
;-----------------------
BANK0	MACRO
	BCF RP0
	ENDM 
BANK1 	MACRO
	BSF RP0
	ENDM
;-----------------------
	ORG 0x000
RESET_VECTOR
	CLRF PCLATH
	GOTO MAIN
	GOTO MAIN
	GOTO MAIN
;-----------------------
;中断入口向量
;-----------------------
	ORG 0x004
INTERRUPT_VECTORS
	PUSH		;进栈
	BANK0
	CLRF PCLATH
	GOTO INTSEV
;-----------------------
	ORG 0x0020
;	INCLUDE "SUBROUTE.INC"
;-----------------------
;中断服务子程序
;-----------------------
INTSEV	NOP		;实际为中断程序体
	NOP
	RETFIE
;-----------------------
MAIN	BANK1		;上电复位判断?
	MOVF PCON,W
	BSF POR
	BTFSS POR
	GOTO $-2
	BANK0
	ANDLW 02H	
	BTFSS Z		;/=0是上电复位,则上电初始化
	GOTO RSTELSE	;=0不是上电复位,则跳
;-----------------------	
	MOVLW 2CH	;上电复位初始化
	MOVWF FSR
CLRRAM	CLRF F0
	INCF FSR,1
	BTFSS FSR,7
	GOTO CLRRAM	;以上清RAM2C-7FH
	CLRF GPIO	;以上IO口初始设置
;	MOVLW 32H	;延时初始化
;	MOVWF DELAY1
;	MOVLW 96H
;	MOVWF DELAY2
RSTELSE	CLRWDT		;特殊功能寄存器初始化
	BANK1
	MOVLW B'00111100'
	MOVWF TRISIO	;置输入输出口
	MOVLW B'01011100'
	MOVWF ANSEL	;GP2,4为模拟输入
	MOVLW B'00100000'
	MOVWF WPU	;GP5弱上拉
	BCF GPPU	;弱上拉使能
	CLRF PIE1	;清中断允许位
	MOVLW D'249'	;250uS定时参数
	MOVWF PR2
;	MOVLW B'01100001'
;	MOVWF OSCCON
	BANK0
	MOVLW 08H
	MOVWF ADCON0	;
	CLRF INTCON	;中断控制寄存器
	CLRF PIR1	;清外围接口中断标志位
	CLRF ADCON0	;清AD转换控制寄存器
	CLRF T1CON
	CLRF PCLATH
	CLRF TMR2	;定时2.5mS
	MOVLW B'01001100' ;后分频比10,预分频1
	MOVWF T2CON
MAIN1  	BANK0
	BTFSS TMR2IF
	GOTO MAIN1
	CLRWDT
	BCF TMR2IF
	BTFSC TMR2IF
	GOTO $-2

;-----------------------
;以下为重要功能寄存器冗余设置
;应视具体应用情况作相应调整
;-----------------------
	BANK1	
	MOVLW B'00110100'
	MOVWF TRISIO	;置输入输出口
	MOVLW 5CH
	MOVWF ANSEL	;GP2,4为模拟输入
	MOVLW B'00100000'
	MOVWF WPU	;GP5弱上拉
	BCF GPPU	;弱上拉使能
	CLRF PIE1	;清中中断允许位
	MOVLW D'249'
	MOVWF PR2
	BANK0
	BSF ADFM
	BCF VCFG
	CLRF INTCON	;中断控制寄存器
	CLRF PIR1	;清外围接口中断标志位
	CLRF T1CON
	CLRF PCLATH
	MOVLW B'01001100' ;定时2.5mS
	MOVWF T2CON	;后分频比10,预分频1
;-----------------------
	INCF DSBUF0,1
	BTFSC DSBUF0,0
	GOTO MAIN1	
	CALL SCANKEY	;2.5mS偶次键扫描
	CALL SCANLED	;显示扫描
	CALL KRCW	;键滤波(去抖动)
	CALL KPREC	;键后处理
;	INCF TIMER,F
;------------------暂不用
;	MOVFW TIMER
;	XORLW 04H
;	BTFSS Z
;	GOTO MAIN2
;	CLRF TIMER	;走秒
;	MOVF SEC,W
;	XORLW 0AH
;	BTFSS Z
;	GOTO MAIN2
;	CLRF SEC;----------
MAIN2	MOVF STA,W	;状态字3比2表决
	XORWF STA1,W
	BTFSS Z
	GOTO MAIN2_1
	MOVF STA,W
	MOVWF STA2
	GOTO MAIN2_4
MAIN2_1	MOVF STA,W
	XORWF STA2,W
	BTFSS Z
	GOTO MAIN2_2
	MOVF STA,W
	MOVWF STA1
	GOTO MAIN2_4
MAIN2_2	MOVF STA1,W
	XORWF STA2,W
	BTFSS Z
	GOTO MAIN2_3
	MOVF STA1,W
	MOVWF STA
	GOTO MAIN2_4
MAIN2_3	CLRF STA
	CLRF STA1
	CLRF STA2
MAIN2_4	
	MOVLW HIGH MAIN3
	MOVWF PCLATH
	MOVF STA,W
	ANDLW 03H
	ADDLW LOW MAIN3
	BTFSC C
	INCF PCLATH,F
	MOVWF PCL
MAIN3	
	GOTO WORK0	;等待状态
	GOTO WORK1	;有按键状态
	GOTO WORK2	;
	GOTO WORK0	;
;-----------------------
WORK
	MOVWF STA
	MOVWF STA1
	MOVWF STA2
	GOTO MAIN1
;-----------------------
;等待状态
;-----------------------
WORK0
	BCF LED1	;灭
	BTFSC DSBUF0,5	;160mS,红色管闪烁,表示闲时
	BSF LED1	;亮
	MOVFW DELAY1	;
	MOVWF SEC
	BCF LED2
	CLRF TIMER
	BTFSS DSBUF0,1
	GOTO WORK0_1
	MOVLW 88H	;AN2
	MOVWF R0
	CALL AD
	BCF C
	RRF R0,F
	RRF R1,F
	BCF C 
	RRF R0,F
	RRF R1,F
	MOVFW R1
	MOVWF DELAY2
	GOTO WORK0_OUT
WORK0_1
	MOVLW 8CH	;AN3
	MOVWF R0
	CALL AD
	BCF C
	RRF R0,F
	RRF R1,F
	BCF C 
	RRF R0,F
	RRF R1,F
	MOVFW R1
	MOVWF DELAY1
WORK0_OUT
	MOVLW 01H
	BTFSS K0
	MOVLW 00H	;
	GOTO WORK
;-----------------------
;有按键状态1
;-----------------------
WORK1
	BCF OUT1	;冗余
	BSF LED1
	DECFSZ SEC,F	;
	GOTO WORK1_OUT
	INCF TIMER,F
	BTFSS TIMER,2
	GOTO WORK1_1
	BSF OUT1
	CLRF TIMER
	BCF LED1
WORK1_1
	MOVFW DELAY1
	MOVWF SEC
WORK1_OUT
	MOVLW 02H
	BTFSS OUT1
	MOVLW 01H	;
	GOTO WORK
;-----------------------
;-----------------------
;有按键状态2
;-----------------------
WORK2
	BCF OUT2	;冗余
	BSF LED2
	DECFSZ SEC,F	;
	GOTO WORK1_OUT
	INCF TIMER,F
	BTFSS TIMER,2
	GOTO WORK2_1
	BSF OUT2
	CLRF TIMER
	BCF LED2
WORK2_1
	MOVFW DELAY2
	MOVWF SEC
WORK2_OUT
	MOVLW 00H
	BTFSS OUT2
	MOVLW 02H	;
	GOTO WORK
;-----------------------

;-----------------------
;;;;;;;;子程序;;;;;;;;;;
;-----------------------
;20uS延时子程序
;-----------------------
D20US
	MOVLW 05H	
	MOVWF R7
	DECFSZ R7,F
	GOTO $-1
	RETURN
;-----------------------
;显示扫描,使用R0,
;-----------------------
SCANLED
	MOVFW GPIO	;
	ANDLW 3CH	;
	MOVWF R0
	MOVFW PORT
	ANDLW 03H
	IORWF R0,W
	MOVWF GPIO
	RETURN
;-----------------------
;键扫描子程序
;-----------------------
SCANKEY	
	BANK1		;GP口方向重置
	MOVLW 3CH
	MOVWF TRISIO
	CLRF ANSEL
	BANK0
	CALL D20US	;
	MOVFW GPIO	;读键,有键相应位0
	XORLW 20H	;求反,有键相应位1
	ANDLW 20H
	MOVWF KEY1	;保存键值
	RETURN
;-----------------------
;键RC滤波子程序,使用R0,FSR
;-----------------------
KRCW	MOVLW KCAP
	MOVWF FSR
	BANK0
	BCF C		;7*Uo(k-1)+Ui(k)16或0
	RLF F0,W
	ADDWF F0,W
	BCF C
	RLF F0,F
	BCF C
	RLF F0,F
	ADDWF F0,F
	MOVLW 10H
	BTFSS KEY1,5
	MOVLW 00H
	ADDWF F0,F
	MOVLW 04H	;4舍5入
	ADDWF F0,F
	BCF C		;除8
	RRF F0,F
	BCF C
	RRF F0,F
	BCF C
	RRF F0,F
	MOVLW 0CH	;比较
	SUBWF F0,W
	BSF K0
	BTFSS C
	BCF K0
	RETURN
;-----------------------
;键后处理子程序,键前沿检出
;-----------------------
KPREC
	MOVFW KEY1	;键前沿检出
	MOVWF R0
	XORWF LKEY1,W	;上次本次键不同为1
	ANDWF KEY1,F	;且本次为1即键前沿
	MOVFW R0	;本次键值替代上次
	MOVWF LKEY1
	RETURN
;-----------------------
;AD转换子程序,使用R0,R1,R2,FSR,W
;入口:R0~ADCON0,(R1~ADCON1暂不用)设置参数
;出口:连续8次AD转换,平均值存R0R1单元
;-----------------------
AD
	BANK1
	CLRF PIE1
	BANK0
	BCF PEIE	;禁止外设中断
	CLRF PIR1
	MOVF R0,W
	MOVWF ADCON0
	BSF ADON
	GOTO $+1	;采样时间12周
	GOTO $+1
	GOTO $+1
	CLRF R0
	CLRF R1
	MOVLW 08H	;测8次
	MOVWF R2
AD_1
	BCF ADIF
	CLRWDT
	BSF GODONE	;启动AD
AD_2
	BTFSC GODONE	;等待AD结束
	GOTO AD_2
	BSF RP0
	MOVF ADRESL,W
	BCF RP0
	ADDWF R1,F
	BTFSC C
	INCF R0,F
	MOVF ADRESH,W
	ADDWF R0,F
	DECFSZ R2,F
	GOTO AD_1
	BCF ADIF
	CLRF ADCON0
	MOVLW 04H	;4舍5入
	ADDWF R1,F
	BTFSC C
	INCF R0,F
	BCF C		;除8
	RRF R0,F
	RRF R1,F
	BCF C
	RRF R0,F
	RRF R1,F
	BCF C
	RRF R0,F
	RRF R1,F
	RETURN
;-----------------------
;-----------------------
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -