pic秒表c语言程序,PIC单片机计时秒表程序设计

//主程序

//http://www.51hei.com提供此单片机程序有问题请联系

main()

{

tmint(); //TMR0初始化

initial(); //spi显示初始化及系统其它部分初始化

INTCONbits.GIE=0; //总中断禁止

while(1)

{

for(k=0;k4;k++)

{

s[k]=0;

}

sreg=0; //赋显示初值

dispaly(); //调用一次显示子程序

KEYSCAN(); //键扫描,直到开始键按下

keyrelax(); //等键松开

INTCONbits.GIE=1; //总中断允许

KEYSCAN(); //键扫描直到停止键按下,在键扫描时有显示

keyrelax(); //等键松开

INTCONbits.GIE=0; //总中断禁止

KEYSCAN(); //键扫描到清0键按下,在键扫描时有显示

keyrelax(); //等键松开

}

}

---------------------汇编语言版本的pic单片机计时秒表程序设计--------------------------------------;此程序实现计时秒表功能

;时钟显示范围:00.00秒-99.99秒,分辨度:0.01秒

;通过按键来启动计时、停止计时及清0

;即第一次按下任意键开始计时,第二次按下任意键停止计时 ;第三次按下任意键使LED清0,等待下一次计时开始

LIST P=18F458

INCLUDE "P18F458.INC"

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 ;用于中断中保护FSR0L的值

TEMP EQU S0+0B ;用于存放临时值

ORG 0X00

GOTO MAIN

ORG 0X08

GOTO CLKINT ;转向中断服务程序

ORG 0X30

;数字到段码的转换子程序(最好放在程序开头,避免超过2K的空间发生跨页读表)

;************不带小数点的共阳极码表**************

CONVERT ADDWF PCL,1

RETLW 0XC0 ;0,显示段码与具体的硬件连接有关

RETLW 0XF9 ;1

RETLW 0XA4 ;2

RETLW 0XB0 ;3

RETLW 0X99 ;4

RETLW 0X92 ;5

RETLW 0X82 ;6

RETLW 0XD8 ;7

RETLW 0X80 ;8

RETLW 0X90 ;9

RETLW 0X88 ;A

RETLW 0X83 ;B

RETLW 0XC6 ;C

RETLW 0XA1 ;D

RETLW 0X86 ;E

RETLW 0X8E ;F

RETLW 0X7F ;"."

RETLW 0XBF ;"-"

RETLW 0X89 ;H

RETLW 0XFF ;DARK

RETURN

;*********带小数点的共阳极码表***********

CONVERT2 ADDWF PCL,1

RETLW 0X40 ;0

RETLW 0X79 ;1

RETLW 0X24 ;2

RETLW 0X30 ;3

RETLW 0X19 ;4

RETLW 0X12 ;5

RETLW 0X02 ;6

RETLW 0X78 ;7

RETLW 0X00 ;8

RETLW 0X10 ;9

RETURN

;***********SPI发送显示子模块************

TRANSMIT

CLRF PORTA ;LACK送低电平,为锁存做准备

MOVWF SSPBUF ;启动发送

WAIT NOP

BTFSS PIR1,SSPIF

GOTO WAIT ;等待发送结束

BCF PIR1,SSPIF ;清除中断标志

RETURN

;***********显示子程序模块************

DISPLAY

MOVLW 0X01

MOVWF LEDF

MOVLW 0XA0

MOVWF FSR0L

AGAINXIAN

MOVF LEDF,W

SUBLW 0X03

BTFSS STATUS,Z

GOTO XIANB

MOVF INDF0,W

CALL CONVERT2 ;若是个位,则查带小数点的码表

GOTO TRAN

XIANB MOVF INDF0,W

CALL CONVERT

TRAN CALL TRANSMIT ;发送一个显示数据

INCF FSR0L

INCF LEDF

MOVF LEDF,W

SUBLW 0X05

BTFSS STATUS,Z

GOTO AGAINXIAN

MOVLW 0X01

MOVWF LEDF

XIANDARK

MOVLW 0X27

CALL CONVERT

CALL TRANSMIT

INCF LEDF

MOVF LEDF,W

SUBLW 0X05

BTFSS STATUS,Z

GOTO XIANDARK ;显示4个"DARK"

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 FSR0L,W

MOVWF HOSTF ;保存FSR0L的值。以上程序为中断现场保护

MOVLW 0X13

MOVWF TMR0L ;对TMR0L写入一个调整值,因为写入

;TMR0L后接着的两个周期不能增量

BCF INTCON,T0IF ;清除中断标志

INCF SREG

MOVF SREG,W

SUBLW 0X28 ;TMR0L 每250us中断一次

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 FSR0L ;恢复间接寻址指针FSR0L的值

SWAPF XHOSTS,W

MOVWF STATUS ;恢复STATUS的值

SWAPF XW_TEMP,1

SWAPF XW_TEMP,W ;恢复W的值

RETFIE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值