PIC单片机多功能万学年历电子钟.docx
《PIC单片机多功能万学年历电子钟.docx》由会员分享,可在线阅读,更多相关《PIC单片机多功能万学年历电子钟.docx(14页珍藏版)》请在冰豆网上搜索。
![PIC单片机多功能万学年历电子钟.docx](https://file1.bdocx.com/fileroot1/2023-1/7/35a8869a-12f1-45b5-a6c7-93a290ce6a53/35a8869a-12f1-45b5-a6c7-93a290ce6a531.gif)
PIC单片机多功能万学年历电子钟
PIC单片机-多功能万年历电子钟
;*********************************************************************************
LISTP=PIC16F72
#INCLUDE
;********************************************************************************
#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
;*******************宏定义*********************************
BANK1MACRO ;体1
BSR STATUS,RP0
BCR STATUS,RP1
ENDM
BANK0MACRO ;体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