PIC单片机-多功能万年历电子钟_第1页
PIC单片机-多功能万年历电子钟_第2页
PIC单片机-多功能万年历电子钟_第3页
PIC单片机-多功能万年历电子钟_第4页
PIC单片机-多功能万年历电子钟_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PIC单片机-多功能万年历电子钟;* LIST P=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 ;数码管位选#D

2、EFINE 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,

3、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_

4、DAY FLAG1,6 ;#DEFINE FLAG_DATA FLAG1,5 ;*寄存器定义*ID_TEMP EQU 72HW_TEMP EQU 73HSTATUS_TEMP EQU 74HPCLATH_TEMP EQU 75HERRORLEVEL -302CBLOCK 020H SEC ;秒寄存器 MINUTE ;分寄存器 HOUR ;小时寄存器 DATE ;日寄存器 MONTH ;月寄存器 DAY ;星期寄存器 YEAR ;年寄存器 WRITE_ENABLED ;写使能寄存器 DS1302_RX ;保存接受的1个数据 DS1302_TX ;准备写入到DS1302的一个数据 BYTE_COU

5、NT ;字节数寄存器 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 ENDMBANK0 MACRO ;体0 BCR

6、 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 ;每

7、到250MS取反一次标志位1 XORWR FLAG,F ;/ CLRR TIMER0 INCR TIMER1,F ; LDWI .2 ; XORWR TIMER1,W ;判断是否到500MS BTSS STATUS,Z ;/ LJUMP AAA ;ON, LDWI B ;每到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 ;D

8、P_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 LJU

9、MP $+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 BT

10、SS FSR,7 LJUMP $-3 RTIW 00H ;-;子程序名:;功 能:查表子程序;功能说明:用于显示0-9时钟数据字型码,共阳LED无小数点;- TABLE: ADDWR PCL,F RTIW B ;0 RTIW B ;1 RTIW B ;2 RTIW B ;3 RTIW B ;4 RTIW B ;5 RTIW B ;6 RTIW B ;7 RTIW B ;8 RTIW B ;9 ;.Program Initialization. ;子程序名: 单片机复位进入点 ;功 能:;功能说明:;. PORT_INIT: CLRR INTCON ;清除中断 BANK1 ; LDWI B ;

11、STWR SIO_C ;RC口设为输出 LDWI B ; STWR SIO_B ;/RB口设为输入 LDWI B ; STWR SIO_A ; LDWI 06H ; STWR ADCON1 ;A口配置为普通数字I/O LDWI B ; 设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 ;开TMR0中断使能位 STWR INTCON ;/ LCALL

12、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 ;

13、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 ; XORWI B ;检测是否有按键按下? BTSC S

14、TATUS,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 ;时间

15、设置键处理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 S

16、HOW_MIN STWR FSR ;调整单元地址 LDWI 60H STWR DATA_INC ;调整最大值 BSR FLAG_MINUTE BCR FLAG_HOURDEC_MON LDWI 02H ; XORWR COUNT2,W BTSS STATUS,Z LJUMP DEC_DATE ;03H BSR FLAG_HOUR BCR FLAG_MINUTE BSR FLAG_DATE BCR FLAG_TIMEDEC_DATE LDWI 03H ; XORWR COUNT2,W BTSS STATUS,Z LJUMP DEC_YEAR ;04H LDWI SHOW_MIN STWR FSR

17、 ;调整单元地址 LDWI 32H STWR DATA_INC ;调整最大值 BSR FLAG_MINUTE BCR FLAG_HOURDEC_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_DATEDEC_DAY LDWI 05H ; XORWR COUNT2,W BTSS STATUS,Z LJUMP DEC_END ;06H LDWI SHOW_MIN

18、 STWR FSR ;调整单元地址 LDWI 08H STWR DATA_INC ;调整最大值 BSR FLAG_MINUTE BCR FLAG_HOUR BSR FLAG_DAY BCR FLAG_YEARDEC_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 ;写入

19、设置的数据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 ;判

20、断当前地址数据变量大小 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 I

21、NDF,F ; LCALL B_BCD ;2进制转BCD码 LJUMP MAIN_PROGRAM ;返回主程序 ;.Program Initialization. ;子程序名: ;功 能:启动DS1302开始计时;功能说明:;.QINDON_INIT BCR T_CLK ; BCR T_RST ;先禁止 LDWI B ;发送写使能寄存器命令 STWR DS1302_TX ; ;B7必须为1 BSR T_RST ; LCALL SEND_BYTE ;-发送一个字节数据 BCR SEC,7 MOVFW SEC ;允许写使能命令 STWR DS1302_TX ;/ LCALL SEND_BYTE ;

22、-发送一个字节的数据 BCR T_RST ;-DS1302复位 RET ;.Program Initialization. ;子程序名: ;功 能:写DS1302初始数据;功能说明:写入10年09月19日10时05分00秒;.DATE_INIT: LDWI B ;B7=0表示启动时钟震荡,B7=1表示暂停时钟震荡 STWR SEC ;/B6B4表示秒十位,B3-B0表示秒个位 ;秒寄存器 ,BCD码格式,初始00秒 LDWI 05H ; STWR MINUTE ;/ ;分钟寄存器,BCD码格式,00-59 LDWI B ;B7=0表示24小时方式,B7=1表示12小时方式,当选12小时方式下

23、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_I

24、NIT: BCR T_CLK ; BCR T_RST ;先禁止 LDWI B ;发送写使能寄存器命令 STWR DS1302_TX ; ;B7必须为1,B6=1表示对RAM进行操作B6=0表示读写时钟/日历数据;B5B1为寄存器地址位,B0为0表示写,为1表示读 BSR T_RST ; LCALL SEND_BYTE ;-发送一个字节数据 LDWI B ;允许写使能命令 STWR DS1302_TX ;/;B7=1为写保护,B7=0为写允许,B0B6=0固定为0 LCALL SEND_BYTE ;-发送一个字节的数据 BCR T_RST ;-DS1302复位;- LDWI B ;90H设定充电

25、方式命令 STWR DS1302_TX ;写入缓冲 BSR T_RST ;-允许操作DS1302 LCALL SEND_BYTE ; BCR T_RST ;-DS1302复位 RET ;- ;子程序名:SEND_BYTE;功 能:调用一次发送一个字节的数据;功能说明:数据从低位开始发送,用于发送1302的控制命令或发送一个数据;- SEND_BYTE: LDWI D8 ;写入BIT数 STWR BIT_COUNT ;/SEND_LOOP: BCR T_IO ; BCR T_CLK ;-BIT数在T_CLK低电平时变化 BTSC DS1302_TX,0 ;检测发送缓冲寄存器位0,是1就发1.是0

26、就发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 D8 ;读8个BI

27、T数据 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 ;-ON,读日历/时钟突发模式命令多字节 STWR DS1302_TX ;-写入发送寄存器 LCALL SEND_BYTE ;-发送 LDWI SEC ;-ON,准备接收DS1302时钟数据的首

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论