PIC16F72+DS1302+0.8寸数码管电子钟

2020-02-08 09:04发布

PIC16F72+DS1302+0.8寸数码管电子钟,1.6mm双面板热转印已制作成功,请大家多多指教。
PCB图

(原文件名:16F72+DS1302.JPG)
实物图改天有相机再补上。

AD6.8画的PCBourdev_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
汇编 看的头痛!

一周热门 更多>