;**********************************************************************
;   PIC16F67. 2007年自己写的投影机的程序                                 *
;                                                                     *
;**********************************************************************
;    Filename:     投影机的程序.asm                                  *
;    Date:       20070405                                          *
;    File Version:       1.0                                          *
;                                                                     *
;    Author:       GoHsne                                             *
;    Company:      GoHsne                                            *
;                                                                     *
;**********************************************************************
 list      p=16F57             ; list directive to define processor(单片机型号)
 #include <p16F5x.inc>         ; processor specific variable definitions(单片机详细说明文档)
 __CONFIG   _CP_OFF & _WDT_OFF & _HS_OSC
; '__CONFIG' directive is used to embed configuration word within .asm file.
; 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
;***** VARIABLE DEFINITIONS
;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)
  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 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     ;跳至`关机`
;
;-------------------------------------------------------------------------------  
;  
;****************************************************************************  
;-------复位----初始----------------------------------------------------------
  ORG 0x7FF           ;PIC复位地址
  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端口
  MOVLW 0x07F    ;01111111
        ;控灯 I B0
        ;门开 I B1
        ;门关 I B2
        ;镜出 I B3
        ;镜回 I B4
        ;风扇 I B5
        ;灯开 I B6
  TRIS 6     ;B口设为输入 
  BCF 3,0     ;   C
  BCF 3,1     ;   DC
  BCF 3,2     ;清标志位  Z
;
;****************************************************************************************
;-------开机主程序------------------------------------------------------------------------
KJ        ;开机---
;  GOTO SHX1    ;一声响:提示开机
;KD  BTFSS 6,0    ;测试`控灯`状态,测试F6B口0位的引脚状态以改变流程;BTFSS指定的位为1时会忽略下一指令,为0则继续。
;  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;声响`故障报警`
JSKD BTFSC 6,0    ;监视`控灯`状态,测试F6B口5位的引脚状态以改变流程;BTFSC指定的位为0时会忽略下一指令,为1则继续。
     GOTO JSFS    ;1 监视`风扇`状态
  MOVLW 0x015    ;`消抖`D21>W ,带去YS决定延时时间  能延时15毫秒 消抖
  CALL YS     ;延时等待电路稳定
  BTFSC 6,0    ;再测试;0跳1续
  GOTO JSKD    ;1
  GOTO GJ     ;0;`关机`
;
;****************************************************************************************  
;-------关机主程序------------------------------------------------------------------------ 
GJ        ;关机---
JH     BCF 7,3     ;关`镜反`;F7C口3位值为0 (BSF强制某寄存器F的某个位值为0)
  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
GDB  BCF 7,4     ;关`灯板`;F7C口4位值为0 (BSF强制某寄存器F的某个位值为0)
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'(程序到这里终止)