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

📄 1302 ok.asm

📁 基于pic的DS1302串行实时时钟程序
💻 ASM
字号:
;时钟芯片DS1302汇编程序  《PIC接口技术》王有绪P213有参考资料 

	include <p16f877.inc>

 	CBLOCK 20H
 	SEC  	;秒
 	MIN  	;分
 	HOU  	;小时
 	DATE 	;日期
 	MON  	;月
	DAY  	;日
 	YERR 	;年
 	DDD  	;写使能位
 	TIME_TX ;1302发送寄存器
 	TIME_RX ;1302接收寄存器
 	COUNT1 	;
 	COUNT2 	;
 	DELAY1
 	DELAY2
 	ENDC

;=================================
;1302子程序说明
; DS1302INI 	;1302初始化,先禁止RST,设定充电方式
; SET_TIME 	;一次发送7个数据设定时间,包含写使能寄存器,8个数据
; GET_TIME 	;一次接收7个数据显示时间
; TIME_WRITE_1	;一次写入1302一个字节
; TIME_READ_1 	;一次接收一个字节数据

;============== 1302定义 ===================
#DEFINE I_O  	PORTC,7 	;1302I_O
#DEFINE SCLK 	PORTC,6 	;1302时钟
#DEFINE RST  	PORTA,0 	;1302使能位
#DEFINE RX_ADD 	40H  	;保存接受的7个数据
#DEFINE TX_ADD 	20H  	;开始保存7个要写入的时间数据
BANK1 MACRO
 	BSF  	STATUS,RP0
 	ENDM
BANK0 MACRO
 	BCF  	STATUS,RP0
 	ENDM

;======================================
	ORG  	00H
 	NOP
 	GOTO 	MAIN
MAIN 
 	CALL  	CLR_RAM 	;清除RAN
 	CALL 	PORT_INI  	;端口定义
 	CALL 	DS1302_INI
 	CALL 	SET_TIME 	; 一次写入7个时间数据
 	CALL 	GET_TIME 	; 一次读回7个时间数据
 	GOTO 	$


;写入秒,可以写任意的7个时间数据,单字节
 	MOVLW 	B'10000000'
 	MOVWF 	TIME_TX
 	BSF  	RST
 	CALL 	CMD
 	MOVLW 	B'00100101'
 	MOVWF 	TIME_TX
 	CALL 	CMD
 	BCF  	RST

;读秒,可以读任意7个时间,单字节
 	MOVLW 	B'10000001'
 	MOVWF 	TIME_TX
 	BSF  	RST
 	CALL 	CMD
  	CALL 	TIME_READ_1
 	BCF  	RST    
	GOTO 	$

;**************************************************
; DS1302_INI:子程序
; 作用:初始化1302,先禁止RST,允许写使能
;**************************************************
DS1302_INI
 	BCF  	SCLK
 	BCF  	RST   		;先禁止
 	MOVLW 	B'10001110' 	;写使能寄存器
 	MOVWF 	TIME_TX
 	BSF  	RST
 	CALL 	CMD
 	MOVLW 	B'0'  		;允许写使能
 	MOVWF 	TIME_TX
 	CALL 	CMD		;发送一个字节的数据
 	BCF  	RST
 
;设定充电方式  没有设定
 	RETURN  
 
;**************************************************
; SET_TIME     
; 作用:一次输入7个数据来一次性的设定时间,同时使能写寄存器
; 突发模式写入,必须写入8个数据,不是7个
; INPUT:要设定的8个数据已经写入到TIME_TX_ADD开始的8个字节里面
;**************************************************
SET_TIME   
   	MOVLW 	B'10111110' ;标志位
 	MOVWF 	TIME_TX
 	BSF  	RST  
 	CALL 	CMD
	;TIME_WRITE_8   	;发送8个数据
 	MOVLW 	TX_ADD  ;//发送数据的起始地址
 	MOVWF 	FSR
 	MOVLW 	D'8'
 	MOVWF 	COUNT2
TW1
 	MOVF 	INDF,W
 	MOVWF 	TIME_TX
 	CALL 	CMD
 	INCF 	FSR,F
 	DECFSZ 	COUNT2,F
 	GOTO 	TW1
 	BCF  	RST
 	RETURN 

;***********************************************
; GET_TIME  
; 作用:一次接受7个字节的时间数据,突发模式读取
; INPUT:NONE
; OUTPUT:把7个时间数据保存在TIME_RX_ADD开始的7个寄存器里面
;***********************************************
GET_TIME    
    	MOVLW 	B'10111111'
 	MOVWF 	TIME_TX
 	BSF  	RST
 	CALL 	CMD
	;TIME_READ_7   		;接收7个数据
 	MOVLW 	RX_ADD  	;保存数据的起始地址
 	MOVWF 	FSR
 	MOVLW 	D'7'
 	MOVWF 	COUNT2
TR2
 	CALL 	TIME_READ_1
 	MOVF 	TIME_RX,W
 	MOVWF 	INDF
 	INCF 	FSR,F
 	DECFSZ 	COUNT2,F
 	GOTO 	TR2
 	BCF  	RST
 	RETURN

;************************************************
; TIME_WRITE_1
; 作用:一次发送一个字节的数据,用于发送1302的
; 控制字或者发送一个数据
; INPUT: TIME_TX
;************************************************
CMD
 	MOVLW D'8'
 	MOVWF COUNT1
TLOP
 	BCF  	I_O   	;初始值是低电平
 	BCF  	SCLK
 	BTFSC 	TIME_TX,0
 	BSF  	I_O
 	RRF  	TIME_TX,F
 	BSF  	SCLK  	;高电平发送数据
 	DECFSZ 	COUNT1,F
 	GOTO 	TLOP
 	BCF  	SCLK  	;恢复
 	RETURN

;************************************************
; TIME_READ_1
; 作用:读取1302一个字节的数据
; INPUT: NONE
; OUTPUT:接收数据保存在TIME_RX里面
; 原理:在SCLK下降沿接收数据,低字节在前,根据I_O的
;    的电平的高低,采取带进位和不带进位右移.
;***********************************************
TIME_READ_1
 	BANK1
 	BSF  	TRISC,7 	;I_O  IS INPUT
 	BANK0
 	MOVLW 	D'8'
 	MOVWF 	COUNT1 		;读取8个字节
TR1
 	BCF  	SCLK 		;下降沿读取
 	BCF  	STATUS,C
 	BTFSC 	I_O
 	BSF  	STATUS,C
 	RRF  	TIME_RX,F
 	BSF  	SCLK 		;恢复高电平
 	DECFSZ 	COUNT1,F
 	GOTO 	TR1
 	BANK1
 	BCF  	TRISC,7 	;OUTPUT
 	BANK0
 	BCF  	SCLK 		;恢复
 	RETURN

;======================================
PORT_INI
 	BANK1
 	MOVLW 	B'00000000'
 	MOVWF 	TRISC
 	MOVLW 	B'0'
 	MOVWF 	TRISB
 	MOVLW 	B'00000111'
 	MOVWF 	ADCON1
 	MOVLW 	B'00000000'
 	MOVWF 	TRISA
 	BANK0
 	MOVLW 	18H
 	MOVWF 	20H
 	MOVLW 	19H
 	MOVWF 	21H
 	MOVLW 	05H
 	MOVWF 	22H
 	MOVLW 	13H
 	MOVWF 	23H
 	MOVLW 	14H
 	MOVWF 	24H
 	MOVLW 	15H
 	MOVWF 	25H
 	MOVLW 	16H
 	MOVWF 	26H
 	RETURN

;==========================
CLR_RAM
  	MOVLW 	20H
  	MOVWF 	FSR
LOOP 
  	CLRF 	INDF
  	INCF 	FSR,F
  	BTFSS 	FSR,7
  	GOTO 	LOOP 	;清除32个
  	RETURN
;==========================
 	END
 
 

⌨️ 快捷键说明

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