专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
PIC16F72+DS1302+0.8寸数码管电子钟
2020-02-08 09:04
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
12745
9
9
PIC16F72+DS1302+0.8寸数码管电子钟,1.6mm双面板热转印已制作成功,请大家多多指教。
PCB图
(原文件名:16F72+DS1302.JPG)
实物图改天有相机再补上。
AD6.8画的PCB
ourdev_717580TFJLB6.rar(文件大小:37K)
(原文件名:16F72+DS1302.rar)
汇编程序
ourdev_717581SN66BG.rar(文件大小:35K)
(原文件名:16F72+DS1302.rar)
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
ffdzpilot
1楼-- · 2020-02-08 14:38
暂时下不来,顶下等楼主的图。
加载中...
pangjineng
2楼-- · 2020-02-08 14:46
我把程序贴出来给大家看吧,原理图从程序中也可以知道怎么接。
;*********************************************************************************
LIST P=PIC16F72
#INCLUDE<P16F72.INC>
;********************************************************************************
#DEFINE DIO_A PORTA ;RA端口寄存器
#DEFINE DIO_B PORTB ;RB端口寄存器
#DEFINE DIO_C PORTC ;RC端口寄存器
#DEFINE SIO_A TRISA ;RA端口输入、输出设定
#DEFINE SIO_B TRISB ;RB端口输入、输出设定
#DEFINE SIO_C TRISC ;RC端口输入、输出设定
;===============数码管共脚位定义=============================
#DEFINE HOUH_LED PORTB,3 ;数码管位选
#DEFINE HOUL_LED PORTB,2 ;数码管位选
#DEFINE MINH_LED PORTB,1 ;数码管位选
#DEFINE MINL_LED PORTB,0 ;数码管位选
#DEFINE SEC_LED PORTB,4 ;LED位选
;===============按键脚位定义=================================
#DEFINE SETUP_KEY PORTA,3 ;时钟设置键
#DEFINE INCREASE_KEY PORTA,4 ;时间加键
#DEFINE DECREASE_KEY PORTA,5 ;时间减键
;============== DS1302引脚定义 ==============================
#DEFINE T_CLK PORTA,0 ;1302时钟->7
#DEFINE T_IO PORTA,1 ;1302数据输入/输出->6
#DEFINE T_RST PORTA,2 ;1302使能位->5
#DEFINE SET_IO TRISA,1 ;设定1302I_O
;==========================================================================
#DEFINE FLAG_10S FLAG,7 ;
#DEFINE FLAG_SETUP FLAG,6 ;
#DEFINE FLAG_500MS FLAG,5 ;
#DEFINE FLAG_250MS FLAG,4 ;
#DEFINE FLAG_MINUTE FLAG,3 ;
#DEFINE FLAG_HOUR FLAG,2 ;
#DEFINE FLAG_TIME FLAG,1 ;
#DEFINE FLAG_DATE FLAG,0 ;
;==========================================================================
#DEFINE FLAG_YEAR FLAG1,7 ;
#DEFINE FLAG_DAY FLAG1,6 ;
#DEFINE FLAG_DATA FLAG1,5 ;
;*********************寄存器定义***************************
ID_TEMP EQU 72H
W_TEMP EQU 73H
STATUS_TEMP EQU 74H
PCLATH_TEMP EQU 75H
ERRORLEVEL -302
CBLOCK 020H
SEC ;秒寄存器
MINUTE ;分寄存器
HOUR ;小时寄存器
DATE ;日寄存器
MONTH ;月寄存器
DAY ;星期寄存器
YEAR ;年寄存器
WRITE_ENABLED ;写使能寄存器
DS1302_RX ;保存接受的1个数据
DS1302_TX ;准备写入到DS1302的一个数据
BYTE_COUNT ;字节数寄存器
BIT_COUNT ;BIT数寄存器
TEMP1 ;转换进制用
TIMER0 ;
TIMER1 ;定时用
TIMER2 ;/
;-------------------------------------
FLAG
FLAG1
FSR_TEMP
COUNT
COUNT1 ;显示数据位数
COUNT2 ;显示数据表中位置
COUNT3 ;显示位置
COUNT4
CNT
CNT0
CNT1
CNT2
SHOW_MIN
SHOW_HOU
DATA_INC
DATEP
C1 ;
C2 ;
C3 ;
ENDC
;*******************宏定义*********************************
BANK1 MACRO ;体1
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK0 MACRO ;体0
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
;-----------------------------------------------------------------------
ORG 0000H
NOP
GOTO PORT_INIT
NOP
GOTO PORT_INIT
ORG 0004H
NOP
GOTO INTERMIT_SERVE
RETFIE
;-------------------------------------------------------------------
;子程序名:
;功 能:中断服务主程序入口
;功能说明:
;-----------------------------------------------------------------
INTERMIT_SERVE:
;---------现场保护-----------------------
MOVWF W_TEMP ;
SWAPF STATUS,W ;
CLRF STATUS ;
MOVWF STATUS_TEMP ;
MOVF PCLATH,W ;
MOVWF PCLATH_TEMP ;
CLRF PCLATH ;
;-------中断服务-------------------------
INCF TIMER0,F ;
MOVLW .100 ;
XORWF TIMER0,W ;判断是否到250MS
BTFSS STATUS,Z ;/
GOTO AAA ;ON,
MOVLW B'00010000' ;每到250MS取反一次标志位1
XORWF FLAG,F ;/
CLRF TIMER0
INCF TIMER1,F ;
MOVLW .2 ;
XORWF TIMER1,W ;判断是否到500MS
BTFSS STATUS,Z ;/
GOTO AAA ;ON,
MOVLW B'00100000' ;每到500MS取反一次标志位1
XORWF FLAG,F ;/
CLRF TIMER1 ;YES,
INCF TIMER2,F ;
MOVLW .20 ;
XORWF TIMER2,W ;判断是否到5S
BTFSS STATUS,Z ;/
GOTO $+3 ;/
CLRF TIMER2 ;YES,
BSF FLAG_10S ;
;----------------------------------------
AAA
BTFSC FLAG_SETUP
GOTO DP_SEC
MOVFW HOUR ;
MOVWF SHOW_HOU ;
MOVFW MINUTE ;/显示时间
MOVWF SHOW_MIN ;/
MOVLW 56H ;55~60秒显示日期
SUBWF SEC,W
BTFSS STATUS,C
GOTO $+8
BSF FLAG_DATA
MOVFW MONTH ;
MOVWF SHOW_HOU ;
MOVFW DATE ;/显示日期
MOVWF SHOW_MIN ;/
BCF SEC_LED ;保证秒指示不亮
GOTO $+3
BCF FLAG_DATA
DP_SEC
CALL PLAY_SEC
MOVFW DIO_B
ANDLW 0F0H
MOVWF DIO_B
CLRF DIO_C
INCF COUNT,F
MOVLW 01H ;;;;;;;;;;;;;;;;;
XORWF COUNT,W
BTFSC STATUS,Z
CALL PLAY_HOUR_H ;
MOVLW 02H ;;;;;;;;;;;;;;;;;;;
XORWF COUNT,W
BTFSC STATUS,Z
CALL PLAY_HOUR_L ;
MOVLW 03H ;;;;;;;;;;;;;;;;;;
XORWF COUNT,W
BTFSC STATUS,Z
CALL PLAY_MINUTE_H ;
MOVLW 04H ;;;;;;;;;;;;;;;;
XORWF COUNT,W
BTFSS STATUS,Z
GOTO $+3
CLRF COUNT
CALL PLAY_MINUTE_L ;
MOVLW 0D9H ;
MOVWF TMR0 ;/写入TMR0初始值
BCF INTCON,T0IF ;清TMR0中断标志
;-------恢复现场-------------------
MOVF PCLATH_TEMP,W ;
MOVWF PCLATH ;
SWAPF STATUS_TEMP,F ;
MOVWF STATUS ;
SWAPF W_TEMP,F ;
SWAPF W_TEMP,W ;
RETFIE ;中断返回
;.............................................................
;子程序名:
;功 能:清寄存器
;功能说明:
;................................................................
CLR_RAM:
MOVLW 20H
MOVWF FSR
CLRF INDF
INCF FSR,F
BTFSS FSR,7
GOTO $-3
RETLW 00H
;--------------------------------------------------------------------------
;子程序名:
;功 能:查表子程序
;功能说明:用于显示0-9时钟数据字型码,共阳LED无小数点
;---------------------------------------------------------------------------
TABLE:
ADDWF PCL,F
RETLW B'11001111' ;0
RETLW B'00000101' ;1
RETLW B'11011100' ;2
RETLW B'10011101' ;3
RETLW B'00010111' ;4
RETLW B'10011011' ;5
RETLW B'11011011' ;6
RETLW B'00001101' ;7
RETLW B'11011111' ;8
RETLW B'10011111' ;9
RETLW B'01011111' ;A
RETLW B'11010011' ;B
RETLW B'11001010' ;C
RETLW B'11010101' ;D
RETLW B'11011010' ;E
RETLW B'01011010' ;F
;...........Program Initialization........................................
;子程序名: 单片机复位进入点
;功 能:
;功能说明:
;............................................................................
PORT_INIT:
CLRF INTCON ;清除中断
BANK1 ;
MOVLW B'00000000' ;
MOVWF SIO_C ;RC口设为输出
MOVLW B'11100000' ;
MOVWF SIO_B ;/RB口设为输入
MOVLW B'11111000' ;
MOVWF SIO_A ;
MOVLW 06H ;
MOVWF ADCON1 ;A口配置为普通数字I/O
MOVLW B'10000101' ; 设TMR0分频1:64
MOVWF OPTION_REG ;/RB口同时输入、出时不能上拉
BANK0 ;
;----------------------------------
CLRF DIO_A ;清控制位
CLRF DIO_B
CLRF DIO_C ;关闭显示
MOVLW 0DAH ;写入TMR0初始值
MOVWF TMR0 ;/2.5MS中断一次
MOVLW B'10100000' ;开TMR0中断使能位
MOVWF INTCON ;/
CALL CLR_RAM ;->清寄存器
CALL DS1302_INIT ;->初始化DS1302
CALL READ_DS1302 ;
;CALL DATE_INIT ;
;CALL WRITE_DS1302 ;/写数据
CALL QINDON_INIT
MOVFW DATE
MOVWF DATEP
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;程序名:
;功 能:
;功能说明:
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MAIN_PROGRAM:
BTFSC FLAG_SETUP
GOTO $+3
;NOP
;NOP
CALL DELAY250MS
CALL READ_DS1302 ;
BTFSS FLAG_10S ;检测是否到5S
GOTO $+3 ;
CLRF FLAG ;3S到,退出校正时间状态
CLRF FLAG1 ;
MOVFW DATE
XORWF DATEP,W
BTFSC STATUS,Z
GOTO TEST_KEY
MOVLW 030H
SUBWF SEC,W
BTFSS STATUS,Z
GOTO TEST_KEY ;->检测按键
MOVLW 005H
SUBWF SEC,F
CALL WRITE_DS1302 ;写入设置的数据
MOVFW DATE
MOVWF DATEP
GOTO MAIN_PROGRAM ;循环
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;子程序名:0
;功 能:按键测试处理,
;功能说明:3秒内未有按键按下,将退出各种状态
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TEST_KEY:
NOP ;
MOVF DIO_A,W ;
ANDLW B'00111000' ;
XORLW B'00111000' ;检测是否有按键按下?
BTFSC STATUS,Z ;/
GOTO MAIN_PROGRAM ;/
BCF FLAG_10S ;YES,重新启动5S到标记
CLRF TIMER2 ;/
;------------------------------------------------------
BTFSC FLAG_DATA ;显示日期时禁止调整
GOTO MAIN_PROGRAM ;/
BTFSS SETUP_KEY ;检测是否按时间设置键?
GOTO SETUP ;YES,跳设置键处理程序
BTFSS INCREASE_KEY ;检测是否按增键?
GOTO INCREASE ;YES,
BTFSS DECREASE_KEY ;检测是否按减键?
GOTO DECREASE ;YES,
GOTO MAIN_PROGRAM ;
;时间设置键处理--------------------
SETUP:
CALL DELAY_10MS ;
BTFSS SETUP_KEY ;检测设置键是否松开?
GOTO $-2 ;/
CALL DELAY_10MS ;
BTFSC FLAG_SETUP ;检测是否已按设置键?
GOTO DEC_MIN ;ON
CLRF FLAG1 ;
MOVLW SHOW_HOU ;
MOVWF FSR ;第一个调整单元
MOVLW 24H
MOVWF DATA_INC ;调整最大值
BSF FLAG_SETUP
BSF FLAG_HOUR
BSF FLAG_TIME
GOTO TEST_KEY
DEC_MIN:
INCF COUNT2,F
MOVLW 01H ;;;;;;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_MON ;02H
MOVLW SHOW_MIN
MOVWF FSR ;调整单元地址
MOVLW 60H
MOVWF DATA_INC ;调整最大值
BSF FLAG_MINUTE
BCF FLAG_HOUR
DEC_MON
MOVLW 02H ;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_DATE ;03H
MOVFW SHOW_HOU
MOVWF HOUR
MOVFW SHOW_MIN
MOVWF MINUTE
MOVLW SHOW_HOU
MOVWF FSR ;调整单元地址
MOVLW 13H
MOVWF DATA_INC ;调整最大值
MOVFW MONTH ;-
MOVWF SHOW_HOU ;|-显示
MOVFW DATE ;|
MOVWF SHOW_MIN ;-
BSF FLAG_HOUR
BCF FLAG_MINUTE
BSF FLAG_DATE
BCF FLAG_TIME
DEC_DATE
MOVLW 03H ;;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_YEAR ;04H
MOVLW SHOW_MIN
MOVWF FSR ;调整单元地址
MOVLW 32H
MOVWF DATA_INC ;调整最大值
BSF FLAG_MINUTE
BCF FLAG_HOUR
DEC_YEAR
MOVLW 04H ;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_DAY ;05H
MOVFW SHOW_HOU
MOVWF MONTH
MOVFW SHOW_MIN
MOVWF DATE
MOVLW SHOW_HOU
MOVWF FSR ;调整单元地址
MOVLW 9AH
MOVWF DATA_INC ;调整最大值
MOVFW YEAR ;
MOVWF SHOW_HOU ;
MOVFW DAY ;/显示
MOVWF SHOW_MIN ;/
BSF FLAG_HOUR
BCF FLAG_MINUTE
BSF FLAG_YEAR
BCF FLAG_DATE
DEC_DAY
MOVLW 05H ;;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_END ;06H
MOVLW SHOW_MIN
MOVWF FSR ;调整单元地址
MOVLW 08H
MOVWF DATA_INC ;调整最大值
BSF FLAG_MINUTE
BCF FLAG_HOUR
BSF FLAG_DAY
BCF FLAG_YEAR
DEC_END
MOVLW 06H ;;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC1 ;
MOVFW SHOW_HOU
MOVWF YEAR
MOVFW SHOW_MIN
MOVWF DAY
CLRF COUNT2 ;清
BCF FLAG_SETUP ;清标示
BCF FLAG_DAY
BCF FLAG_MINUTE
CALL WRITE_DS1302 ;写入设置的数据
DEC1
GOTO TEST_KEY ;
;增加键处理++++++++++++++++++++++++++++++++++++++++++++++++
INCREASE:
CALL DELAY_10MS ;
BTFSS INCREASE_KEY ; 检测是否松开加键?
GOTO $-2 ;/
CALL DELAY_10MS ;
BTFSS FLAG_SETUP ;检测是否已进入设置状态?
GOTO $+8 ;YES,处理数据调整
CALL BCD_B ;先BCD数据转换成2进制,
INCF INDF,F ;当前地址数据加1
CALL B_BCD ;再将2进制数据转换成BCD码,写如该单元
;判断调整到上限?
MOVFW DATA_INC ;
XORWF INDF,W ;判断当前地址数据变量大小
BTFSC STATUS,Z ;/
CLRF INDF ;/
GOTO MAIN_PROGRAM ;/
;减少键处理=================================================
DECREASE:
CALL DELAY_10MS ;
BTFSS DECREASE_KEY ;检测是否松开减键?
GOTO $-2 ;/
CALL DELAY_10MS ;
BTFSS FLAG_SETUP ;检测是否已进入设置状态?
GOTO $+7 ;YES,处理数据调整
CALL BCD_B ;BCD码转2进制
MOVF INDF,W ;
BTFSC STATUS,Z ;判断下限减到0?
GOTO MAIN_PROGRAM ;/
DECF INDF,F ;
CALL B_BCD ;2进制转BCD码
GOTO MAIN_PROGRAM ;返回主程序
;====二进制转BCD================
B_BCD:
MOVF INDF,W
MOVWF TEMP1
CLRF INDF
LOOP:
MOVLW .10
SUBWF TEMP1,F
BTFSS STATUS,C
GOTO OVER
MOVLW 10H
ADDWF INDF,F
GOTO LOOP
OVER:
ADDWF TEMP1,W
ADDWF INDF,F
RETLW 0
;====BCD转二进制==================
BCD_B:
SWAPF INDF,W
ANDLW 0FH
MOVWF TEMP1
MOVLW 0FH
ANDWF INDF,F
BCF STATUS,C
RLF TEMP1,W
RLF TEMP1,F
RLF TEMP1,F
RLF TEMP1,F
ADDWF TEMP1,W
ADDWF INDF,F
RETLW 0
;...........Program Initialization........................................
;子程序名:
;功 能:启动DS1302开始计时
;功能说明:
;............................................................................
QINDON_INIT
BCF T_CLK ;
BCF T_RST ;先禁止
MOVLW B'10000000' ;发送写使能寄存器命令
MOVWF DS1302_TX ;
;B7必须为1
BSF T_RST ;
CALL SEND_BYTE ;->发送一个字节数据
BCF SEC,7
MOVFW SEC ;允许写使能命令
MOVWF DS1302_TX ;/
CALL SEND_BYTE ;->发送一个字节的数据
BCF T_RST ;->DS1302复位
RETURN ;
;...........Program Initialization........................................
;子程序名:
;功 能:写DS1302初始数据
;功能说明:写入10年09月19日10时05分00秒
;............................................................................
DATE_INIT:
MOVLW B'00000000' ;B7=0表示启动时钟震荡,B7=1表示暂停时钟震荡
MOVWF SEC ;/B6~B4表示秒十位,B3-B0表示秒个位
;秒寄存器 ,BCD码格式,初始00秒
MOVLW 05H ;
MOVWF MINUTE ;/
;分钟寄存器,BCD码格式,00-59
MOVLW B'00010000' ;B7=0表示24小时方式,B7=1表示12小时方式,当选12小时方式下
MOVWF HOUR ;B6=未用,B5=1表示下午B5=0表示上午,B4=小时高位B3-B0小时低位
;小时寄存器,BCD码格式,00-59
MOVLW 19H
MOVWF DATE ;日
;日期寄存器,BCD码格式,00-31
MOVLW 09H
MOVWF MONTH ;月
;月份寄存器,BCD码格式,00-12
MOVLW 07H
MOVWF DAY ;星期
;星期寄存器,BCD码格式,0-7
MOVLW 10H ;
MOVWF YEAR ;年
;年寄存器,BCD码格式,00-99
RETURN
;----------------------------------------------------------------------
;子程序名::DS1302_INI
;功 能:初始化1302,先禁止RST,允许写使能
;功能说明:
;---------------------------------------------------------------------------
DS1302_INIT:
BCF T_CLK ;
BCF T_RST ;先禁止
MOVLW B'10001110' ;发送写使能寄存器命令
MOVWF DS1302_TX ;
;B7必须为1,B6=1表示对RAM进行操作B6=0表示读写时钟/日历数据;
;B5~B1为寄存器地址位,B0为0表示写,为1表示读
BSF T_RST ;
CALL SEND_BYTE ;->发送一个字节数据
MOVLW B'00000000' ;允许写使能命令
MOVWF DS1302_TX ;/
;B7=1为写保护,B7=0为写允许,B0~B6=0固定为0
CALL SEND_BYTE ;->发送一个字节的数据
BCF T_RST ;->DS1302复位
;------------------------------
MOVLW B'10010000' ;90H设定充电方式命令
MOVWF DS1302_TX ;写入缓冲
BSF T_RST ;->允许操作DS1302
CALL SEND_BYTE ;/
MOVLW B'10100101' ;->设定为不充电,
MOVWF DS1302_TX ;/限流电阻2KΩ
CALL SEND_BYTE ;
BCF T_RST ;->DS1302复位
RETURN ;
;----------------------------------------------------------------------
;子程序名:SEND_BYTE
;功 能:调用一次发送一个字节的数据
;功能说明:数据从低位开始发送,用于发送1302的控制命令或发送一个数据
;---------------------------------------------------------------------------
SEND_BYTE:
MOVLW D'8' ;写入BIT数
MOVWF BIT_COUNT ;/
SEND_LOOP:
BCF T_IO ;
BCF T_CLK ;->BIT数在T_CLK低电平时变化
BTFSC DS1302_TX,0 ;检测发送缓冲寄存器位0,是1就发1.是0就发0
BSF T_IO ;/
RRF DS1302_TX,F ;向右移1位,为发送下一个BIT准备
BSF T_CLK ;确定发送有效
DECFSZ BIT_COUNT,F ;检测是否发送完8个BIT?
GOTO SEND_LOOP ;<否>继续发送下一位
BCF T_CLK ;<是>返回
RETLW 00H ;发送完8BIT数返回
;----------------------------------------------------------------------
;子程序名:READ_BYTE
;功 能:调用一次读出一个字节的数据
;功能说明:数据从低位开始发送,用于发送1302的控制命令或发送一个数据
;---------------------------------------------------------------------------
READ_BYTE:
BANK1
BSF SET_IO ;I_O 设置为输入
BANK0
NOP
MOVLW D'8' ;读8个BIT数据
MOVWF BIT_COUNT ;/
READ_LOOP:
BCF T_CLK ;下降沿读取
BCF STATUS,C ;
BTFSC T_IO ;接收一个BIT
BSF STATUS,C ;/
RRF DS1302_RX,F
BSF T_CLK ;恢复高电平
DECFSZ BIT_COUNT,F ;检测是否读完8BIT?
GOTO READ_LOOP ;-><否>循环读出
BANK1
BCF SET_IO ;I_O恢复为输出
BANK0
BCF T_CLK
RETURN
NOP
;**********************************************************
;子程序名:READ_DS1302
;功 能:突发模式读DS1302
;说 明:1.FLAG_RAM=1 读RAM14个字节定时数据
; 2.FLAG_RAM=0 读7个字节日历/时钟数据
;**********************************************************
READ_DS1302:
BSF T_RST ;-启动DS1302
MOVLW B'10111111' ;->ON,读日历/时钟突发模式命令多字节
MOVWF DS1302_TX ;->写入发送寄存器
CALL SEND_BYTE ;->发送
MOVLW SEC ;->ON,准备接收DS1302时钟数据的首地址
MOVWF FSR ;写入间接寻址寄存器
MOVLW D'7' ;->,ON,1次读出7个字节日历/时钟数据
MOVWF BYTE_COUNT ;->写入字节计数器
READ_BIT
CALL READ_BYTE
MOVF DS1302_RX,W ;<是>将8BIT数据写入数据保存处
MOVWF INDF ;/
INCF FSR,F ;数据保存处地址加1,为下一个数据提供地址
DECFSZ BYTE_COUNT,F ;检测是否读完数据?
GOTO READ_BIT ;->否,循环
BCF T_RST ;->DS1302复位,禁止操作
RETURN ;读完7个日历/时钟数据,返回
;**********************************************************
;子程序名:WRITE_DS1302
;功 能:突发模式写DS1302
;说 明:1.定时标志FLAG_TIMER=1 写14个字节定时数据->RAM
; 2.定时标志FLAG_TIMER=0 写7个字节日历/时钟数据/写使能命令
;**********************************************************
WRITE_DS1302:
MOVLW B'10111110' ;->ON,写时钟多字节命令
MOVWF DS1302_TX ;
BSF T_RST ; 发送突发模式写时钟命令
CALL SEND_BYTE ;/
;--------------------------------
;BCF T_CLK ;
;BCF T_IO ;
MOVLW SEC ;->ON,准备写时钟/日历数据首地址
MOVWF FSR ;
MOVLW D'8' ;->ON,准备写时钟的字节数
MOVWF BYTE_COUNT ;/
WRITE_BYTE:
MOVF INDF,W ;拷贝地址数据内容到发送缓冲
MOVWF DS1302_TX ;/
CALL SEND_BYTE
INCF FSR,F ;->数据发送地址加1,为下一个数据提供地址
DECFSZ BYTE_COUNT,F ;检测是否写完数据?
GOTO WRITE_BYTE ;
BCF T_RST ;->DS1302复位,禁止操作
RETURN ;写完数据,返回
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;子程序名:显示LED
;功 能:
;功能说明:
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PLAY_SEC:
;显示秒闪烁~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BTFSS FLAG_500MS ;检测闪烁频率
GOTO $+3 ;/
BSF SEC_LED ;
RETURN
BCF SEC_LED ;
RETURN
;====================================
;显示分L位MLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMMLMLMLMLM
PLAY_MINUTE_L:
BSF MINL_LED ;
BTFSS FLAG_MINUTE ;->检测是否要闪烁当前单元?
GOTO $+3 ;
BTFSS FLAG_250MS ;检测闪烁频率
GOTO $+0AH ;/
MOVF SHOW_MIN,W ;
ANDLW 0FH ;
CALL TABLE ;
MOVWF DIO_C ;
BTFSS FLAG_DAY
GOTO $+3 ;判断指示灯是否点亮
MOVLW B'00100000'
ADDWF DIO_C,F
RETURN
BTFSS FLAG_DAY ;指示灯不跟着闪烁
GOTO $+4
MOVFW DIO_C
XORLW B'00100000'
MOVWF DIO_C
RETURN
;显示分H位MHMHMHMHMHMHMHMHMHMHMHMHMHMHMH
PLAY_MINUTE_H:
BSF MINH_LED ;
BTFSS FLAG_MINUTE ;->检测是否要闪烁当前单元?
GOTO $+3 ;
BTFSS FLAG_250MS ;检测闪烁频率
GOTO $+0AH ;/
SWAPF SHOW_MIN,W ;
ANDLW 0FH ;
CALL TABLE ;
MOVWF DIO_C ;
BTFSS FLAG_YEAR
GOTO $+3
MOVLW B'00100000'
ADDWF DIO_C,F
RETURN
BTFSS FLAG_YEAR
GOTO $+4
MOVFW DIO_C
XORLW B'00100000'
MOVWF DIO_C
RETURN
;显示时L位HLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHL
PLAY_HOUR_L:
BSF HOUL_LED ;
BTFSS FLAG_HOUR ;->检测是否要闪烁当前单元?
GOTO $+3 ;
BTFSS FLAG_250MS ;检测闪烁频率
GOTO $+0AH ;/
MOVF SHOW_HOU,W
ANDLW 0FH ;
CALL TABLE ;
MOVWF DIO_C ;
BTFSS FLAG_DATE
GOTO $+3
MOVLW B'00100000'
ADDWF DIO_C,F
RETURN
BTFSS FLAG_DATE
GOTO $+4
MOVFW DIO_C
XORLW B'00100000'
MOVWF DIO_C
RETURN
;显示时H位HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
PLAY_HOUR_H:
BSF HOUH_LED ;
BTFSS FLAG_HOUR ;->检测是否要闪烁当前单元?
GOTO $+3 ;
BTFSS FLAG_250MS ;检测闪烁频率
GOTO $+0AH ;/
SWAPF SHOW_HOU,W ;
ANDLW 0FH ;
CALL TABLE ;
MOVWF DIO_C ;
BTFSS FLAG_TIME
GOTO $+3
MOVLW B'00100000'
ADDWF DIO_C,F
RETURN
BTFSS FLAG_TIME
GOTO $+4
MOVFW DIO_C
XORLW B'00100000'
MOVWF DIO_C
RETURN
; 以下为延时子程序 *******************************
DELAY_10MS
MOVLW D'205' ;
MOVWF C2
MOVLW D'32' ;
MOVWF C1
DECFSZ C1,F
GOTO $-1
DECFSZ C2,F
GOTO $-5
RETURN
DELAY250MS
MOVLW D'3' ;
MOVWF C3
MOVLW D'255' ;
MOVWF C2
MOVLW D'255' ;
MOVWF C1
DECFSZ C1,F
GOTO $-1
DECFSZ C2,F
GOTO $-5
DECFSZ C3,F
GOTO $-9
RETURN
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
END
加载中...
beijinggood2008
3楼-- · 2020-02-08 20:21
汇编 看的头痛!
加载中...
szxszx
4楼-- · 2020-02-08 22:24
精彩回答 2 元偷偷看……
加载中...
ds168
5楼-- · 2020-02-09 01:22
谢谢分享
加载中...
cychao2012
6楼-- · 2020-02-09 02:03
汇编 看的头痛!
加载中...
1
2
下一页
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
串口无法连续接收数据
2 个回答
求助:dsPIC33F串口通信,如何发送字符串
4 个回答
PIC45K40 IOC(interrupt-on-change)功能
2 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
;*********************************************************************************
LIST P=PIC16F72
#INCLUDE<P16F72.INC>
;********************************************************************************
#DEFINE DIO_A PORTA ;RA端口寄存器
#DEFINE DIO_B PORTB ;RB端口寄存器
#DEFINE DIO_C PORTC ;RC端口寄存器
#DEFINE SIO_A TRISA ;RA端口输入、输出设定
#DEFINE SIO_B TRISB ;RB端口输入、输出设定
#DEFINE SIO_C TRISC ;RC端口输入、输出设定
;===============数码管共脚位定义=============================
#DEFINE HOUH_LED PORTB,3 ;数码管位选
#DEFINE HOUL_LED PORTB,2 ;数码管位选
#DEFINE MINH_LED PORTB,1 ;数码管位选
#DEFINE MINL_LED PORTB,0 ;数码管位选
#DEFINE SEC_LED PORTB,4 ;LED位选
;===============按键脚位定义=================================
#DEFINE SETUP_KEY PORTA,3 ;时钟设置键
#DEFINE INCREASE_KEY PORTA,4 ;时间加键
#DEFINE DECREASE_KEY PORTA,5 ;时间减键
;============== DS1302引脚定义 ==============================
#DEFINE T_CLK PORTA,0 ;1302时钟->7
#DEFINE T_IO PORTA,1 ;1302数据输入/输出->6
#DEFINE T_RST PORTA,2 ;1302使能位->5
#DEFINE SET_IO TRISA,1 ;设定1302I_O
;==========================================================================
#DEFINE FLAG_10S FLAG,7 ;
#DEFINE FLAG_SETUP FLAG,6 ;
#DEFINE FLAG_500MS FLAG,5 ;
#DEFINE FLAG_250MS FLAG,4 ;
#DEFINE FLAG_MINUTE FLAG,3 ;
#DEFINE FLAG_HOUR FLAG,2 ;
#DEFINE FLAG_TIME FLAG,1 ;
#DEFINE FLAG_DATE FLAG,0 ;
;==========================================================================
#DEFINE FLAG_YEAR FLAG1,7 ;
#DEFINE FLAG_DAY FLAG1,6 ;
#DEFINE FLAG_DATA FLAG1,5 ;
;*********************寄存器定义***************************
ID_TEMP EQU 72H
W_TEMP EQU 73H
STATUS_TEMP EQU 74H
PCLATH_TEMP EQU 75H
ERRORLEVEL -302
CBLOCK 020H
SEC ;秒寄存器
MINUTE ;分寄存器
HOUR ;小时寄存器
DATE ;日寄存器
MONTH ;月寄存器
DAY ;星期寄存器
YEAR ;年寄存器
WRITE_ENABLED ;写使能寄存器
DS1302_RX ;保存接受的1个数据
DS1302_TX ;准备写入到DS1302的一个数据
BYTE_COUNT ;字节数寄存器
BIT_COUNT ;BIT数寄存器
TEMP1 ;转换进制用
TIMER0 ;
TIMER1 ;定时用
TIMER2 ;/
;-------------------------------------
FLAG
FLAG1
FSR_TEMP
COUNT
COUNT1 ;显示数据位数
COUNT2 ;显示数据表中位置
COUNT3 ;显示位置
COUNT4
CNT
CNT0
CNT1
CNT2
SHOW_MIN
SHOW_HOU
DATA_INC
DATEP
C1 ;
C2 ;
C3 ;
ENDC
;*******************宏定义*********************************
BANK1 MACRO ;体1
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK0 MACRO ;体0
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
;-----------------------------------------------------------------------
ORG 0000H
NOP
GOTO PORT_INIT
NOP
GOTO PORT_INIT
ORG 0004H
NOP
GOTO INTERMIT_SERVE
RETFIE
;-------------------------------------------------------------------
;子程序名:
;功 能:中断服务主程序入口
;功能说明:
;-----------------------------------------------------------------
INTERMIT_SERVE:
;---------现场保护-----------------------
MOVWF W_TEMP ;
SWAPF STATUS,W ;
CLRF STATUS ;
MOVWF STATUS_TEMP ;
MOVF PCLATH,W ;
MOVWF PCLATH_TEMP ;
CLRF PCLATH ;
;-------中断服务-------------------------
INCF TIMER0,F ;
MOVLW .100 ;
XORWF TIMER0,W ;判断是否到250MS
BTFSS STATUS,Z ;/
GOTO AAA ;ON,
MOVLW B'00010000' ;每到250MS取反一次标志位1
XORWF FLAG,F ;/
CLRF TIMER0
INCF TIMER1,F ;
MOVLW .2 ;
XORWF TIMER1,W ;判断是否到500MS
BTFSS STATUS,Z ;/
GOTO AAA ;ON,
MOVLW B'00100000' ;每到500MS取反一次标志位1
XORWF FLAG,F ;/
CLRF TIMER1 ;YES,
INCF TIMER2,F ;
MOVLW .20 ;
XORWF TIMER2,W ;判断是否到5S
BTFSS STATUS,Z ;/
GOTO $+3 ;/
CLRF TIMER2 ;YES,
BSF FLAG_10S ;
;----------------------------------------
AAA
BTFSC FLAG_SETUP
GOTO DP_SEC
MOVFW HOUR ;
MOVWF SHOW_HOU ;
MOVFW MINUTE ;/显示时间
MOVWF SHOW_MIN ;/
MOVLW 56H ;55~60秒显示日期
SUBWF SEC,W
BTFSS STATUS,C
GOTO $+8
BSF FLAG_DATA
MOVFW MONTH ;
MOVWF SHOW_HOU ;
MOVFW DATE ;/显示日期
MOVWF SHOW_MIN ;/
BCF SEC_LED ;保证秒指示不亮
GOTO $+3
BCF FLAG_DATA
DP_SEC
CALL PLAY_SEC
MOVFW DIO_B
ANDLW 0F0H
MOVWF DIO_B
CLRF DIO_C
INCF COUNT,F
MOVLW 01H ;;;;;;;;;;;;;;;;;
XORWF COUNT,W
BTFSC STATUS,Z
CALL PLAY_HOUR_H ;
MOVLW 02H ;;;;;;;;;;;;;;;;;;;
XORWF COUNT,W
BTFSC STATUS,Z
CALL PLAY_HOUR_L ;
MOVLW 03H ;;;;;;;;;;;;;;;;;;
XORWF COUNT,W
BTFSC STATUS,Z
CALL PLAY_MINUTE_H ;
MOVLW 04H ;;;;;;;;;;;;;;;;
XORWF COUNT,W
BTFSS STATUS,Z
GOTO $+3
CLRF COUNT
CALL PLAY_MINUTE_L ;
MOVLW 0D9H ;
MOVWF TMR0 ;/写入TMR0初始值
BCF INTCON,T0IF ;清TMR0中断标志
;-------恢复现场-------------------
MOVF PCLATH_TEMP,W ;
MOVWF PCLATH ;
SWAPF STATUS_TEMP,F ;
MOVWF STATUS ;
SWAPF W_TEMP,F ;
SWAPF W_TEMP,W ;
RETFIE ;中断返回
;.............................................................
;子程序名:
;功 能:清寄存器
;功能说明:
;................................................................
CLR_RAM:
MOVLW 20H
MOVWF FSR
CLRF INDF
INCF FSR,F
BTFSS FSR,7
GOTO $-3
RETLW 00H
;--------------------------------------------------------------------------
;子程序名:
;功 能:查表子程序
;功能说明:用于显示0-9时钟数据字型码,共阳LED无小数点
;---------------------------------------------------------------------------
TABLE:
ADDWF PCL,F
RETLW B'11001111' ;0
RETLW B'00000101' ;1
RETLW B'11011100' ;2
RETLW B'10011101' ;3
RETLW B'00010111' ;4
RETLW B'10011011' ;5
RETLW B'11011011' ;6
RETLW B'00001101' ;7
RETLW B'11011111' ;8
RETLW B'10011111' ;9
RETLW B'01011111' ;A
RETLW B'11010011' ;B
RETLW B'11001010' ;C
RETLW B'11010101' ;D
RETLW B'11011010' ;E
RETLW B'01011010' ;F
;...........Program Initialization........................................
;子程序名: 单片机复位进入点
;功 能:
;功能说明:
;............................................................................
PORT_INIT:
CLRF INTCON ;清除中断
BANK1 ;
MOVLW B'00000000' ;
MOVWF SIO_C ;RC口设为输出
MOVLW B'11100000' ;
MOVWF SIO_B ;/RB口设为输入
MOVLW B'11111000' ;
MOVWF SIO_A ;
MOVLW 06H ;
MOVWF ADCON1 ;A口配置为普通数字I/O
MOVLW B'10000101' ; 设TMR0分频1:64
MOVWF OPTION_REG ;/RB口同时输入、出时不能上拉
BANK0 ;
;----------------------------------
CLRF DIO_A ;清控制位
CLRF DIO_B
CLRF DIO_C ;关闭显示
MOVLW 0DAH ;写入TMR0初始值
MOVWF TMR0 ;/2.5MS中断一次
MOVLW B'10100000' ;开TMR0中断使能位
MOVWF INTCON ;/
CALL CLR_RAM ;->清寄存器
CALL DS1302_INIT ;->初始化DS1302
CALL READ_DS1302 ;
;CALL DATE_INIT ;
;CALL WRITE_DS1302 ;/写数据
CALL QINDON_INIT
MOVFW DATE
MOVWF DATEP
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;程序名:
;功 能:
;功能说明:
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MAIN_PROGRAM:
BTFSC FLAG_SETUP
GOTO $+3
;NOP
;NOP
CALL DELAY250MS
CALL READ_DS1302 ;
BTFSS FLAG_10S ;检测是否到5S
GOTO $+3 ;
CLRF FLAG ;3S到,退出校正时间状态
CLRF FLAG1 ;
MOVFW DATE
XORWF DATEP,W
BTFSC STATUS,Z
GOTO TEST_KEY
MOVLW 030H
SUBWF SEC,W
BTFSS STATUS,Z
GOTO TEST_KEY ;->检测按键
MOVLW 005H
SUBWF SEC,F
CALL WRITE_DS1302 ;写入设置的数据
MOVFW DATE
MOVWF DATEP
GOTO MAIN_PROGRAM ;循环
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;子程序名:0
;功 能:按键测试处理,
;功能说明:3秒内未有按键按下,将退出各种状态
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TEST_KEY:
NOP ;
MOVF DIO_A,W ;
ANDLW B'00111000' ;
XORLW B'00111000' ;检测是否有按键按下?
BTFSC STATUS,Z ;/
GOTO MAIN_PROGRAM ;/
BCF FLAG_10S ;YES,重新启动5S到标记
CLRF TIMER2 ;/
;------------------------------------------------------
BTFSC FLAG_DATA ;显示日期时禁止调整
GOTO MAIN_PROGRAM ;/
BTFSS SETUP_KEY ;检测是否按时间设置键?
GOTO SETUP ;YES,跳设置键处理程序
BTFSS INCREASE_KEY ;检测是否按增键?
GOTO INCREASE ;YES,
BTFSS DECREASE_KEY ;检测是否按减键?
GOTO DECREASE ;YES,
GOTO MAIN_PROGRAM ;
;时间设置键处理--------------------
SETUP:
CALL DELAY_10MS ;
BTFSS SETUP_KEY ;检测设置键是否松开?
GOTO $-2 ;/
CALL DELAY_10MS ;
BTFSC FLAG_SETUP ;检测是否已按设置键?
GOTO DEC_MIN ;ON
CLRF FLAG1 ;
MOVLW SHOW_HOU ;
MOVWF FSR ;第一个调整单元
MOVLW 24H
MOVWF DATA_INC ;调整最大值
BSF FLAG_SETUP
BSF FLAG_HOUR
BSF FLAG_TIME
GOTO TEST_KEY
DEC_MIN:
INCF COUNT2,F
MOVLW 01H ;;;;;;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_MON ;02H
MOVLW SHOW_MIN
MOVWF FSR ;调整单元地址
MOVLW 60H
MOVWF DATA_INC ;调整最大值
BSF FLAG_MINUTE
BCF FLAG_HOUR
DEC_MON
MOVLW 02H ;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_DATE ;03H
MOVFW SHOW_HOU
MOVWF HOUR
MOVFW SHOW_MIN
MOVWF MINUTE
MOVLW SHOW_HOU
MOVWF FSR ;调整单元地址
MOVLW 13H
MOVWF DATA_INC ;调整最大值
MOVFW MONTH ;-
MOVWF SHOW_HOU ;|-显示
MOVFW DATE ;|
MOVWF SHOW_MIN ;-
BSF FLAG_HOUR
BCF FLAG_MINUTE
BSF FLAG_DATE
BCF FLAG_TIME
DEC_DATE
MOVLW 03H ;;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_YEAR ;04H
MOVLW SHOW_MIN
MOVWF FSR ;调整单元地址
MOVLW 32H
MOVWF DATA_INC ;调整最大值
BSF FLAG_MINUTE
BCF FLAG_HOUR
DEC_YEAR
MOVLW 04H ;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_DAY ;05H
MOVFW SHOW_HOU
MOVWF MONTH
MOVFW SHOW_MIN
MOVWF DATE
MOVLW SHOW_HOU
MOVWF FSR ;调整单元地址
MOVLW 9AH
MOVWF DATA_INC ;调整最大值
MOVFW YEAR ;
MOVWF SHOW_HOU ;
MOVFW DAY ;/显示
MOVWF SHOW_MIN ;/
BSF FLAG_HOUR
BCF FLAG_MINUTE
BSF FLAG_YEAR
BCF FLAG_DATE
DEC_DAY
MOVLW 05H ;;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC_END ;06H
MOVLW SHOW_MIN
MOVWF FSR ;调整单元地址
MOVLW 08H
MOVWF DATA_INC ;调整最大值
BSF FLAG_MINUTE
BCF FLAG_HOUR
BSF FLAG_DAY
BCF FLAG_YEAR
DEC_END
MOVLW 06H ;;;;;;;;;;;;;;;;;;;
XORWF COUNT2,W
BTFSS STATUS,Z
GOTO DEC1 ;
MOVFW SHOW_HOU
MOVWF YEAR
MOVFW SHOW_MIN
MOVWF DAY
CLRF COUNT2 ;清
BCF FLAG_SETUP ;清标示
BCF FLAG_DAY
BCF FLAG_MINUTE
CALL WRITE_DS1302 ;写入设置的数据
DEC1
GOTO TEST_KEY ;
;增加键处理++++++++++++++++++++++++++++++++++++++++++++++++
INCREASE:
CALL DELAY_10MS ;
BTFSS INCREASE_KEY ; 检测是否松开加键?
GOTO $-2 ;/
CALL DELAY_10MS ;
BTFSS FLAG_SETUP ;检测是否已进入设置状态?
GOTO $+8 ;YES,处理数据调整
CALL BCD_B ;先BCD数据转换成2进制,
INCF INDF,F ;当前地址数据加1
CALL B_BCD ;再将2进制数据转换成BCD码,写如该单元
;判断调整到上限?
MOVFW DATA_INC ;
XORWF INDF,W ;判断当前地址数据变量大小
BTFSC STATUS,Z ;/
CLRF INDF ;/
GOTO MAIN_PROGRAM ;/
;减少键处理=================================================
DECREASE:
CALL DELAY_10MS ;
BTFSS DECREASE_KEY ;检测是否松开减键?
GOTO $-2 ;/
CALL DELAY_10MS ;
BTFSS FLAG_SETUP ;检测是否已进入设置状态?
GOTO $+7 ;YES,处理数据调整
CALL BCD_B ;BCD码转2进制
MOVF INDF,W ;
BTFSC STATUS,Z ;判断下限减到0?
GOTO MAIN_PROGRAM ;/
DECF INDF,F ;
CALL B_BCD ;2进制转BCD码
GOTO MAIN_PROGRAM ;返回主程序
;====二进制转BCD================
B_BCD:
MOVF INDF,W
MOVWF TEMP1
CLRF INDF
LOOP:
MOVLW .10
SUBWF TEMP1,F
BTFSS STATUS,C
GOTO OVER
MOVLW 10H
ADDWF INDF,F
GOTO LOOP
OVER:
ADDWF TEMP1,W
ADDWF INDF,F
RETLW 0
;====BCD转二进制==================
BCD_B:
SWAPF INDF,W
ANDLW 0FH
MOVWF TEMP1
MOVLW 0FH
ANDWF INDF,F
BCF STATUS,C
RLF TEMP1,W
RLF TEMP1,F
RLF TEMP1,F
RLF TEMP1,F
ADDWF TEMP1,W
ADDWF INDF,F
RETLW 0
;...........Program Initialization........................................
;子程序名:
;功 能:启动DS1302开始计时
;功能说明:
;............................................................................
QINDON_INIT
BCF T_CLK ;
BCF T_RST ;先禁止
MOVLW B'10000000' ;发送写使能寄存器命令
MOVWF DS1302_TX ;
;B7必须为1
BSF T_RST ;
CALL SEND_BYTE ;->发送一个字节数据
BCF SEC,7
MOVFW SEC ;允许写使能命令
MOVWF DS1302_TX ;/
CALL SEND_BYTE ;->发送一个字节的数据
BCF T_RST ;->DS1302复位
RETURN ;
;...........Program Initialization........................................
;子程序名:
;功 能:写DS1302初始数据
;功能说明:写入10年09月19日10时05分00秒
;............................................................................
DATE_INIT:
MOVLW B'00000000' ;B7=0表示启动时钟震荡,B7=1表示暂停时钟震荡
MOVWF SEC ;/B6~B4表示秒十位,B3-B0表示秒个位
;秒寄存器 ,BCD码格式,初始00秒
MOVLW 05H ;
MOVWF MINUTE ;/
;分钟寄存器,BCD码格式,00-59
MOVLW B'00010000' ;B7=0表示24小时方式,B7=1表示12小时方式,当选12小时方式下
MOVWF HOUR ;B6=未用,B5=1表示下午B5=0表示上午,B4=小时高位B3-B0小时低位
;小时寄存器,BCD码格式,00-59
MOVLW 19H
MOVWF DATE ;日
;日期寄存器,BCD码格式,00-31
MOVLW 09H
MOVWF MONTH ;月
;月份寄存器,BCD码格式,00-12
MOVLW 07H
MOVWF DAY ;星期
;星期寄存器,BCD码格式,0-7
MOVLW 10H ;
MOVWF YEAR ;年
;年寄存器,BCD码格式,00-99
RETURN
;----------------------------------------------------------------------
;子程序名::DS1302_INI
;功 能:初始化1302,先禁止RST,允许写使能
;功能说明:
;---------------------------------------------------------------------------
DS1302_INIT:
BCF T_CLK ;
BCF T_RST ;先禁止
MOVLW B'10001110' ;发送写使能寄存器命令
MOVWF DS1302_TX ;
;B7必须为1,B6=1表示对RAM进行操作B6=0表示读写时钟/日历数据;
;B5~B1为寄存器地址位,B0为0表示写,为1表示读
BSF T_RST ;
CALL SEND_BYTE ;->发送一个字节数据
MOVLW B'00000000' ;允许写使能命令
MOVWF DS1302_TX ;/
;B7=1为写保护,B7=0为写允许,B0~B6=0固定为0
CALL SEND_BYTE ;->发送一个字节的数据
BCF T_RST ;->DS1302复位
;------------------------------
MOVLW B'10010000' ;90H设定充电方式命令
MOVWF DS1302_TX ;写入缓冲
BSF T_RST ;->允许操作DS1302
CALL SEND_BYTE ;/
MOVLW B'10100101' ;->设定为不充电,
MOVWF DS1302_TX ;/限流电阻2KΩ
CALL SEND_BYTE ;
BCF T_RST ;->DS1302复位
RETURN ;
;----------------------------------------------------------------------
;子程序名:SEND_BYTE
;功 能:调用一次发送一个字节的数据
;功能说明:数据从低位开始发送,用于发送1302的控制命令或发送一个数据
;---------------------------------------------------------------------------
SEND_BYTE:
MOVLW D'8' ;写入BIT数
MOVWF BIT_COUNT ;/
SEND_LOOP:
BCF T_IO ;
BCF T_CLK ;->BIT数在T_CLK低电平时变化
BTFSC DS1302_TX,0 ;检测发送缓冲寄存器位0,是1就发1.是0就发0
BSF T_IO ;/
RRF DS1302_TX,F ;向右移1位,为发送下一个BIT准备
BSF T_CLK ;确定发送有效
DECFSZ BIT_COUNT,F ;检测是否发送完8个BIT?
GOTO SEND_LOOP ;<否>继续发送下一位
BCF T_CLK ;<是>返回
RETLW 00H ;发送完8BIT数返回
;----------------------------------------------------------------------
;子程序名:READ_BYTE
;功 能:调用一次读出一个字节的数据
;功能说明:数据从低位开始发送,用于发送1302的控制命令或发送一个数据
;---------------------------------------------------------------------------
READ_BYTE:
BANK1
BSF SET_IO ;I_O 设置为输入
BANK0
NOP
MOVLW D'8' ;读8个BIT数据
MOVWF BIT_COUNT ;/
READ_LOOP:
BCF T_CLK ;下降沿读取
BCF STATUS,C ;
BTFSC T_IO ;接收一个BIT
BSF STATUS,C ;/
RRF DS1302_RX,F
BSF T_CLK ;恢复高电平
DECFSZ BIT_COUNT,F ;检测是否读完8BIT?
GOTO READ_LOOP ;-><否>循环读出
BANK1
BCF SET_IO ;I_O恢复为输出
BANK0
BCF T_CLK
RETURN
NOP
;**********************************************************
;子程序名:READ_DS1302
;功 能:突发模式读DS1302
;说 明:1.FLAG_RAM=1 读RAM14个字节定时数据
; 2.FLAG_RAM=0 读7个字节日历/时钟数据
;**********************************************************
READ_DS1302:
BSF T_RST ;-启动DS1302
MOVLW B'10111111' ;->ON,读日历/时钟突发模式命令多字节
MOVWF DS1302_TX ;->写入发送寄存器
CALL SEND_BYTE ;->发送
MOVLW SEC ;->ON,准备接收DS1302时钟数据的首地址
MOVWF FSR ;写入间接寻址寄存器
MOVLW D'7' ;->,ON,1次读出7个字节日历/时钟数据
MOVWF BYTE_COUNT ;->写入字节计数器
READ_BIT
CALL READ_BYTE
MOVF DS1302_RX,W ;<是>将8BIT数据写入数据保存处
MOVWF INDF ;/
INCF FSR,F ;数据保存处地址加1,为下一个数据提供地址
DECFSZ BYTE_COUNT,F ;检测是否读完数据?
GOTO READ_BIT ;->否,循环
BCF T_RST ;->DS1302复位,禁止操作
RETURN ;读完7个日历/时钟数据,返回
;**********************************************************
;子程序名:WRITE_DS1302
;功 能:突发模式写DS1302
;说 明:1.定时标志FLAG_TIMER=1 写14个字节定时数据->RAM
; 2.定时标志FLAG_TIMER=0 写7个字节日历/时钟数据/写使能命令
;**********************************************************
WRITE_DS1302:
MOVLW B'10111110' ;->ON,写时钟多字节命令
MOVWF DS1302_TX ;
BSF T_RST ; 发送突发模式写时钟命令
CALL SEND_BYTE ;/
;--------------------------------
;BCF T_CLK ;
;BCF T_IO ;
MOVLW SEC ;->ON,准备写时钟/日历数据首地址
MOVWF FSR ;
MOVLW D'8' ;->ON,准备写时钟的字节数
MOVWF BYTE_COUNT ;/
WRITE_BYTE:
MOVF INDF,W ;拷贝地址数据内容到发送缓冲
MOVWF DS1302_TX ;/
CALL SEND_BYTE
INCF FSR,F ;->数据发送地址加1,为下一个数据提供地址
DECFSZ BYTE_COUNT,F ;检测是否写完数据?
GOTO WRITE_BYTE ;
BCF T_RST ;->DS1302复位,禁止操作
RETURN ;写完数据,返回
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;子程序名:显示LED
;功 能:
;功能说明:
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PLAY_SEC:
;显示秒闪烁~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BTFSS FLAG_500MS ;检测闪烁频率
GOTO $+3 ;/
BSF SEC_LED ;
RETURN
BCF SEC_LED ;
RETURN
;====================================
;显示分L位MLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMMLMLMLMLM
PLAY_MINUTE_L:
BSF MINL_LED ;
BTFSS FLAG_MINUTE ;->检测是否要闪烁当前单元?
GOTO $+3 ;
BTFSS FLAG_250MS ;检测闪烁频率
GOTO $+0AH ;/
MOVF SHOW_MIN,W ;
ANDLW 0FH ;
CALL TABLE ;
MOVWF DIO_C ;
BTFSS FLAG_DAY
GOTO $+3 ;判断指示灯是否点亮
MOVLW B'00100000'
ADDWF DIO_C,F
RETURN
BTFSS FLAG_DAY ;指示灯不跟着闪烁
GOTO $+4
MOVFW DIO_C
XORLW B'00100000'
MOVWF DIO_C
RETURN
;显示分H位MHMHMHMHMHMHMHMHMHMHMHMHMHMHMH
PLAY_MINUTE_H:
BSF MINH_LED ;
BTFSS FLAG_MINUTE ;->检测是否要闪烁当前单元?
GOTO $+3 ;
BTFSS FLAG_250MS ;检测闪烁频率
GOTO $+0AH ;/
SWAPF SHOW_MIN,W ;
ANDLW 0FH ;
CALL TABLE ;
MOVWF DIO_C ;
BTFSS FLAG_YEAR
GOTO $+3
MOVLW B'00100000'
ADDWF DIO_C,F
RETURN
BTFSS FLAG_YEAR
GOTO $+4
MOVFW DIO_C
XORLW B'00100000'
MOVWF DIO_C
RETURN
;显示时L位HLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHL
PLAY_HOUR_L:
BSF HOUL_LED ;
BTFSS FLAG_HOUR ;->检测是否要闪烁当前单元?
GOTO $+3 ;
BTFSS FLAG_250MS ;检测闪烁频率
GOTO $+0AH ;/
MOVF SHOW_HOU,W
ANDLW 0FH ;
CALL TABLE ;
MOVWF DIO_C ;
BTFSS FLAG_DATE
GOTO $+3
MOVLW B'00100000'
ADDWF DIO_C,F
RETURN
BTFSS FLAG_DATE
GOTO $+4
MOVFW DIO_C
XORLW B'00100000'
MOVWF DIO_C
RETURN
;显示时H位HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
PLAY_HOUR_H:
BSF HOUH_LED ;
BTFSS FLAG_HOUR ;->检测是否要闪烁当前单元?
GOTO $+3 ;
BTFSS FLAG_250MS ;检测闪烁频率
GOTO $+0AH ;/
SWAPF SHOW_HOU,W ;
ANDLW 0FH ;
CALL TABLE ;
MOVWF DIO_C ;
BTFSS FLAG_TIME
GOTO $+3
MOVLW B'00100000'
ADDWF DIO_C,F
RETURN
BTFSS FLAG_TIME
GOTO $+4
MOVFW DIO_C
XORLW B'00100000'
MOVWF DIO_C
RETURN
; 以下为延时子程序 *******************************
DELAY_10MS
MOVLW D'205' ;
MOVWF C2
MOVLW D'32' ;
MOVWF C1
DECFSZ C1,F
GOTO $-1
DECFSZ C2,F
GOTO $-5
RETURN
DELAY250MS
MOVLW D'3' ;
MOVWF C3
MOVLW D'255' ;
MOVWF C2
MOVLW D'255' ;
MOVWF C1
DECFSZ C1,F
GOTO $-1
DECFSZ C2,F
GOTO $-5
DECFSZ C3,F
GOTO $-9
RETURN
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
END
一周热门 更多>