pic16f877 秒表程序

发布者:dswecd最新更新时间:2016-11-04 来源: eefocus关键字:pic16f877  秒表程序 手机看文章 扫描二维码
随时随地手机看文章
源程序如下:

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

关键字:pic16f877  秒表程序 引用地址:pic16f877 秒表程序

上一篇:pic单片机控制LED8位流水灯探讨
下一篇:温度DS18b20与PIC单片机通讯程序

推荐阅读最新更新时间:2024-03-16 15:19

DS1302与PIC16F877接口程序
;================================================ ;DS1302控制子程序 ;================================================= ;程序包括:DS1302初始化,时间数据写入和读取程序 ;DS1302_init ;init ds1302 ;Set_DS1302 ;set time to ds1302 ;Get_DS1302 ;get time from ds1302 ;================================================= ;============== 1302定
[单片机]
PIC16F877单片机的应用--A/D转换器
PIC16F877单片机片内有8路10位A/D转换器,引脚②~⑤为AN0~AN3、⑦~⑩为AN4~AN7。MPLAB-ICD的实验板上16F877单片机的RA0口接了一只供有电压的10kΩ电位器,在D口(RD0~RD7)接了8只LED,如附图所示。笔者用16F877 A/D转换通道其中一路作A/D转换,以说明A/D转换编写程序的方法和在线调试及编程。 在附图中,笔者把R6的可变输出(电压模拟量)端接到RA0/AN0作为模拟量输入;用D口(RD0~RD7)的8只LED显示A/D转换的结果(按二进制显示)。 一、 建立A/D转换源程序的要点 编写10位的一路A/D转换程序看似简单,但对初学者却有一定难度,因为编写A/D转换程序时
[单片机]
<font color='red'>PIC16F877</font>单片机的应用--A/D转换器
基于nRF24L01和PIC16F877无线数据传输系统设计
引言   在工业控制现场, 常常需要采集大量的现场数据, 如温度、湿度、气压等, 并将这些数据传输到主机进行处理,由主机根据处理的结果, 将控制信号传输给现场执行模块进行各种操作。可以看出数据从采集设备到处理终端,监测控制指令从处理终端到采集设备,均需经过传输过程这一重要环节。当数据采集点处于运动状态,或者所处的环境不允许铺设电缆,采集设备必须与终端设备分离,此时只能通过无线方式进行数据传输。基于此,本文设计了一个无线数据传输系统,它应用Microchip公司的PIC16F877单片机控制Nordic公司的无线数字传输芯片nRF24L01 ,通过无线方式进行数据双向传输。实验结果证明:该系统使用灵活、成本低廉,可方便地嵌入到无
[工业控制]
基于nRF24L01和<font color='red'>PIC16F877</font>无线数据传输系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved