⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic16f877_clock.asm

📁 基于PIC16F877的秒表源码
💻 ASM
字号:
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
;****************************************
;数字到段码的转换子程序(最好放在程序开头,避免超过2 KB的空间发生跨页读表) 
CONVERT									;不带小数点的共阳极码表	
……								;详细的程序语句见A/D应用章节的程序清单
CONVERT2								;带小数点的共阳极码表
……								;详细的程序语句见A/D应用章节的程序清单
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
XIANDARK	MOVLW	0X13
	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		FSR,W
	MOVWF		HOSTF				;保存FSR的值。以上程序为中断现场保护
	MOVLW		0X12
	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方式,
;并且时钟下降沿发送,与“74HC595,当
;其SCLK从低到高电平跳变时,串行输入数据
;(DI)移入寄存器”的特点相对应
	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								;键盘去抖子程序(约8ms的软件延时)
……								;详细的程序语句请参考相关章节
	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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -