; PIC16F67. 2007年自己写的投影机的程序 *
; *
;**********************************************************************
; Filename: 投影机的程序.asm *
; Date: 20070405 *
; File Version: 1.0 *
; *
; Author: GoHsne *
; Company: GoHsne *
; *
;**********************************************************************
#include <p16F5x.inc> ; processor specific variable definitions(单片机详细说明文档)
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
; 配置 没有代码保护 & WDT定时器关 & OSC振荡器模式为HS
;temp EQU 0x10 ;example variable definition
;-------门电机与镜头电机的正反子程序---------------------------------------
ORG 0x000
MZ BSF 7,0 ;开`门正`;F7C口0位值为1 (BSF强制某寄存器F的某个位值为1)
MOVLW 0x033 ;D51>W ,决定延时时间 0x033 能延时 秒
CALL YS ;延时0.2秒
GOTO MK ;跳至`门开`
MF BSF 7,1 ;开`门反`;F7C口1位值为1 (BSF强制某寄存器F的某个位值为1)
MOVLW 0x0FE ;D51>W ,决定延时时间 0x033 能延时 秒
CALL YS ;延时0.2秒
GOTO MG ;跳至`门关`
JZ BSF 7,2 ;开`镜正`;F7C口2位值为1 (BSF强制某寄存器F的某个位值为1)
MOVLW 0x0FE ;D51>W ,决定延时时间 0x033 能延时 秒
CALL YS ;延时0.2秒
GOTO JC ;跳至`镜出`
JF BSF 7,3 ;开`镜反`;F7C口3位值为1 (BSF强制某寄存器F的某个位值为1)
MOVLW 0x0FE ;D51>W ,决定延时时间 0x033 能延时 秒
CALL YS ;延时0.2秒
GOTO JH ;跳至`镜回`
;
;-------三重延时计秒时间由W指定----------------------------------------------------
YS ;MOVLW 0x033 ; X
MOVWF 9 ;W>F9
YS1 ;MOVLW 0x033 ; Y
MOVWF 10 ;W>F10
YS2 ;MOVLW 0x033 ; Z
MOVWF 11 ;W>F11
YS3 DECFSZ 11,1 ;F11减1,为0则间跳
GOTO YS3 ;
DECFSZ 10,1 ;F10减1,为0则间跳
GOTO YS2 ;
DECFSZ 9,1 ;F9减1,为0则间跳
GOTO YS1 ;
RETLW 0x000 ;L>W 子程序返回
;
;-------一声响:提示开机------------------------------------------------------------------------
SHX1 MOVLW 0x029 ;`声响嘀`;D41>W ,决定延时时间 0x029 能延时0.1秒 一声响:提示开机
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.1秒
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
GOTO KD ;`控灯`
;
;-------两声响:提示开机动作完毕------------------------------------------------------------------------
SHX2 MOVLW 0x033 ;`声响嘀嘀`;D51>W ,决定延时时间 0x033 能延时0.2秒 两声响:提示开机动作完毕
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.2秒
MOVLW 0x033
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
CALL YS ;延时0.2秒
MOVLW 0x064
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.2秒
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
GOTO JSFS
;
;-------三声响:故障报警------------------------------------------------------------------------
SHX3
JJGDB BCF 7,4 ;紧急关`灯板`;F7C口4位值为0 (BCF强制某寄存器F的某个位值为0)
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.2秒
MOVLW 0x033
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
CALL YS ;延时0.2秒
MOVLW 0x033
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.2秒
MOVLW 0x033
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
CALL YS ;延时0.2秒
MOVLW 0x033
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.2秒
MOVLW 0x033
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
CALL YS ;延时0.2秒
GOTO GJ ;跳至`关机`
;-------------------------------------------------------------------------------
;
;****************************************************************************
;-------复位----初始----------------------------------------------------------
GOTO KS ;程序从这里开始
ORG 0x100 ;主程序的开始放在100H是为了把每一页前256字节留给子程序
KS NOP ;无操作,延时一个指令周期
MOVLW 0x000 ;00000000
MOVWF 6 ;清F6 B端口
MOVWF 7 ;清F7 C端口
;MOVLW 0x000 ;00000000 对端口做设定时,数值要先写进W (本行省去,因为前面已对W写入了同样的数值了)
;门正 O C0
;门反 O C1
;镜正 O C2
;镜反 O C3
;灯板 O C4
;喇叭 O C5
;风控 O C6
;电源 0 C7
TRIS 7 ;C口设为输出 5=F5=A端口 6=F6=B端口 7=F7=C端口
;控灯 I B0
;门开 I B1
;门关 I B2
;镜出 I B3
;镜回 I B4
;风扇 I B5
;灯开 I B6
TRIS 6 ;B口设为输入
BCF 3,1 ; DC
BCF 3,2 ;清标志位 Z
;****************************************************************************************
;-------开机主程序------------------------------------------------------------------------
KJ ;开机---
; GOTO SHX1 ;一声响:提示开机
; GOTO KD ;0
; MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒
; CALL YS ;延时等待电路稳定
; BTFSS 6,0 ;再测试;1跳0续
; GOTO GJ ;0;跳至`关机`
KD GOTO MK ;1;跳至`门开`
MK BCF 7,0 ;关`门正`;F7C口4位值为0 (BSF强制某寄存器F的某个位值为0)
MOVLW 0x033 ;D51>W ,决定延时时间 0x033 能延时 秒
CALL YS ;延时0.2秒
BTFSS 6,1 ;测试`门开`状态,测试F6B口1位的引脚状态以改变流程;BTFSS指定的位为1时会忽略下一指令,为0则继续。
GOTO MZ ;0;跳至`门正`
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒
CALL YS ;延时等待电路稳定
BTFSS 6,1 ;再测试;1跳0续
GOTO MK ;0
GOTO JC ;1
JC BCF 7,2 ;关`镜正`;F7C口2位值为0 (BSF强制某寄存器F的某个位值为0)
BTFSS 6,3 ;测试`镜出`状态,测试F6B口3位的引脚状态以改变流程;BTFSS指定的位为1时会忽略下一指令,为0则继续。
GOTO JZ ;0;跳至`镜正`
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒
CALL YS ;延时等待电路稳定
BTFSS 6,3 ;再测试;1跳0续
GOTO JC ;0
GOTO KFS ;1
KFS BSF 7,6 ;开`风控`;F7C口6位值为1 (BSF强制某寄存器F的某个位值为1)
NOP ;无操作,延时一个指令周期
FS BTFSC 6,5 ;测试`风扇`状态,测试F6B口5位的引脚状态以改变流程;BTFSC指定的位为0时会忽略下一指令,为1则继续。
GOTO KDB ;1;开`灯板`
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒 消抖
CALL YS ;延时等待电路稳定
BTFSC 6,5 ;再测试;0跳1续
GOTO FS ;1
GOTO SHX3 ;0;声响`故障报警`
KDB BSF 7,4 ;开`灯板`;F7C口4位值为1 (BSF强制某寄存器F的某个位值为1)
NOP ;无操作,延时一个指令周期
DN BTFSC 6,6 ;测试`灯`状态,测试F6B口6位的引脚状态以改变流程;BTFSC指定的位为0时会忽略下一指令,为1则继续。
GOTO SHX2 ;1;声响`开机动作完毕`
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒 消抖
CALL YS ;延时等待电路稳定
BTFSC 6,6 ;再测试;0跳1续
GOTO DN ;1
GOTO SHX3 ;0;跳至`故障报警`
JSFS BTFSC 6,5 ;监视`风扇`状态,测试F6B口5位的引脚状态以改变流程;BTFSC指定的位为0时会忽略下一指令,为1则继续。
GOTO JSKD ;1 监视`控灯`状态
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒 消抖
CALL YS ;延时等待电路稳定
BTFSC 6,5 ;再测试;0跳1续
GOTO JSFS ;1
GOTO SHX3 ;0;声响`故障报警`
GOTO JSFS ;1 监视`风扇`状态
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒 消抖
CALL YS ;延时等待电路稳定
BTFSC 6,0 ;再测试;0跳1续
GOTO JSKD ;1
GOTO GJ ;0;`关机`
;
;****************************************************************************************
;-------关机主程序------------------------------------------------------------------------
GJ ;关机---
BTFSS 6,4 ;测试`镜回`状态,测试F6B口4位的引脚状态以改变流程;BTFSS指定的位为1时会忽略下一指令,为0则继续。
GOTO JF ;0跳至`镜反`
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒
CALL YS ;延时等待电路稳定
BTFSS 6,4 ;再测试;1跳0续
GOTO JH ;0
GOTO GDB ;1
DN1 BTFSC 6,6 ;测试`灯`状态,测试F6B口6位的引脚状态以改变流程;BTFSC指定的位为0时会忽略下一指令,为1则继续。
GOTO GDB ;1关`灯板`
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒 消抖
CALL YS ;延时等待电路稳定
BTFSC 6,6 ;再测试;0跳1续
GOTO GDB ;1关`灯板`
GOTO MG ;0;
MG BCF 7,1 ;关`门反`;F7C口1位值为0 (BSF强制某寄存器F的某个位值为0)
BTFSS 6,2 ;测试`门关`状态,测试F6B口2位的引脚状态以改变流程;BTFSS指定的位为1时会忽略下一指令,为0则继续。
GOTO MF ;跳至`门反`
MOVLW 0x015 ;`消抖`D21>W ,带去YS决定延时时间 能延时15毫秒
CALL YS ;延时等待电路稳定
BTFSS 6,2 ;再测试;1跳0续
GOTO MG ;0
GOTO LQYS ;1
;-------`延时冷却`--关`风控`--关`电源2`------------------------------------------------------------------------
LQYS MOVLW 0x0FE ;`冷却`;D254>W ,决定延时时间 0x0FE 能延时25秒
CALL YS ;延时25秒
GFS BCF 7,6 ;关`风控`;F7C口6位值为0 (BCF强制某寄存器F的某个位值为10)
DY2 BCF 7,7 ;关`电源2`F7C口7位值为0 (BSF强制某寄存器F的某个位值为0)
;
;--------长声响:提示关机动作完毕等待完全关机,延时后若没响应,则不再发出声响提示--计秒时间由W指定----------------------------------------------------
SHXC
MOVLW 0x029 ;`声响长`;D41>W ,决定延时时间 0x029 能延时0.1秒 长声响:提示关机动作完毕
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.1秒
MOVLW 0x064 ;D100
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
CALL YS ;延时1.5秒
MOVLW 0x029 ;`声响长`;D41>W ,决定延时时间 0x029 能延时0.1秒 长声响:提示关机动作完毕
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.1秒
MOVLW 0x064 ;D100
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
CALL YS ;延时1.5秒
MOVLW 0x029 ;`声响长`;D41>W ,决定延时时间 0x029 能延时0.1秒 长声响:提示关机动作完毕
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.1秒
MOVLW 0x064 ;D100
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
CALL YS ;延时1.5秒
MOVLW 0x029 ;`声响长`;D41>W ,决定延时时间 0x029 能延时0.1秒 长声响:提示关机动作完毕
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时0.1秒
MOVLW 0x064 ;D100
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
CALL YS ;延时1.5秒
MOVLW 0x076 ;`声响长`;D118>W ,决定延时时间 0x076 能延时2.5秒 长声响:提示关机动作完毕
BSF 7,5 ;开`喇叭`;F7C口5位值为1 (BSF强制某寄存器F的某个位值为1)
CALL YS ;延时2.5秒
BCF 7,5 ;关`喇叭`;F7C口5位值为0 (BSF强制某寄存器F的某个位值为0)
SLEEP ;休眠
;
;-------------------------------------------------------------------------------
END ; directive 'end of program'(程序到这里终止)