📄 main.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 + -