pic16f887汇编秒表程序

2019-04-15 11:58发布

pic16f877 秒表程序  

2007-06-26 12:18:37|  分类: 日记 |  标签:日记  |举报|字号 订阅   源程序如下: LIST    P=16F877       INCLUDE      "P16F877.INC" ;时钟显示范围:00.00秒-99.99秒,分辨度:0.01秒;所用的寄存器如下: S0         EQU      0X20        ;0.01 秒计时器 S1         EQU      S0+1        ;0.1 秒计时器 S2         EQU      S0+2        ;1 秒计时器 S3         EQU      S0+3        ;10  秒计时器 SREG      EQU      S0+4         ;软计数器 LEDF      EQU      S0+5         ;显示的LED的位置指示寄存器 XW_TEMP   EQU      S0+6         ;用于中断中保护W的值 XHOSTS      EQU      S0+7       ;用于中断中保护STATUS的值 DEYH      EQU      S0+8 DEYL      EQU      S0+9         ;以上两个寄存器用于软件延时 HOSTF      EQU      S0+0A       ;用于中断中保护FSR的值    ORG         0X00    GOTO      MAIN    ORG         0X04    GOTO      CLKINT              ;转向中断服务程序    ORG         0X10 CONVERT                 ;不带小数点的共阳极码表       ADDWF PCL,1                              RETLW  0XC0         RETLW 0XF9         RETLW 0XA4         RETLW 0XB0         RETLW 0X99         RETLW 0X92         RETLW 0X82         RETLW 0XD8         RETLW 0X80         RETLW 0X90         RETURN                        CONVERT2                ;带小数点的共阳极码表     ADDWF PCL,1                 RETLW 0X40         RETLW 0X79         RETLW 0X24         RETLW 0X30         RETLW 0X19         RETLW 0X12         RETLW 0X02         RETLW 0X78         RETLW 0X00         RETLW 0X10         RETURN                         TRANSMIT                          ;SPI发送显示子模块    CLRF      PORTA                ;LACK送低电平,为锁存做准备    MOVWF      SSPBUF              ;启动发送   WAIT   BANKSEL      PIR1    BTFSS      PIR1,SSPIF    GOTO      WAIT                 ;等待发送结束    BCF         PIR1,SSPIF        ;清除中断标志    NOP    RETURN ;***********显示子程序模块************ DISPLAY   MOVLW      0X01    MOVWF      LEDF    MOVLW      0XA0    MOVWF      FSR AGAINXIAN   MOVF   LEDF,W    SUBLW      0X02    BTFSS      STATUS,Z    GOTO      XIANB    MOVF      INDF,W    CALL      CONVERT2             ;若是第二位,则查带小数点的码表    GOTO      TRAN XIANB   MOVF      INDF,W    CALL      CONVERT TRAN   CALL      TRANSMIT         ;发送一个显示数据    INCF         FSR    INCF         LEDF    MOVF      LEDF,W    SUBLW      0X05    BTFSS      STATUS,Z    GOTO      AGAINXIAN    MOVLW      0X01    MOVWF      LEDF    BSF         PORTA,5           ;最后给一个锁存信号,代表一次显示任务完成    RETURN ;********** S0计数溢出处理子程序*************** CS0      CLRF      S0    INCF         S1    RETURN ;********** S1计数溢出处理子程序*************** CS1      CLRF      S1       INCF         S2       RETURN ;********** S2计数溢出处理子程序*************** CS2      CLRF      S2       INCF         S3       RETURN ;********** S3计数溢出处理子程序*************** CS3      CLRF      S3       RETURN ;***********时钟中断服务程序******************* CLKINT   MOVWF      XW_TEMP      ;保存W的值    SWAPF      STATUS,W    MOVWF      XHOSTS             ;暂存STATUS的值    MOVF      FSR,W    MOVWF      HOSTF              ;保存FSR的值。以上程序为中断现场保护    MOVLW      0X14    MOVWF      TMR0               ;对TMR0写入一个调整值,因为写入 ;TMR0后接着的两个周期不能增量    BCF         INTCON,T0IF      ;清除中断标志    INCF         SREG    MOVF      SREG,W    SUBLW      0X28               ;TMR0 每250 μs中断一次    BTFSS      STATUS,Z          ;其中断40次后才执行对S0、 S1、 S2、 S3 的                        ;操作    GOTO      TIFAN    CLRF      SREG    INCF         S0    MOVF      S0,W    SUBLW      0X0A    BTFSC      STATUS,Z    CALL      CS0      MOVF      S1,W    SUBLW      0X0A    BTFSC      STATUS,Z    CALL      CS1    MOVF      S2,W    SUBLW      0X0A    BTFSC      STATUS,Z    CALL      CS2    MOVF      S3,W    SUBLW      0X0A    BTFSC      STATUS,Z    CALL      CS3 TIFAN   MOVF      HOSTF,W          ;以下为中断现场恢复    MOVWF      FSR                   ;恢复间接寻址指针FSR的值    SWAPF      XHOSTS,W    MOVWF      STATUS                ;恢复STATUS的值    SWAPF      XW_TEMP,1    SWAPF      XW_TEMP,W            ;恢复W的值    RETFIE   ;*********** TMR0初始化子程序*************** CLKINSUB   BANKSEL      OPTION_REG    BCF         OPTION_REG,T0CS     ;TMR0工作于定时器方式    BSF         OPTION_REG,PSA      ;TMR0不用分频    BANKSEL      INTCON    BCF         INTCON,T0IF         ;清除TMR0的中断标志    BCF         INTCON,GIE          ;总中断禁止    BSF         INTCON,T0IE         ;TMR0中断允许    RETURN ;***************系统初始化子程序***************** MAINSUB      BANKSEL      TRISA    BCF         TRISA,5             ;置RA5为输出方式,以输出锁存信号    BCF         TRISB,1    BCF         TRISB,2    BSF         TRISB,4    BSF         TRISB,5             ;设置与键盘有关的各口的输入输出方式    BCF         TRISC,5    BCF         TRISC,3             ;设置SCK与SDO为输出方式    BCF         INTCON,GIE          ;关闭所有中断    MOVLW      0XC0    MOVWF      SSPSTAT               ;设置SSPSTAT寄存器    BANKSEL      SSPCON    MOVLW      0X30 MOVWF      SSPCON                ;设置SPI的控制方式,允许SSP方式,    BCF         STATUS,IRP          ;间接寻址选中BANK0、BANK1    RETURN                           ;返回   ;***********键扫描子程序******************** KEYSCAN      CLRF   PORTB           ;B1和B2两条线上送0    NOP            NOP                               ;经过一段时间的延时,避开引脚电平的过渡过程    MOVF      PORTB,W    ANDLW      0X30                  ;只检查B4和B5两位,屏蔽其它各位    SUBLW      0X30    RETURN      ;**************************************** KEYDELAY  MOVLW 0X80        ;键盘去抖子程序(约8ms的软件延时)           MOVWF DEYH AGAIN2    MOVLW 0XFF           MOVWF DEYL AGAIN1    DECFSZ DEYL,1           GOTO AGAIN1           DECFSZ DEYH,1           GOTO AGAIN2           RETURN   ;*************显示缓冲区处理子程序**************** XIANHUAN   MOVLW      0XA0    MOVWF      FSR    MOVF      S3,W    MOVWF      INDF    INCF         FSR    MOVF      S2,W    MOVWF      INDF    INCF         FSR    MOVF      S1,W    MOVWF      INDF    INCF         FSR    MOVF      S0,W    MOVWF      INDF    RETURN   MAIN      NOP           CALL      MAINSUB         ;系统初始化           CALL      CLKINSUB        ;调用时钟初始化子程序 DENJIAN   BCF         INTCON,GIE ;禁止中断    BANKSEL      S0    CLRF      S0    CLRF      S1    CLRF      S2    CLRF      S3    CLRF      SREG    CLRF      LEDF                    ;清零 S0=S1=S2=S3=0    CALL      XIANHUAN                ;把S3、S2、S1、S0的值装入显示缓冲区       CALL      DISPLAY              ;显示 DENAN      BCF      INTCON,GIE      ;关中断    CALL      KEYSCAN                 ;进行键扫描    BTFSS      STATUS,Z    GOTO      XIAODOU1                ;如起始键按下,则消抖动    GOTO      DENAN                   ;如起始键没按下,则继续等待 XIAODOU1   CALL   KEYDELAY           ;延时消抖动    CALL      KEYSCAN                 ;再次进行键扫描    BTFSC      STATUS,Z    GOTO      DENAN                   ;若为干扰,则再次等待键按下    BANKSEL      S0    CLRF      S0    CLRF      S1    CLRF      S2    CLRF      S3       CLRF      SREG                  ;设置新一次计时的初始条件      WAITS   CALL      KEYSCAN         BTFSS      STATUS,Z    GOTO      WAITS                    ;为了防止按键过于灵敏,等键松开后再进行 ;下面的操作      MOVLW      0X08    MOVWF      TMR0    BSF         INTCON,GIE             ;开总中断 HERE   CALL      XIANHUAN              ;显示缓冲区处理      CALL      DISPLAY                   ;即时更新显示内容    CALL      KEYSCAN      BTFSS      STATUS,Z    GOTO      XIAODOU                   ;若停止计时键按下,则消抖    GOTO      HERE                      ;若停止计时键没按下,则继续等待中断计时 XIAODOU      CALL   DISPLAY            ;利用消抖动时间调用显示程序    CALL      DISPLAY      CALL      DISPLAY      CALL      DISPLAY    CALL      DISPLAY    CALL      DISPLAY      CALL      DISPLAY      CALL      DISPLAY      CALL      DISPLAY    CALL      KEYSCAN    BTFSC      STATUS,Z    GOTO      HERE                     ;若为干扰,则继续等待停止键按下         BCF         INTCON,GIE            ;若停止键按下,则禁止中断       CALL      DISPLAY               ;若不为干扰,则禁止中断,更新显示内容   WAITR   CALL      KEYSCAN            BTFSS      STATUS,Z       GOTO      WAITR                 ;为了防止按键过于灵敏,等键松开后再进行 ;下面的操作      DENDAI   CALL      KEYSCAN    BTFSC      STATUS,Z    GOTO      DENDAI                   ;循环进行键扫描,等待清0键按下    CALL      KEYDELAY    CALL      KEYSCAN    BTFSC      STATUS,Z    GOTO      DENDAI                   ;延时消抖 WAIT19   CALL      KEYSCAN    BTFSS      STATUS,Z    GOTO      WAIT19                   ;等键松开      GOTO      DENJIAN                  ;新一次计时开始    END