网站地图 | 加入收藏 | English

网站首页 产品列表 软件下载 技术资料 付款方式 发货查询 关于我们 淘宝商城 论坛
搜索 高级/组合搜索
网站新闻
所有新闻
HiFi音响文章
站内新闻
单片机工具资料
汇编程序实例
C语言程序实例
单片机提高资料
单片机初学资料
单片机软件下载
单片机技术资料
  您的位置: 首页 >> 文章列表 >> [原创]PIC单片机-多功能万年历电子钟

[原创]PIC单片机-多功能万年历电子钟


作者:单片机爱好者   转载自:单片机工具之家  发布日期:2011-4-17

;********************************************************************************
;多功能万年历电子钟
;硬件使用:使用串口实时时钟芯片DS1302+4位共阳数码管
;系统时钟:4M XT ,WDT_OFF
;功能:1. 4位LED数码管显示小时,分钟 ,用需要可扩展显示其他信息
;     2. 进入调整状态是数码管DB显示 ,10S未按按键自动退出
;     3. 定时时间到时4位数码管同时闪烁提示, 该路定时LED灭
;作者:明华
;转载:PIC单片机学习网  www.pic16.com
;*********************************************************************************
   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
    BSR       STATUS,RP0
    BCR       STATUS,RP1        
    ENDM
BANK0 MACRO                     ;体0
    BCR       STATUS,RP0
    BCR       STATUS,RP1
    ENDM
;-------------------------------------------------------------------
;子程序名:
;功    能:中断服务主程序入口
;功能说明:
;-----------------------------------------------------------------            
INTERMIT_SERVE:
;---------现场保护-----------------------
    STWR     W_TEMP            ;          
    SWAPR     STATUS,W          ;
    CLRR      STATUS            ;
    STWR     STATUS_TEMP       ; 
    LDR      PCLATH,W          ;
    STWR     PCLATH_TEMP       ;
    CLRR      PCLATH            ;
;-------中断服务-------------------------  
    INCR      TIMER0,F          ;\
    LDWI     .100               ;\
    XORWR     TIMER0,W          ;判断是否到250MS
    BTSS     STATUS,Z          ;/
    LJUMP      AAA               ;ON,
    LDWI     B'00010000'       ;\每到250MS取反一次标志位1
    XORWR     FLAG,F            ;/     
    CLRR      TIMER0
    INCR      TIMER1,F          ;\
    LDWI     .2                ;\
    XORWR     TIMER1,W          ;判断是否到500MS
    BTSS     STATUS,Z          ;/
    LJUMP      AAA               ;ON,
    LDWI     B'00100000'       ;\每到500MS取反一次标志位1
    XORWR     FLAG,F            ;/                 
    CLRR      TIMER1            ;YES,
    INCR      TIMER2,F          ;\
    LDWI     .20               ;\
    XORWR     TIMER2,W          ;判断是否到5S
    BTSS     STATUS,Z          ;/
    LJUMP      $+3               ;/
    CLRR      TIMER2            ;YES,     
    BSR       FLAG_10S          ;
DP_SEC
    LCALL      PLAY_SEC
    MOVFW     DIO_B
    ANDWI     0F0H
    STWR     DIO_B
    CLRR      DIO_C
    INCR      COUNT,F
    LDWI     01H            ;;;;;;;;;;;;;;;;;
    XORWR     COUNT,W
    BTSC     STATUS,Z
    LCALL      PLAY_HOUR_H       ;
    LDWI     02H            ;;;;;;;;;;;;;;;;;;;
    XORWR     COUNT,W
    BTSC     STATUS,Z
    LCALL      PLAY_HOUR_L       ;
    LDWI     03H            ;;;;;;;;;;;;;;;;;;
    XORWR     COUNT,W
    BTSC     STATUS,Z
    LCALL      PLAY_MINUTE_H     ;
    LDWI     04H            ;;;;;;;;;;;;;;;;
    XORWR     COUNT,W
    BTSS     STATUS,Z
    LJUMP      $+3
    CLRR      COUNT
    LCALL      PLAY_MINUTE_L     ;
    LDWI     0D9H              ;\
    STWR     TMR0              ;/写入TMR0初始值
    BCR       INTCON,T0IF       ;清TMR0中断标志
;-------恢复现场-------------------  
    LDR      PCLATH_TEMP,W     ;
    STWR     PCLATH            ;
    SWAPR     STATUS_TEMP,F     ;
    STWR     STATUS            ;
    SWAPR     W_TEMP,F          ;
    SWAPR     W_TEMP,W          ;
    RTFI                      ;中断返回
;.............................................................              
;子程序名: 
;功    能:清寄存器
;功能说明:
;................................................................ 
CLR_RAM:
    LDWI     20H
    STWR     FSR
    CLRR      INDF
    INCR      FSR,F
    BTSS     FSR,7
    LJUMP      $-3
    RTIW     00H
;--------------------------------------------------------------------------
;子程序名:
;功    能:查表子程序
;功能说明:用于显示0-9时钟数据字型码,共阳LED无小数点
;---------------------------------------------------------------------------  
TABLE: 
    ADDWR        PCL,F
    RTIW     B'11001111' ;0
    RTIW     B'00000101' ;1
    RTIW     B'11011100' ;2
    RTIW     B'10011101' ;3
    RTIW     B'00010111' ;4
    RTIW     B'10011011' ;5
    RTIW     B'11011011' ;6
    RTIW     B'00001101' ;7
    RTIW     B'11011111' ;8
    RTIW     B'10011111' ;9
    ;...........Program  Initialization........................................    
;子程序名: 单片机复位进入点 
;功    能:
;功能说明:
;............................................................................   
PORT_INIT:
    CLRR      INTCON            ;清除中断
    BANK1                       ;\
    LDWI     B'00000000'       ;\   
    STWR     SIO_C             ;\RC口设为输出
    LDWI     B'11100000'       ;\   
    STWR     SIO_B             ;/RB口设为输入
    LDWI     B'11111000'       ;\   
    STWR     SIO_A             ;
    LDWI     06H               ;
    STWR     ADCON1            ;A口配置为普通数字I/O
    LDWI     B'10000101'       ;\ 设TMR0分频1:64
    STWR     OPTION_REG        ;/RB口同时输入、出时不能上拉
    BANK0                       ;
;----------------------------------
    CLRR      DIO_A             ;清控制位
    CLRR      DIO_B
    CLRR      DIO_C             ;\关闭显示
    LDWI     0DAH              ;\写入TMR0初始值
    STWR     TMR0              ;/2.5MS中断一次
    LDWI     B'10100000'       ;\开TMR0中断使能位
    STWR     INTCON            ;/    
    LCALL      CLR_RAM           ;->清寄存器
    LCALL      DS1302_INIT       ;->初始化DS1302
    LCALL      READ_DS1302       ;
    ;CALL      DATE_INIT          ;\
    ;CALL      WRITE_DS1302       ;/写数据
    LCALL      QINDON_INIT
    MOVFW     DATE
    STWR     DATEP
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%             
;程序名:
;功    能:
;功能说明:
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MAIN_PROGRAM:
    BTSC     FLAG_SETUP
    LJUMP      $+3
    ;NOP
    ;NOP
    LCALL      DELAY250MS       
    LCALL      READ_DS1302      ;
    BTSS     FLAG_10S          ;检测是否到5S
    LJUMP      $+3               ;
    CLRR      FLAG              ;3S到,退出校正时间状态
    CLRR      FLAG1             ;
    MOVFW     DATE
    XORWR     DATEP,W
    BTSC     STATUS,Z
    LJUMP      TEST_KEY
    LDWI     030H
    SUBWR     SEC,W
    BTSS     STATUS,Z  
    LJUMP      TEST_KEY          ;->检测按键
    LDWI     005H
    SUBWR     SEC,F
    LCALL      WRITE_DS1302      ;写入设置的数据
    MOVFW     DATE
    STWR     DATEP       
    LJUMP      MAIN_PROGRAM      ;循环
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TEST_KEY:
    NOP                         ;\
    LDR      DIO_A,W           ;\
    ANDWI     B'00111000'       ;\
    XORWI     B'00111000'       ;检测是否有按键按下?
    BTSC     STATUS,Z          ;/
    LJUMP      MAIN_PROGRAM      ;/
    BCR       FLAG_10S          ;YES,重新启动5S到标记
    CLRR      TIMER2            ;/
;------------------------------------------------------
    BTSC     FLAG_DATA         ;显示日期时禁止调整
    LJUMP      MAIN_PROGRAM      ;/ 
    BTSS     SETUP_KEY         ;检测是否按时间设置键?
    LJUMP      SETUP             ;YES,跳设置键处理程序     
    BTSS     INCREASE_KEY      ;检测是否按增键?
    LJUMP      INCREASE          ;YES,
    BTSS     DECREASE_KEY      ;检测是否按减键?
    LJUMP      DECREASE          ;YES,
    LJUMP      MAIN_PROGRAM      ;
;时间设置键处理--------------------
SETUP:
    LCALL      DELAY_10MS        ;\
    BTSS     SETUP_KEY         ;检测设置键是否松开?
    LJUMP      $-2               ;/ 
    LCALL      DELAY_10MS        ;   
    LDWI     SHOW_HOU              ;
    STWR     FSR               ;第一个调整单元
    LDWI     24H
    STWR     DATA_INC          ;调整最大值
    BSR       FLAG_SETUP
    BSR       FLAG_HOUR
    BSR       FLAG_TIME
    LJUMP      TEST_KEY     
DEC_MIN:
    INCR      COUNT2,F
    LDWI     01H         ;;;;;;;;;;;;;;;;;;;;;;;
    XORWR     COUNT2,W
    BTSS     STATUS,Z
    LJUMP      DEC_MON           ;02H
    LDWI     SHOW_MIN
    STWR     FSR               ;调整单元地址
    LDWI     60H
    STWR     DATA_INC          ;调整最大值
    BSR       FLAG_MINUTE
    BCR       FLAG_HOUR
DEC_MON
    LDWI     02H         ;;;;;;;;;;;;;;;;;;
    XORWR     COUNT2,W
    BTSS     STATUS,Z
    LJUMP      DEC_DATE          ;03H
    BSR       FLAG_HOUR
    BCR       FLAG_MINUTE
    BSR       FLAG_DATE
    BCR       FLAG_TIME
DEC_DATE
    LDWI     03H         ;;;;;;;;;;;;;;;;;;;
    XORWR     COUNT2,W
    BTSS     STATUS,Z
    LJUMP      DEC_YEAR          ;04H
    LDWI     SHOW_MIN
    STWR     FSR               ;调整单元地址
    LDWI     32H
    STWR     DATA_INC          ;调整最大值
    BSR       FLAG_MINUTE
    BCR       FLAG_HOUR
DEC_YEAR
    LDWI     04H         ;;;;;;;;;;;;;;;;;;
    XORWR     COUNT2,W
    BTSS     STATUS,Z
    LJUMP      DEC_DAY           ;05H
    MOVFW     SHOW_HOU
    STWR     MONTH
    MOVFW     SHOW_MIN
    BCR       FLAG_MINUTE
    BSR       FLAG_YEAR
    BCR       FLAG_DATE
DEC_DAY
    LDWI     05H         ;;;;;;;;;;;;;;;;;;;
    XORWR     COUNT2,W
    BTSS     STATUS,Z
    LJUMP      DEC_END           ;06H
    LDWI     SHOW_MIN
    STWR     FSR               ;调整单元地址
    LDWI     08H
    STWR     DATA_INC          ;调整最大值
    BSR       FLAG_MINUTE
    BCR       FLAG_HOUR
    BSR       FLAG_DAY
    BCR       FLAG_YEAR
DEC_END
    LDWI     06H         ;;;;;;;;;;;;;;;;;;;
    XORWR     COUNT2,W
    BTSS     STATUS,Z
    LJUMP      DEC1              ;
    MOVFW     SHOW_HOU
    STWR     YEAR
    MOVFW     SHOW_MIN
    STWR     DAY
    CLRR      COUNT2            ;清
    BCR       FLAG_SETUP        ;清标示
    BCR       FLAG_DAY
    BCR       FLAG_MINUTE
    LCALL      WRITE_DS1302      ;写入设置的数据
DEC1
    LJUMP      TEST_KEY          ;
;增加键处理++++++++++++++++++++++++++++++++++++++++++++++++  
INCREASE:
    LCALL      DELAY_10MS        ;\
    BTSS     INCREASE_KEY      ; 检测是否松开加键?
    LJUMP      $-2               ;/
    LCALL      DELAY_10MS        ;
    BTSS     FLAG_SETUP        ;检测是否已进入设置状态?
    LJUMP      $+8               ;YES,处理数据调整            
    LCALL      BCD_B             ;先BCD数据转换成2进制,
    INCR      INDF,F            ;当前地址数据加1
    LCALL      B_BCD             ;再将2进制数据转换成BCD码,写如该单元
;判断调整到上限? 
    MOVFW     DATA_INC          ;\
    XORWR     INDF,W            ;\判断当前地址数据变量大小
    BTSC     STATUS,Z          ;/
    CLRR      INDF              ;/
    LJUMP      MAIN_PROGRAM      ;/
;减少键处理=================================================  
DECREASE:
    LCALL      DELAY_10MS        ;\
    BTSS     DECREASE_KEY      ;检测是否松开减键?
    LJUMP      $-2               ;/ 
    LCALL      DELAY_10MS        ;
    BTSS     FLAG_SETUP        ;检测是否已进入设置状态?
    LJUMP      $+7               ;YES,处理数据调整
    LCALL      BCD_B             ;BCD码转2进制  
    LDR      INDF,W            ;\
    BTSC     STATUS,Z          ;判断下限减到0? 
    LJUMP      MAIN_PROGRAM      ;/
    DECR      INDF,F            ;
    LCALL      B_BCD             ;2进制转BCD码  
    LJUMP      MAIN_PROGRAM      ;返回主程序   
;...........Program  Initialization........................................    
;子程序名:  
;功    能:启动DS1302开始计时
;功能说明:
;............................................................................
QINDON_INIT
    BCR       T_CLK             ;\
    BCR       T_RST             ;先禁止
    LDWI     B'10000000'       ;发送写使能寄存器命令
    STWR     DS1302_TX         ; 
;B7必须为1
    BSR       T_RST             ;
    LCALL      SEND_BYTE         ;->发送一个字节数据
    BCR       SEC,7
    MOVFW     SEC               ;\允许写使能命令
    STWR     DS1302_TX         ;/     
    LCALL      SEND_BYTE         ;->发送一个字节的数据
    BCR       T_RST             ;->DS1302复位
    RET                      ;
;...........Program  Initialization........................................    
;子程序名:  
;功    能:写DS1302初始数据
;功能说明:写入10年09月19日10时05分00秒
;............................................................................
DATE_INIT:  
    LDWI     B'00000000'       ;\B7=0表示启动时钟震荡,B7=1表示暂停时钟震荡
    STWR     SEC               ;/B6~B4表示秒十位,B3-B0表示秒个位    
;秒寄存器 ,BCD码格式,初始00秒     
    LDWI     05H               ;\
    STWR     MINUTE            ;/     
;分钟寄存器,BCD码格式,00-59 
    LDWI     B'00010000'       ;B7=0表示24小时方式,B7=1表示12小时方式,当选12小时方式下
    STWR     HOUR              ;B6=未用,B5=1表示下午B5=0表示上午,B4=小时高位B3-B0小时低位
;小时寄存器,BCD码格式,00-59
    LDWI     19H
    STWR     DATE              ;日
;日期寄存器,BCD码格式,00-31
    LDWI     09H
    STWR     MONTH             ;月
;月份寄存器,BCD码格式,00-12
    LDWI     07H
    STWR     DAY               ;星期
;星期寄存器,BCD码格式,0-7
    LDWI     10H               ;
    STWR     YEAR              ;年
;年寄存器,BCD码格式,00-99     
    RET               
;----------------------------------------------------------------------         
;子程序名::DS1302_INI
;功    能:初始化1302,先禁止RST,允许写使能
;功能说明:
;---------------------------------------------------------------------------
DS1302_INIT:
    BCR       T_CLK            ;\
    BCR       T_RST            ;先禁止
    LDWI     B'10001110'      ;发送写使能寄存器命令
    STWR     DS1302_TX        ; 
;B7必须为1,B6=1表示对RAM进行操作B6=0表示读写时钟/日历数据;
;B5~B1为寄存器地址位,B0为0表示写,为1表示读
    BSR       T_RST            ;
    LCALL      SEND_BYTE        ;->发送一个字节数据  
    LDWI     B'00000000'      ;\允许写使能命令
    STWR     DS1302_TX        ;/
;B7=1为写保护,B7=0为写允许,B0~B6=0固定为0     
    LCALL      SEND_BYTE        ;->发送一个字节的数据
    BCR       T_RST            ;->DS1302复位
;------------------------------   
    LDWI     B'10010000'      ;\90H设定充电方式命令
    STWR     DS1302_TX        ;写入缓冲
    BSR       T_RST            ;->允许操作DS1302
    LCALL      SEND_BYTE        ;
    BCR       T_RST            ;->DS1302复位
    RET                     ;
;----------------------------------------------------------------------         
;子程序名:SEND_BYTE
;功    能:调用一次发送一个字节的数据
;功能说明:数据从低位开始发送,用于发送1302的控制命令或发送一个数据
;---------------------------------------------------------------------------
SEND_BYTE:
    LDWI     D'8'             ;\写入BIT数
    STWR     BIT_COUNT        ;/
SEND_LOOP: 
    BCR       T_IO             ;
    BCR       T_CLK            ;\->BIT数在T_CLK低电平时变化
    BTSC     DS1302_TX,0      ;检测发送缓冲寄存器位0,是1就发1.是0就发0
    BSR       T_IO             ;/    
    RRR       DS1302_TX,F      ;向右移1位,为发送下一个BIT准备
    BSR       T_CLK            ;确定发送有效
    DECRSZ    BIT_COUNT,F      ;检测是否发送完8个BIT?
    LJUMP      SEND_LOOP        ;<否>继续发送下一位
    BCR       T_CLK            ;<是>返回
    RTIW     00H              ;发送完8BIT数返回
;----------------------------------------------------------------------         
;子程序名:READ_BYTE
;功    能:调用一次读出一个字节的数据
;功能说明:数据从低位开始发送,用于发送1302的控制命令或发送一个数据
;---------------------------------------------------------------------------
READ_BYTE:
    BANK1
    BSR       SET_IO           ;I_O 设置为输入
    BANK0
    NOP
    LDWI     D'8'             ;\读8个BIT数据
    STWR     BIT_COUNT        ;/
READ_LOOP: 
    BCR       T_CLK            ;下降沿读取
    BCR       STATUS,C         ;\
    BTSC     T_IO             ;接收一个BIT
    BSR       STATUS,C         ;/
    RRR       DS1302_RX,F
    BSR       T_CLK            ;恢复高电平
    DECRSZ    BIT_COUNT,F      ;检测是否读完8BIT?
    LJUMP      READ_LOOP        ;-><否>循环读出
    BANK1
    BCR       SET_IO           ;I_O恢复为输出
    BANK0
    BCR       T_CLK
    RET
    NOP
;**********************************************************
;子程序名:READ_DS1302
;功    能:突发模式读DS1302
;说    明:1.FLAG_RAM=1 读RAM14个字节定时数据  
;         2.FLAG_RAM=0 读7个字节日历/时钟数据                 
;**********************************************************
READ_DS1302: 
    BSR       T_RST            ;-启动DS1302
    LDWI     B'10111111'      ;->ON,读日历/时钟突发模式命令多字节
    STWR     DS1302_TX        ;->写入发送寄存器        
    LCALL      SEND_BYTE        ;->发送      
    LDWI     SEC              ;->ON,准备接收DS1302时钟数据的首地址        
    STWR     FSR              ;写入间接寻址寄存器
    LDWI     D'7'             ;->,ON,1次读出7个字节日历/时钟数据       
    STWR     BYTE_COUNT       ;->写入字节计数器
READ_BIT 
    LCALL      READ_BYTE    
    LDR      DS1302_RX,W      ;\<是>将8BIT数据写入数据保存处
    STWR     INDF             ;/
    INCR      FSR,F            ;数据保存处地址加1,为下一个数据提供地址       
    DECRSZ    BYTE_COUNT,F     ;检测是否读完数据?
    LJUMP      READ_BIT         ;->否,循环
    BCR       T_RST            ;->DS1302复位,禁止操作
    RET                     ;读完7个日历/时钟数据,返回    
;**********************************************************
;子程序名:WRITE_DS1302
;功    能:突发模式写DS1302
;说    明:1.定时标志FLAG_TIMER=1  写14个字节定时数据->RAM
;         2.定时标志FLAG_TIMER=0  写7个字节日历/时钟数据/写使能命令                   
;**********************************************************
WRITE_DS1302:
    LDWI     B'10111110'      ;->ON,写时钟多字节命令
    STWR     DS1302_TX        ;\
    BSR       T_RST            ; 发送突发模式写时钟命令
    LCALL      SEND_BYTE        ;/
;--------------------------------                   
    ;BCF       T_CLK            ;
    ;BCF       T_IO             ;
    LDWI     SEC              ;->ON,准备写时钟/日历数据首地址
    STWR     FSR              ; 
    LDWI     D'8'             ;->ON,准备写时钟的字节数
    STWR     BYTE_COUNT       ;/
WRITE_BYTE:
    LDR      INDF,W           ;\拷贝地址数据内容到发送缓冲
    STWR     DS1302_TX        ;/      
    LCALL      SEND_BYTE
    INCR      FSR,F            ;->数据发送地址加1,为下一个数据提供地址
    DECRSZ    BYTE_COUNT,F     ;检测是否写完数据?
    LJUMP      WRITE_BYTE      ;       
    BCR       T_RST            ;->DS1302复位,禁止操作
    RET                     ;写完数据,返回                              
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%             
;子程序名:显示LED
;功    能:
;功能说明:
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PLAY_SEC:
;显示秒闪烁~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                 
    BTSS      FLAG_500MS       ;检测闪烁频率
    LJUMP       $+3            ;/
    BSR        SEC_LED         ;
    RET
    BCR        SEC_LED         ;
    RET
;====================================    
;显示分L位MLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMLMMLMLMLMLM 
PLAY_MINUTE_L:    
    BSR        MINL_LED        ;
    BTSS      FLAG_MINUTE      ;->检测是否要闪烁当前单元?
    LJUMP       $+3            ;
    BTSS      FLAG_250MS       ;检测闪烁频率
    LJUMP       $+0AH          ;/
    LDR       SHOW_MIN,W       ;
    ANDWI      0FH             ;
    LCALL       TABLE          ;
    STWR      DIO_C            ;
    ADDWR      DIO_C,F
    RET
    BTSS      FLAG_DAY         ;指示灯不跟着闪烁
    LJUMP       $+4
    MOVFW      DIO_C
    XORWI      B'00100000'
    STWR      DIO_C
    RET
;显示分H位MHMHMHMHMHMHMHMHMHMHMHMHMHMHMH   
PLAY_MINUTE_H:
    BSR        MINH_LED         ;
    BTSS      FLAG_MINUTE       ;->检测是否要闪烁当前单元?
    LJUMP       $+3             ;
    BTSS      FLAG_250MS        ;检测闪烁频率
    LJUMP       $+0AH           ;/
    SWAPR      SHOW_MIN,W       ;
    ANDWI      0FH              ;
    LCALL       TABLE           ;
    STWR      DIO_C             ;
    BTSS      FLAG_YEAR
    BTSS      FLAG_YEAR
    LJUMP       $+4
    MOVFW      DIO_C
    XORWI      B'00100000'
    STWR      DIO_C
    RET
;显示时L位HLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHLHL      
PLAY_HOUR_L:
    BSR        HOUL_LED         ;
    BTSS      FLAG_HOUR         ;->检测是否要闪烁当前单元?
    LJUMP       $+3             ;
    BTSS      FLAG_250MS        ;检测闪烁频率
    LJUMP       $+0AH           ;/
    LDR       SHOW_HOU,W  
    ANDWI      0FH              ;
    LCALL       TABLE           ;
    STWR      DIO_C             ;
    MOVFW      DIO_C
    XORWI      B'00100000'
    STWR      DIO_C
    RET 
;显示时H位HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH        
PLAY_HOUR_H:
    BSR        HOUH_LED         ;
    BTSS      FLAG_HOUR         ;->检测是否要闪烁当前单元?
    LJUMP       $+3             ;
    BTSS      FLAG_250MS        ;检测闪烁频率
    LJUMP       $+0AH           ;/
    SWAPR      SHOW_HOU,W       ;
    ANDWI      0FH              ;
    LCALL       TABLE           ;
    STWR      DIO_C             ;
    MOVFW      DIO_C
    XORWI      B'00100000'
    STWR      DIO_C
    RET
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    
   END
【版权声明】
  1.任何网站转载本站内容必需注明“来源:单片机工具之家”。
  2.本网转载自其它媒体的信息,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。
  3.未经本站明确许可,任何网站不得非法盗链软件下载连接及抄袭本网站原创内容资源。
  4.违反上述声明者,本网将追究其相关法律责任。谢谢!

分享到:
更多


关于我们
网站介绍
联系我们
付款方式
银行汇款
货到付款
发货方式
快递运输
上门自提
售后服务
退换货政策
质保承诺
购买方式
购物流程
在线订购

公司名称:深圳市乾龙盛电子科技有限公司   永久域名:http://www.pic16.net  网站名称:单片机工具之家
公司地址:广东省深圳市宝安区龙华镇民治路牛栏前大厦15楼A1502室  电话:0755-28187975  13715306011  联系人:唐先生
展销柜台:广东省深圳市福田区新亚洲电子二期三楼N3D033室(华强电子世界附件)【查看地图】  联系电话:0755-82543360
:淘宝商店   :qls@cxqmcu.com   :qls@cxqmcu.com
销售点击Q我:243355504 (唐永红)先生   技术支持点击Q我:443935535 (钟先生)
网站版权:单片机工具之家  粤ICP备09028690号