专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC16F887数码管显示10 37 81怎么编写程序 小白求教
2019-03-25 19:07
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
PIC单片机
9061
3
1646
最好有详细程序参考下 现在就显示3个比较少 我想知道多了的话怎么办 显示的数字没有规律排列的 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
dingzy_2002
1楼-- · 2019-03-25 22:44
给你个汇编的吧。用的PIC16F870:驱动LED时钟,里面有相关程序:
;***************************************
; RTC时钟程序
; ()
;***************************************
;CPU=PIC16F870-I/SS,OSC=4MHz
;RTC=DS1302
;***************************************
;程序说明:
;***************************************
;版本: V0
;修改:
;--------------------
;***************************************
;功能预定义:
;管脚定义:
;PORTA:
#DEFINE RTC_DA PORTA,0
#DEFINE RTC_CK PORTA,1
#DEFINE CON_IN PORTA,2
#DEFINE KEY_ADD PORTA,3
#DEFINE KEY_DEC PORTA,4
#DEFINE KEY_ADJ PORTA,5
;PORTB:
;RB0~RB7 LED段位数据输出
;PORTC
#DEFINE COM_3 PORTC,2
#DEFINE COM_4 PORTC,3
#DEFINE COM_2 PORTC,4
#DEFINE COM_1 PORTC,5
#DEFINE COM_0 PORTC,6
#DEFINE RTC_CS PORTC,7
;***************************************
;内存定义;
;*********************************************
; 内存RAM定义
;*********************************************
;EEPROM定义数据寄存器:
EE_ADDR EQU 7BH
#DEFINE EE_DATA EE_ADDR+1
;中断保护寄存器
PCL_TEMP EQU 7DH
#DEFINE W_TEMP PCL_TEMP+1
#DEFINE S_TEMP PCL_TEMP+2
;工作寄存器
R0 EQU 71H
#DEFINE R1 R0+1
#DEFINE R2 R0+2
#DEFINE R3 R0+3
#DEFINE R4 R0+4
#DEFINE R5 R0+5
#DEFINE R6 R0+6
#DEFINE R7 R0+7
;运行用位寄存器定义:
TYPE EQU 20H
#DEFINE SECOND TYPE,0
#DEFINE FLAG_4MS TYPE,1 ;4MS/CYCLE
#DEFINE FLAG_20MS TYPE,2 ;500MS/CYCLE
#DEFINE FLAG_500MS TYPE,3 ;500MS/CYCLE
#DEFINE FRIST_AD TYPE,4
#DEFINE NO_OIL_TEMP TYPE,5
#DEFINE MO_ZERO TYPE,6
#DEFINE ACK_BIT TYPE,7
;--------------------------------------------
;小时计数据寄存器:
#DEFINE TIMER_4MS 0x22 ;每4mS累加数据寄存器
#DEFINE TIMER_20MS 0x23 ;每4mS累加数据寄存器
#DEFINE TIMER_500MS 0x24 ;每500MS累回数据寄存器
;2BH IS END
;LED显示数据:
LED_DATA0 EQU 0x25
LED_DATA1 EQU 0x26
LED_DATA2 EQU 0x27
LED_DATA3 EQU 0x28
LED_DATA4 EQU 0x29
;LED显示状态位:
DISP_STU EQU 0x2A
#DEFINE DISP_YEAR DISP_STU,0
#DEFINE DISP_DATE DISP_STU,1
#DEFINE DISP_HOUR DISP_STU,2
#DEFINE DISP_DAY DISP_STU,3
#DEFINE DISP_SECOND DISP_STU,4
;按键数据:
KEY_ADJ_DATA EQU 0X2B
KEY_ADD_DATA EQU 0X2C
KEY_DEC_DATA EQU 0X2D
;按键数据:
KEY_PUSH EQU 0X2E
#DEFINE KEY_ADJ_DOWN KEY_PUSH,0
#DEFINE KEY_ADD_DOWN KEY_PUSH,1
#DEFINE KEY_DEC_DOWN KEY_PUSH,2
#DEFINE KEY_ADJ_EN KEY_PUSH,3
#DEFINE KEY_ADD_EN KEY_PUSH,4
#DEFINE KEY_DEC_EN KEY_PUSH,5
KEY_STU EQU 5AH
#DEFINE KEY_HOUR KEY_STU,5 ;调整小时
#DEFINE KEY_MINUTES KEY_STU,4 ;调整分钟
#DEFINE KEY_YEAR KEY_STU,3 ;调整年份
#DEFINE KEY_MONTH KEY_STU,2 ;调整月份
#DEFINE KEY_DATE KEY_STU,1 ;调整日期
#DEFINE KEY_DAY KEY_STU,0 ;调整星期
KEY_CHANG EQU 5BH ;RTC数据调整标志寄存器,用于调整后进行存贮操作
#DEFINE YEAR_RUN KEY_CHANG,7 ;闰年标志
#DEFINE KEY_DOWN KEY_CHANG,6 ;按键按下标志
#DEFINE CHANG_HOUR KEY_CHANG,5 ;小时已调整标志
#DEFINE CHANG_MINUTES KEY_CHANG,4 ;分钟已调整标志
#DEFINE CHANG_YEAR KEY_CHANG,3 ;年份已调整标志
#DEFINE CHANG_MONTH KEY_CHANG,2 ;月份已调整标志
#DEFINE CHANG_DATE KEY_CHANG,1 ;日期已调整标志
#DEFINE CHANG_DAY KEY_CHANG,0 ;星期已调整标志
KEY_STEP EQU 5CH ;上次按键值
;RTC显示数据:
RTC_SECOND EQU 50H ;秒数据
#DEFINE RTC_MINUTES RTC_SECOND+1;分钟数据
#DEFINE RTC_HOUR RTC_SECOND+2;小时数据
#DEFINE RTC_DATE RTC_SECOND+3;日期数据
#DEFINE RTC_MONTH RTC_SECOND+4;月份数据
#DEFINE RTC_DAY RTC_SECOND+5;星期数据
#DEFINE RTC_YEAR RTC_SECOND+6;年数据
#DEFINE RTC_SET1 RTC_SECOND+7;写保护(最高位)控制
#DEFINE RTC_SET2 RTC_SECOND+8;涓流充电控制
;58H is end
;RTC读写使命字:
#DEFINE DS1302_SEC_W 0X80
#DEFINE DS1302_SEC_R 0x81;秒读写
#DEFINE DS1302_MIN_W 0X82
#DEFINE DS1302_MIN_R 0X83;分读写
#DEFINE DS1302_HOUR_W 0X84
#DEFINE DS1302_HOUR_R 0X85;时读写
#DEFINE DS1302_DATE_W 0X86
#DEFINE DS1302_DATE_R 0X87;日读写
#DEFINE DS1302_MONTH_W 0X88
#DEFINE DS1302_MONTH_R 0X89;月读写
#DEFINE DS1302_DAY_W 0X8A
#DEFINE DS1302_DAY_R 0X8B;周读写
#DEFINE DS1302_YEAR_W 0X8C
#DEFINE DS1302_YEAR_R 0X8D;年读写
#DEFINE DS1302_SET1_W 0X8E
#DEFINE DS1302_SET1_R 0X8F;配置1读写
#DEFINE DS1302_SET2_W 0X90
#DEFINE DS1302_SET2_R 0X91;配置2读写
;--------------------------------------------
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 程序开始
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LIST P=PIC16F870,W=2
INCLUDE <P16F870.INC>
ORG 00H
NOP
GOTO START
ORG 04H
MOVWF W_TEMP
SWAPF STATUS, W
MOVWF S_TEMP
CLRF STATUS
SWAPF PCLATH, W
MOVWF PCL_TEMP
CLRF PCLATH
BTFSC PIR1,CCP1IF
GOTO CCP1_PROG
INT_END: SWAPF PCL_TEMP, W
MOVWF PCLATH
SWAPF S_TEMP, W
MOVWF STATUS
SWAPF W_TEMP
SWAPF W_TEMP, W
RETFIE
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 查表数据区:
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;**************************************
;月分对应的日期查表程序:
;**************************************
RTC_DATE_SET:
ANDLW 0X0F
ADDWF PCL
RETLW .1 ;空数据
RETLW 0X31 ;1月
RETLW 0X28 ;2月
RETLW 0X31 ;3月
RETLW 0X30 ;4月
RETLW 0X31 ;5月
RETLW 0X30 ;6月
RETLW 0X31 ;7月
RETLW 0X31 ;8月
RETLW 0X30 ;9月
RETLW 0X31 ;10月
RETLW 0X30 ;11月
RETLW 0X31 ;12月
LED_SEG:
ANDLW 0X0F
ADDWF PCL
RETLW 0x50 ;0
RETLW 0xF9 ;1
RETLW 0x94 ;2
RETLW 0xB0 ;3
RETLW 0x39 ;4
RETLW 0x32 ;5
RETLW 0x12 ;6
RETLW 0xF8 ;7
RETLW 0x10 ;8
RETLW 0x30 ;9
RETLW 0x18 ;A
RETLW 0x13 ;b
RETLW 0x97 ;c
RETLW 0x91 ;d
RETLW 0x16 ;E
RETLW 0x1E ;F
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 程序开始
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
START: CALL PIC_INITAL
;关闭液晶屏显示:
;延时200ms
CALL DELAY200MS
;DS1302初始化:
CALL DS1302_INIT
;读取小时计数据:
BSF T1CON,TMR1ON;打开定时器1
; BSF T2CON,TMR2ON;打开定时器2
MOVLW 0C0H
MOVWF INTCON ;允许定时器1/2中断.
;预设置:
BSF DISP_HOUR
BCF COM_0
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 循环程序开始
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
MAIN: BTFSS FLAG_20MS
GOTO MAIN_1
BCF FLAG_20MS
CALL KEY_OPT
CALL LED_OPT
MAIN_1: BTFSS FLAG_500MS
GOTO MAIN
BCF FLAG_500MS
BTFSS KEY_DOWN
CALL DS1302_DATA_READ
MAIN_3:
CLRWDT
GOTO MAIN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;1. 按键运算子程序:
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
KEY_OPT:
BCF STATUS,C
BTFSS KEY_ADJ
BSF STATUS,C
RLF KEY_ADJ_DATA
MOVFW KEY_ADJ_DATA
ADDLW .1
BTFSC STATUS,Z
BSF KEY_ADJ_DOWN
; MOVFW KEY_ADJ_DATA
; BTFSC STATUS,Z
; BTFSS KEY_ADJ_DOWN
; GOTO $+2
; BSF KEY_ADJ_EN
BCF STATUS,C
BTFSS KEY_ADD
BSF STATUS,C
RLF KEY_ADD_DATA
MOVFW KEY_ADD_DATA
ADDLW .1
BTFSC STATUS,Z
BSF KEY_ADD_DOWN
; MOVFW KEY_ADD_DATA
; BTFSC STATUS,Z
; BTFSS KEY_ADD_DOWN
; GOTO $+2
; BSF KEY_ADD_EN
BCF STATUS,C
BTFSS KEY_DEC
BSF STATUS,C
RLF KEY_DEC_DATA
MOVFW KEY_DEC_DATA
ADDLW .1
BTFSC STATUS,Z
BSF KEY_DEC_DOWN
; MOVFW KEY_DEC_DATA
; BTFSC STATUS,Z
; BTFSS KEY_DEC_DOWN
; GOTO $+2
; BSF KEY_DEC_EN
;-------------------------
;1.调整按键
;---------------------------------
KET_ADJ_OPT:
MOVFW KEY_ADJ_DATA
BTFSC STATUS,Z
BTFSS KEY_ADJ_DOWN
GOTO KEY_ADD_OPT
BCF KEY_ADJ_DOWN
;时钟移位及调整:
BTFSS DISP_HOUR
GOTO KEY_ADJ_YEAR
INCF KEY_STEP
MOVLW .1
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_HOUR1
BSF KEY_HOUR
BCF KEY_MINUTES
RETURN
KEY_ADJ_HOUR1:
MOVLW .2
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_HOUR2
BSF KEY_MINUTES
BCF KEY_HOUR
RETURN
KEY_ADJ_HOUR2:
MOVLW .3
SUBWF KEY_STEP,W
BTFSS STATUS,C
RETURN
CLRF KEY_STEP
BCF KEY_MINUTES
BCF KEY_HOUR
BTFSC KEY_DOWN
GOTO RTC_DATA_STORE
RETURN
;年份调整:
KEY_ADJ_YEAR:
BTFSS DISP_YEAR
GOTO KEY_ADJ_DATE
INCF KEY_STEP
MOVLW .1
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_YEAR1
BSF KEY_YEAR
RETURN
KEY_ADJ_YEAR1:
MOVLW .2
SUBWF KEY_STEP,W
BTFSS STATUS,C
RETURN
CLRF KEY_STEP
BCF KEY_YEAR
BTFSC KEY_DOWN
GOTO RTC_DATA_STORE
RETURN
;月日调整:
KEY_ADJ_DATE:
BTFSS DISP_DATE
GOTO KEY_ADJ_DAY
INCF KEY_STEP
MOVLW .1
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_DATE1
BCF KEY_DATE
BSF KEY_MONTH
RETURN
KEY_ADJ_DATE1:
MOVLW .2
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_DATE2
BCF KEY_MONTH
BSF KEY_DATE
RETURN
KEY_ADJ_DATE2:
MOVLW .3
SUBWF KEY_STEP,W
BTFSS STATUS,C
RETURN
CLRF KEY_STEP
BCF KEY_MONTH
BCF KEY_DATE
BTFSC KEY_DOWN
GOTO RTC_DATA_STORE
RETURN
;星期调整:
KEY_ADJ_DAY:
BTFSS DISP_DAY
RETURN
INCF KEY_STEP
MOVLW .1
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_DAY1
BSF KEY_DAY
RETURN
KEY_ADJ_DAY1:
MOVLW .2
SUBWF KEY_STEP,W
BTFSS STATUS,C
RETURN
CLRF KEY_STEP
BCF KEY_DAY
BTFSC KEY_DOWN
GOTO RTC_DATA_STORE
RETURN
;-------------------------
;2.加1调整按键
;---------------------------------
KEY_ADD_OPT:
MOVFW KEY_ADD_DATA
BTFSC STATUS,Z
BTFSS KEY_ADD_DOWN
GOTO KEY_DEC_OPT
BCF KEY_ADD_DOWN
;若无调整项目,则为移位显示年/月日/时间/星期/秒显示内容
MOVFW KEY_STU
BTFSS STATUS,Z
GOTO KEY_ADD_OPT1
RLF DISP_STU
BTFSC DISP_STU,5
BSF DISP_YEAR
MOVLW 0X1F
ANDWF DISP_STU
RETURN
KEY_ADD_OPT1:
BSF KEY_DOWN
;小时累加:
BTFSS KEY_HOUR
GOTO KEY_OPT21
INCF RTC_HOUR,W
CALL DA_OPT
MOVWF RTC_HOUR
XORLW 0X24
BTFSC STATUS,Z
CLRF RTC_HOUR
BSF CHANG_HOUR
RETURN
;分钟累加:
KEY_OPT21:
BTFSS KEY_MINUTES
GOTO KEY_OPT22
INCF RTC_MINUTES,W
CALL DA_OPT
MOVWF RTC_MINUTES
XORLW 0X60
BTFSC STATUS,Z
CLRF RTC_MINUTES
BSF CHANG_MINUTES
RETURN
;年份累加:
KEY_OPT22:
BTFSS KEY_YEAR
GOTO KEY_OPT23
INCF RTC_YEAR,W
CALL DA_OPT
MOVWF RTC_YEAR
BSF CHANG_YEAR
RETURN
;月分累加:
KEY_OPT23:
BTFSS KEY_MONTH
GOTO KEY_OPT24
BSF CHANG_MONTH
INCF RTC_MONTH,W
CALL DA_OPT
MOVWF RTC_MONTH
XORLW 0X13
BTFSS STATUS,Z
RETURN
MOVLW .1
MOVWF RTC_MONTH
RETURN
;日期累加:
KEY_OPT24:
BTFSS KEY_DATE
GOTO KEY_OPT25
CALL RTC_MONTH_DATE
INCF R0,W
CALL DA_OPT
MOVWF R0
;--------对日期进行加1:
BSF CHANG_DATE
INCF RTC_DATE,W
CALL DA_OPT
MOVWF RTC_DATE
XORWF R0,W
BTFSS STATUS,Z
RETURN
MOVLW .1
MOVWF RTC_DATE
RETURN
;星期累加:
KEY_OPT25:
BTFSS KEY_DAY
RETURN
BSF CHANG_DAY
INCF RTC_DAY
MOVLW 07H
ANDWF RTC_DAY
BTFSC STATUS,Z
INCF RTC_DAY
RETURN
;-------------------------
;2.减1调整按键
;---------------------------------
KEY_DEC_OPT:
MOVFW KEY_DEC_DATA
BTFSC STATUS,Z
BTFSS KEY_DEC_DOWN
RETURN
BCF KEY_DEC_DOWN
;若无调整项目,则为移位显示年/月日/时间/星期/秒显示内容
MOVFW KEY_STU
BTFSS STATUS,Z
GOTO KEY_DEC_OPT1
RRF DISP_STU
BTFSC STATUS,C
BSF DISP_SECOND
MOVLW 0X1F
ANDWF DISP_STU
RETURN
KEY_DEC_OPT1:
;小时减少:
BSF KEY_DOWN
BTFSS KEY_HOUR
GOTO KEY_OPT31
BSF CHANG_HOUR
DECF RTC_HOUR,W
CALL DEC_ADJ
MOVWF RTC_HOUR
SUBLW 0X23
BTFSC STATUS,C
RETURN
MOVLW 0X23
MOVWF RTC_HOUR
RETURN
;分钟减少:
KEY_OPT31:
BTFSS KEY_MINUTES
GOTO KEY_OPT32
BSF CHANG_MINUTES
DECF RTC_MINUTES,W
CALL DEC_ADJ
MOVWF RTC_MINUTES
SUBLW 0X59
BTFSC STATUS,C
RETURN
MOVLW 0X59
MOVWF RTC_MINUTES
RETURN
;年份减少:
KEY_OPT32:
BTFSS KEY_YEAR
GOTO KEY_OPT33
BSF CHANG_YEAR
DECF RTC_YEAR,W
CALL DEC_ADJ
MOVWF RTC_YEAR
RETURN
;月份减少:
KEY_OPT33:
BTFSS KEY_MONTH
GOTO KEY_OPT34
BSF CHANG_MONTH
DECF RTC_MONTH,W
CALL DEC_ADJ
MOVWF RTC_MONTH
BTFSC STATUS,Z
GOTO $+4
SUBLW 0X12
BTFSC STATUS,C
RETURN
MOVLW 0X12
MOVWF RTC_MONTH
RETURN
;日期减少:
KEY_OPT34:
BTFSS KEY_DATE
GOTO KEY_OPT35
BSF CHANG_DATE
CALL RTC_MONTH_DATE
DECF RTC_DATE,W
CALL DEC_ADJ
MOVWF RTC_DATE
BTFSC STATUS,Z
GOTO $+4
SUBWF R0,W
BTFSC STATUS,C
RETURN
MOVFW R0
MOVWF RTC_DATE
RETURN
;星期减少:
KEY_OPT35:
BTFSS KEY_DAY
RETURN
BSF CHANG_DAY
DECFSZ RTC_DAY
RETURN
MOVLW .7
MOVWF RTC_DAY
RETURN
;-------------------------
;存贮
;---------------------------------
RTC_DATA_STORE:
BCF KEY_DOWN
;写保护关闭
CLRF R1
MOVLW DS1302_SET1_W
CALL DS1302_RTC_WRITE
BTFSS CHANG_HOUR
GOTO KEY_OPT02
BCF CHANG_HOUR
MOVFW RTC_HOUR
MOVWF R1
MOVLW DS1302_HOUR_W
CALL DS1302_RTC_WRITE
KEY_OPT02:
BTFSS CHANG_MINUTES
GOTO KEY_OPT03
BCF CHANG_MINUTES
CLRF R1
MOVLW DS1302_SEC_W
CALL DS1302_RTC_WRITE
MOVFW RTC_MINUTES
MOVWF R1
MOVLW DS1302_MIN_W
CALL DS1302_RTC_WRITE
KEY_OPT03:
BTFSS CHANG_YEAR
GOTO KEY_OPT04
BCF CHANG_YEAR
MOVFW RTC_YEAR
MOVWF R1
MOVLW DS1302_YEAR_W
CALL DS1302_RTC_WRITE
KEY_OPT04:
BTFSS CHANG_MONTH
GOTO KEY_OPT05
BCF CHANG_MONTH
MOVFW RTC_MONTH
MOVWF R1
MOVLW DS1302_MONTH_W
CALL DS1302_RTC_WRITE
KEY_OPT05:
BTFSS CHANG_DATE
GOTO KEY_OPT06
BCF CHANG_DATE
MOVFW RTC_DATE
MOVWF R1
MOVLW DS1302_DATE_W
CALL DS1302_RTC_WRITE
KEY_OPT06:
BTFSS CHANG_DAY
GOTO KEY_OPT07
BCF CHANG_DAY
MOVFW RTC_DAY
MOVWF R1
MOVLW DS1302_DAY_W
CALL DS1302_RTC_WRITE
KEY_OPT07:
GOTO DS1302_WP_ENABLE
;---------------------------------
DEC_ADJ:
;---------------------------------
CLRF STATUS
MOVWF R7
ADDLW 0X06
BTFSS STATUS,DC
GOTO $+3
MOVLW 0X06
SUBWF R7
MOVFW R7
ADDLW 60H
BTFSS STATUS,C
GOTO $+3
MOVLW 0X60
SUBWF R7
MOVFW R7
RETURN
;---------------------------------
;月分所对应的日期总数查表
;---------------------------------
RTC_MONTH_DATE:
CLRW
BTFSC RTC_MONTH,4
MOVLW .10
ADDWF RTC_MONTH,W
CALL RTC_DATE_SET
MOVWF R0
;进行闰年的日期调整:
XORLW 0X28
BTFSS STATUS,Z
RETURN
;对闰年进行判断:
BCF YEAR_RUN
CLRW
BTFSC RTC_YEAR,4
MOVLW 0X02
ADDWF RTC_YEAR,W
ANDLW 0X03
BTFSS STATUS,Z
RETURN
BSF YEAR_RUN
INCF R0
RETURN
;***************************************
; 十进制转换子程序
;***************************************
DA_OPT: BCF STATUS,RP0
BCF STATUS,RP1
MOVWF R7
ADDLW 06H
BTFSC STATUS,DC
MOVWF R7
MOVF R7,W
ADDLW 60H
BTFSC STATUS,C
MOVWF R7
MOVF R7,W
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;2. LED数据转换子程序:
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LED_OPT:
BTFSS DISP_HOUR
GOTO LED_DISP_DATE
;---------------------------------
;1.时间数据显示
;---------------------------------
BTFSC KEY_HOUR
BTFSS SECOND
GOTO LED_DISP_HOUR1
MOVLW 0XFF
MOVWF LED_DATA0
MOVWF LED_DATA1
GOTO LED_DISP_HOUR2
LED_DISP_HOUR1:
SWAPF RTC_HOUR,W
ANDLW 0X0F
BTFSC STATUS,Z
MOVLW 0XFF
BTFSS STATUS,Z
CALL LED_SEG
MOVWF LED_DATA0
MOVFW RTC_HOUR
CALL LED_SEG
BTFSS SECOND
ANDLW 0XEF
MOVWF LED_DATA1
LED_DISP_HOUR2:
BTFSC KEY_MINUTES
BTFSS SECOND
GOTO LED_DISP_HOUR3
MOVLW 0XFF
MOVWF LED_DATA2
MOVWF LED_DATA3
GOTO LED_DISP_HOUR4
LED_DISP_HOUR3:
SWAPF RTC_MINUTES,W
CALL LED_SEG
BTFSS SECOND
ANDLW 0XEF
MOVWF LED_DATA2
MOVFW RTC_MINUTES
CALL LED_SEG
MOVWF LED_DATA3
LED_DISP_HOUR4:
;根据秒数据,进行时间段位显示
MOVLW 0xFF
MOVWF R1
SWAPF RTC_SECOND,W
ANDLW 0x0F
MOVWF R0
BCF STATUS,C
RRF R0
CLRW
SUBWF R0,W
BTFSS STATUS,Z
GOTO $+3
BCF R1,2 ;T3
GOTO LED_OPT_END
MOVLW 0x01
SUBWF R0,W
BTFSS STATUS,Z
BCF R1,5
BTFSC STATUS,Z
BCF R1,3 ;T4
GOTO LED_OPT_END
;---------------------------------
;2.日期数据显示:
;---------------------------------
LED_DISP_DATE:
BTFSS DISP_DATE
GOTO LED_DISP_YEAR
BTFSC KEY_MONTH
BTFSS SECOND
GOTO LED_DISP_DATE1
MOVLW 0XFF
MOVWF LED_DATA0
MOVWF LED_DATA1
GOTO LED_DISP_DATE2
LED_DISP_DATE1:
SWAPF RTC_MONTH,W
ANDLW 0x0F
BTFSC STATUS,Z
MOVLW 0XFF
BTFSS STATUS,Z
CALL LED_SEG
MOVWF LED_DATA0
MOVFW RTC_MONTH
CALL LED_SEG
MOVWF LED_DATA1
LED_DISP_DATE2:
BTFSC KEY_DATE
BTFSS SECOND
GOTO LED_DISP_DATE3
MOVLW 0XFF
MOVWF LED_DATA2
MOVWF LED_DATA3
GOTO LED_DISP_DATE4
LED_DISP_DATE3:
SWAPF RTC_DATE,W
ANDLW 0x0F
BTFSC STATUS,Z
MOVLW 0XFF
BTFSS STATUS,Z
CALL LED_SEG
MOVWF LED_DATA2
MOVFW RTC_DATE
CALL LED_SEG
MOVWF LED_DATA3
LED_DISP_DATE4:
MOVLW 0XFD
MOVWF R1
GOTO LED_OPT_END
;---------------------------------
;3.年份数据显示:
;---------------------------------
LED_DISP_YEAR:
BTFSS DISP_YEAR
GOTO LED_DISP_DAY
BTFSC KEY_YEAR
BTFSS SECOND
GOTO LED_DISP_YEAR1
MOVLW 0XFF
MOVWF LED_DATA0
MOVWF LED_DATA1
MOVWF LED_DATA2
MOVWF LED_DATA3
GOTO LED_DISP_YEAR2
LED_DISP_YEAR1:
MOVLW 0x94 ;2
MOVWF LED_DATA0
MOVLW 0x50 ;0
MOVWF LED_DATA1
SWAPF RTC_YEAR,W
CALL LED_SEG
MOVWF LED_DATA2
MOVFW RTC_YEAR
CALL LED_SEG
MOVWF LED_DATA3
LED_DISP_YEAR2:
MOVLW 0XFE
MOVWF R1
GOTO LED_OPT_END
;---------------------------------
;4.星期数据显示:
;---------------------------------
LED_DISP_DAY:
BTFSS DISP_DAY
GOTO LED_DISP_SECOND
MOVLW 0x91 ;d
MOVWF LED_DATA0
MOVLW 0xBF ;-
MOVWF LED_DATA1
MOVLW 0XFF
MOVWF LED_DATA2
BTFSC KEY_DAY
BTFSS SECOND
GOTO LED_DISP_DAY1
MOVLW 0XFF
MOVWF LED_DATA3
GOTO LED_DISP_DAY2
LED_DISP_DAY1:
MOVFW RTC_DAY
MOVWF R0
INCF R0
BTFSS R0,3
DECF R0
MOVFW R0
CALL LED_SEG
MOVWF LED_DATA3
LED_DISP_DAY2:
MOVLW 0X7F
MOVWF R1
GOTO LED_OPT_END
;---------------------------------
;5.秒数据显示:
;---------------------------------
LED_DISP_SECOND:
MOVLW 0xFF
MOVWF LED_DATA0
MOVLW 0XEF
MOVWF LED_DATA1
SWAPF RTC_SECOND,W
CALL LED_SEG
ANDLW 0XEF
MOVWF LED_DATA2
MOVFW RTC_SECOND
CALL LED_SEG
MOVWF LED_DATA3
MOVLW 0XBF
MOVWF R1
GOTO LED_OPT_END
LED_OPT_END:
MOVFW R1
MOVWF LED_DATA4
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;200毫秒延时子程序
;延时时间:2+(256×3+13)×256+2=199940μS
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
DELAY200MS:
CLRF R7
CLRF R6
DECFSZ R6
GOTO $-1
CLRWDT
INCF R6
INCF R6
DECFSZ R6
GOTO $-1
DECFSZ R7
GOTO $-8
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
INCLUDE <DS1302.ASM>
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;PIC设置子程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
PIC_INITAL:
CLRF STATUS
CLRF PCLATH
;**BANK0**
CLRF PORTB
CLRF PORTC
BSF COM_1
BSF COM_2
BSF COM_3
BSF COM_4
;设置T1为内部时钟,不分频,T1模块暂时处理关闭状态
CLRF T1CON
CLRF TMR1L
CLRF TMR1H
;CCP1为比较模式,50MS比较中断(50000):
MOVLW B'00001011'
MOVWF CCP1CON
MOVLW LOW(.2000)
MOVWF CCPR1L
MOVLW HIGH(.2000)
MOVWF CCPR1H
;T2设置;用于步进电机运转控制:
; CLRF TMR2
; MOVLW B'00001001'
CLRF T2CON ;设置T2的预分频4,后分频2,4×250×2=2MS
CLRF ADCON0 ;将ATAD时间设置为4.0uS
;**BANK1**
BSF STATUS,RP0
MOVLW B'10111111'
;BIT7: 禁止PORTB上拉=1
;BIT6: 中断边沿选择位,现不使用
;BIT5: T0在T0CKI(RA4)引脚信号的跳变沿计数=1,=0为内部时钟
;BIT4: 在T0CKI 引脚信号的下降沿进行递增计数=1,=0为上升沿
;BIT3: 分频器给WDT=1
;BIT2-0: 分频系数:111=分频(256)
MOVWF OPTION_REG
MOVLW 0FDH
MOVWF TRISA ;除RA0,1外全为输入脚
CLRF TRISB ;RB全为输出脚
CLRF TRISC ;RC全为输出脚
CLRF PIE1
CLRF PIE2
BSF PIE1,CCP1IE
; BSF PIE1,TMR1IE
; MOVLW .249 ;4×(249+1)×2=2MS定时中断
; MOVWF PR2
; MOVLW 50H
MOVLW 0x07
MOVWF ADCON1 ;AD关闭
;**BANK0**
CLRF STATUS
;内存清零:
MOVLW 20H
MOVWF FSR
CLRF INDF
INCF FSR
BTFSS FSR,7
GOTO $-3
;清中断标志:
CLRF PIR1
CLRF PIR2
CLRF INTCON
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;CCP1中断服务子程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CCP1_PROG:
BCF PIR1,CCP1IF
BSF FLAG_4MS
INCF TIMER_4MS
MOVLW .5
SUBWF TIMER_4MS,W
BTFSS STATUS,C
GOTO LED_OUT;INT_END
CLRF TIMER_4MS
BSF FLAG_20MS
INCF TIMER_20MS
MOVLW .50
SUBWF TIMER_20MS,W
BTFSS STATUS,C
GOTO LED_OUT;INT_END
CLRF TIMER_20MS
BSF FLAG_500MS
MOVLW 01H ;秒显位取反
XORWF TYPE
; GOTO INT_END
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;3. LED数据显示子程序:
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LED_OUT:
BTFSC COM_4
GOTO LED_OUT1
BSF COM_4
MOVFW LED_DATA0
MOVWF PORTB
BCF COM_0
GOTO INT_END
LED_OUT1:
BTFSC COM_0
GOTO LED_OUT2
BSF COM_0
MOVFW LED_DATA1
MOVWF PORTB
BCF COM_1
GOTO INT_END
LED_OUT2:
BTFSC COM_1
GOTO LED_OUT3
BSF COM_1
MOVFW LED_DATA2
MOVWF PORTB
BCF COM_2
GOTO INT_END
LED_OUT3:
BTFSC COM_2
GOTO LED_OUT4
BSF COM_2
MOVFW LED_DATA3
MOVWF PORTB
BCF COM_3
GOTO INT_END
LED_OUT4:
BSF COM_3
MOVFW LED_DATA4
MOVWF PORTB
BCF COM_4
GOTO INT_END
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ORG 2100H
;---00H~0FH---------------
DATA 51H,06H,0BH,40H,51H,00H
DATA 00H,00H,00H,00H,00H
DATA 00H,00H,00H,00H,00H
ORG 2130H
DATA 00H
ORG 2007H
; DATA 3B7AH;调试参数
DATA 0846H;生产参数
;***************************************
END
加载中...
dingzy_2002
2楼-- · 2019-03-26 00:40
里面有多余的内容,可以不用,这是我做的一个小产品用的。
加载中...
dingzy_2002
3楼-- · 2019-03-26 05:31
这是DS1302读写子程序:
;*************************************
; DS1302读写与设置子程序
;*************************************
;说明:
;用于对MAXIN(DALLAS)的DS1302进行读写与相关设置
;DS1302写指令格式:(低位在前方式收发数据)
;-----------------------------------------------------------
;| BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
;| 1 | RAM/CK | A4 | A3 | A2 | A1 | A0 | R/W |
;-----------------------------------------------------------
;第6位为L时,读写时钟;为H时,读写内部RAM
;第0位为L时,写DS1302;为H时,读DS1302
;#DEFINE DS1302_RAM_R 0xC1
;#DEFINE DS1302_RAM_W 0xC0
;#DEFINE DS1302_RTC_R 0x81
;#DEFINE DS1302_RTC_W 0X80
;相关读写RTC数据指令(单字节模式下):
;#DEFINE DS1302_SEC_W 0X80
;#DEFINE DS1302_SEC_R 0x81;秒读写
; BIT7=振荡时钟使能(0),BIT6~4=十位秒数据,BIT3~0=个位秒数据
;#DEFINE DS1302_MIN_W 0X82
;#DEFINE DS1302_MIN_R 0X83;分读写
; BIT7=未用,BIT6~4=十位分钟数据,BIT3~0=个位分钟数据
;#DEFINE DS1302_HOUR_W 0X84
;#DEFINE DS1302_HOUR_R 0X85;时读写
; BIT7=12/24制指示,12H=1,24H=0;
; BIT6:未用,读为0
; BIT5:24小时制为小时的十位数据;12小时制为上午(0)/下午(1)指示
; BIT4:小时数据的十位
; BIT3~0:个位小时数据.
;#DEFINE DS1302_DATE_W 0X86
;#DEFINE DS1302_DATE_R 0X87;日读写
; BIT7~6:未用,读为0
; BIT5~4:十位日期
; BIT3~0:个位日期
;#DEFINE DS1302_MONTH_W 0X88
;#DEFINE DS1302_MONTH_R 0X89;月读写
; BIT7~5:未用,读为0
; BIT4:十位月份
; BIT3~0:个位月份
;#DEFINE DS1302_DAY_W 0X8A
;#DEFINE DS1302_DAY_R 0X8B;周读写
; BIT7~3:未用,读为0
; BIT2~0:星期数据
;#DEFINE DS1302_YEAR_W 0X8C
;#DEFINE DS1302_YEAR_R 0X8D;年读写
; BIT7~4:十位年数据(固定为20)
; BIT3~0:个位年
;#DEFINE DS1302_SET1_W 0X8E
;#DEFINE DS1302_SET1_R 0X8F;配置1读写
; BIT7: 写保护,H为禁止写保护
; BIT6~0:未用,读为0
;#DEFINE DS1302_SET2_W 0X90
;#DEFINE DS1302_SET2_R 0X91;配置2读写
; BIT7~4:涓流充电使能=1010,其它数据不使能
; BIT3~2:充电二极管选择:01=1个二极管,10=2个二极管串联
; BIT1~0:充电电阻选择:00=0Ω,01=2KΩ,10=4KΩ,11=8KΩ
;------------------------------------------------
;需设置的管脚:
; #DEFINE RTC_CS PORTC,0;DS1302片选,H=选通
; #DEFINE RTC_DA PORTC,1;DS1302数据,I/O
; #DEFINE RTC_CK PORTC,2;DS1302时钟
;需使用的寄存器:
; RTC_SECOND EQU 50H ;秒数据
; #DEFINE RTC_MINUTES RTC_SECOND+1;分钟数据
; #DEFINE RTC_HOUR RTC_SECOND+2;小时数据
; #DEFINE RTC_DATE RTC_SECOND+3;日期数据
; #DEFINE RTC_MONTH RTC_SECOND+4;月份数据
; #DEFINE RTC_DAY RTC_SECOND+5;日期数据
; #DEFINE RTC_YEAR RTC_SECOND+6;年数据
; #DEFINE RTC_SET1 RTC_SECOND+7
; #DEFINE RTC_SET2 RTC_SECOND+8;涓流充电控制
;涉及到的工作寄存器:
; W:中间寄存器
; R0:命令传输寄存器
; R1:数据传输寄存器
; R7:读取字节数寄存器
; R6:位发送控制寄存器
; FSR:INDF:间接寄存器
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 子程序开始
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;*************************************
;DS1302读出时钟数据程序:
;*************************************
DS1302_DATA_READ:
MOVLW .7
MOVWF R7
MOVLW DS1302_SEC_R
MOVWF R2
MOVLW RTC_SECOND
MOVWF FSR
MOVFW R2
CALL DS1302_RTC_READ
MOVWF INDF
INCF FSR
INCF R2
INCF R2
DECFSZ R7
GOTO $-7
RETURN
;*************************************
;DS1302初始化程序:
;*************************************
DS1302_INIT:
CALL DS1302_DATA_READ
;写保护关闭
DS1302_WP_DISABLE:
CLRF R1
MOVLW DS1302_SET1_W
CALL DS1302_RTC_WRITE
DS1302_CHARGE:
;设置涓流充电参数:
MOVLW B'00001011';B'10101011';(涓流充电允许=1010,2个二极管=10,充电限流电阻8KΩ=11)
MOVWF R1
MOVLW DS1302_SET2_W
CALL DS1302_RTC_WRITE
DS1302_HOUR_SYS:
;设置时间制:若是12小时制,则改为24小时制
BTFSS RTC_HOUR,7
GOTO $+.6
BCF RTC_HOUR,7
MOVFW RTC_HOUR
MOVWF R1
MOVLW DS1302_HOUR_W
CALL DS1302_RTC_WRITE
;检查时钟振荡,停振则开启:
DS1302_OSO_SET:
BTFSS RTC_SECOND,7
GOTO $+.5
CLRF RTC_SECOND
CLRF R1
MOVLW DS1302_SEC_W
CALL DS1302_RTC_WRITE
;写保护打开:
DS1302_WP_ENABLE:
MOVLW 80H
MOVWF R1
MOVLW DS1302_SET1_W
CALL DS1302_RTC_WRITE
RETURN
;*************************************
;DS1302读数据子程序:
;*************************************
;W:给定的指令(含地址)
;R1:读出的数据
DS1302_RTC_READ:
BCF RTC_CK
BSF RTC_CS
CALL DS1302_OUT
CALL DS1302_IN
BCF RTC_CS
RETURN
;*************************************
;DS1302写数据子程序:
;*************************************
DS1302_RTC_WRITE:
;W:给定的指令(含地址)
;R1:需写入的数据
BCF RTC_CK
BSF RTC_CS
CALL DS1302_OUT
MOVFW R1
CALL DS1302_OUT
BCF RTC_CS
RETURN
;-------------------------------------
;DS1302字节数据发送子程序:
;-------------------------------------
DS1302_OUT:
MOVWF R0
MOVLW .8
MOVWF R6
BSF STATUS,RP0
BCF TRISA,0;RTC_DA
CLRF STATUS
DS1302_OUT1:
BCF RTC_CK
BTFSS R0,0
BCF RTC_DA
BTFSC R0,0
BSF RTC_DA
GOTO $+1
GOTO $+1
RRF R0
BSF RTC_CK
DECFSZ R6
GOTO DS1302_OUT1
BSF STATUS,RP0
BSF TRISA,0;RTC_DA
CLRF STATUS
BCF RTC_CK
RETURN
;-------------------------------------
;DS1302字节数据接收子程序:
;-------------------------------------
DS1302_IN:
MOVLW .8
MOVWF R6
DS1302_IN1:
BTFSS RTC_DA
BCF STATUS,C
BTFSC RTC_DA
BSF STATUS,C
RRF R0
BSF RTC_CK
GOTO $+1
GOTO $+1
BCF RTC_CK
DECFSZ R6
GOTO DS1302_IN1
MOVFW R0
RETURN
加载中...
一周热门
更多
>
相关问题
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
单片机程序必知的几个寄存器
0个评论
单片机 矩阵式按键
0个评论
51单片机上移植C语言的printf()
0个评论
STC89C52MCU--软件实现系统复位
0个评论
单片机C语言程序该这样写!不是教科书上教的那样!转[]
0个评论
单片机并行I/O口(P0)硬件结构
0个评论
壹:单片机的内部资源
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
;***************************************
; RTC时钟程序
; ()
;***************************************
;CPU=PIC16F870-I/SS,OSC=4MHz
;RTC=DS1302
;***************************************
;程序说明:
;***************************************
;版本: V0
;修改:
;--------------------
;***************************************
;功能预定义:
;管脚定义:
;PORTA:
#DEFINE RTC_DA PORTA,0
#DEFINE RTC_CK PORTA,1
#DEFINE CON_IN PORTA,2
#DEFINE KEY_ADD PORTA,3
#DEFINE KEY_DEC PORTA,4
#DEFINE KEY_ADJ PORTA,5
;PORTB:
;RB0~RB7 LED段位数据输出
;PORTC
#DEFINE COM_3 PORTC,2
#DEFINE COM_4 PORTC,3
#DEFINE COM_2 PORTC,4
#DEFINE COM_1 PORTC,5
#DEFINE COM_0 PORTC,6
#DEFINE RTC_CS PORTC,7
;***************************************
;内存定义;
;*********************************************
; 内存RAM定义
;*********************************************
;EEPROM定义数据寄存器:
EE_ADDR EQU 7BH
#DEFINE EE_DATA EE_ADDR+1
;中断保护寄存器
PCL_TEMP EQU 7DH
#DEFINE W_TEMP PCL_TEMP+1
#DEFINE S_TEMP PCL_TEMP+2
;工作寄存器
R0 EQU 71H
#DEFINE R1 R0+1
#DEFINE R2 R0+2
#DEFINE R3 R0+3
#DEFINE R4 R0+4
#DEFINE R5 R0+5
#DEFINE R6 R0+6
#DEFINE R7 R0+7
;运行用位寄存器定义:
TYPE EQU 20H
#DEFINE SECOND TYPE,0
#DEFINE FLAG_4MS TYPE,1 ;4MS/CYCLE
#DEFINE FLAG_20MS TYPE,2 ;500MS/CYCLE
#DEFINE FLAG_500MS TYPE,3 ;500MS/CYCLE
#DEFINE FRIST_AD TYPE,4
#DEFINE NO_OIL_TEMP TYPE,5
#DEFINE MO_ZERO TYPE,6
#DEFINE ACK_BIT TYPE,7
;--------------------------------------------
;小时计数据寄存器:
#DEFINE TIMER_4MS 0x22 ;每4mS累加数据寄存器
#DEFINE TIMER_20MS 0x23 ;每4mS累加数据寄存器
#DEFINE TIMER_500MS 0x24 ;每500MS累回数据寄存器
;2BH IS END
;LED显示数据:
LED_DATA0 EQU 0x25
LED_DATA1 EQU 0x26
LED_DATA2 EQU 0x27
LED_DATA3 EQU 0x28
LED_DATA4 EQU 0x29
;LED显示状态位:
DISP_STU EQU 0x2A
#DEFINE DISP_YEAR DISP_STU,0
#DEFINE DISP_DATE DISP_STU,1
#DEFINE DISP_HOUR DISP_STU,2
#DEFINE DISP_DAY DISP_STU,3
#DEFINE DISP_SECOND DISP_STU,4
;按键数据:
KEY_ADJ_DATA EQU 0X2B
KEY_ADD_DATA EQU 0X2C
KEY_DEC_DATA EQU 0X2D
;按键数据:
KEY_PUSH EQU 0X2E
#DEFINE KEY_ADJ_DOWN KEY_PUSH,0
#DEFINE KEY_ADD_DOWN KEY_PUSH,1
#DEFINE KEY_DEC_DOWN KEY_PUSH,2
#DEFINE KEY_ADJ_EN KEY_PUSH,3
#DEFINE KEY_ADD_EN KEY_PUSH,4
#DEFINE KEY_DEC_EN KEY_PUSH,5
KEY_STU EQU 5AH
#DEFINE KEY_HOUR KEY_STU,5 ;调整小时
#DEFINE KEY_MINUTES KEY_STU,4 ;调整分钟
#DEFINE KEY_YEAR KEY_STU,3 ;调整年份
#DEFINE KEY_MONTH KEY_STU,2 ;调整月份
#DEFINE KEY_DATE KEY_STU,1 ;调整日期
#DEFINE KEY_DAY KEY_STU,0 ;调整星期
KEY_CHANG EQU 5BH ;RTC数据调整标志寄存器,用于调整后进行存贮操作
#DEFINE YEAR_RUN KEY_CHANG,7 ;闰年标志
#DEFINE KEY_DOWN KEY_CHANG,6 ;按键按下标志
#DEFINE CHANG_HOUR KEY_CHANG,5 ;小时已调整标志
#DEFINE CHANG_MINUTES KEY_CHANG,4 ;分钟已调整标志
#DEFINE CHANG_YEAR KEY_CHANG,3 ;年份已调整标志
#DEFINE CHANG_MONTH KEY_CHANG,2 ;月份已调整标志
#DEFINE CHANG_DATE KEY_CHANG,1 ;日期已调整标志
#DEFINE CHANG_DAY KEY_CHANG,0 ;星期已调整标志
KEY_STEP EQU 5CH ;上次按键值
;RTC显示数据:
RTC_SECOND EQU 50H ;秒数据
#DEFINE RTC_MINUTES RTC_SECOND+1;分钟数据
#DEFINE RTC_HOUR RTC_SECOND+2;小时数据
#DEFINE RTC_DATE RTC_SECOND+3;日期数据
#DEFINE RTC_MONTH RTC_SECOND+4;月份数据
#DEFINE RTC_DAY RTC_SECOND+5;星期数据
#DEFINE RTC_YEAR RTC_SECOND+6;年数据
#DEFINE RTC_SET1 RTC_SECOND+7;写保护(最高位)控制
#DEFINE RTC_SET2 RTC_SECOND+8;涓流充电控制
;58H is end
;RTC读写使命字:
#DEFINE DS1302_SEC_W 0X80
#DEFINE DS1302_SEC_R 0x81;秒读写
#DEFINE DS1302_MIN_W 0X82
#DEFINE DS1302_MIN_R 0X83;分读写
#DEFINE DS1302_HOUR_W 0X84
#DEFINE DS1302_HOUR_R 0X85;时读写
#DEFINE DS1302_DATE_W 0X86
#DEFINE DS1302_DATE_R 0X87;日读写
#DEFINE DS1302_MONTH_W 0X88
#DEFINE DS1302_MONTH_R 0X89;月读写
#DEFINE DS1302_DAY_W 0X8A
#DEFINE DS1302_DAY_R 0X8B;周读写
#DEFINE DS1302_YEAR_W 0X8C
#DEFINE DS1302_YEAR_R 0X8D;年读写
#DEFINE DS1302_SET1_W 0X8E
#DEFINE DS1302_SET1_R 0X8F;配置1读写
#DEFINE DS1302_SET2_W 0X90
#DEFINE DS1302_SET2_R 0X91;配置2读写
;--------------------------------------------
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 程序开始
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LIST P=PIC16F870,W=2
INCLUDE <P16F870.INC>
ORG 00H
NOP
GOTO START
ORG 04H
MOVWF W_TEMP
SWAPF STATUS, W
MOVWF S_TEMP
CLRF STATUS
SWAPF PCLATH, W
MOVWF PCL_TEMP
CLRF PCLATH
BTFSC PIR1,CCP1IF
GOTO CCP1_PROG
INT_END: SWAPF PCL_TEMP, W
MOVWF PCLATH
SWAPF S_TEMP, W
MOVWF STATUS
SWAPF W_TEMP
SWAPF W_TEMP, W
RETFIE
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 查表数据区:
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;**************************************
;月分对应的日期查表程序:
;**************************************
RTC_DATE_SET:
ANDLW 0X0F
ADDWF PCL
RETLW .1 ;空数据
RETLW 0X31 ;1月
RETLW 0X28 ;2月
RETLW 0X31 ;3月
RETLW 0X30 ;4月
RETLW 0X31 ;5月
RETLW 0X30 ;6月
RETLW 0X31 ;7月
RETLW 0X31 ;8月
RETLW 0X30 ;9月
RETLW 0X31 ;10月
RETLW 0X30 ;11月
RETLW 0X31 ;12月
LED_SEG:
ANDLW 0X0F
ADDWF PCL
RETLW 0x50 ;0
RETLW 0xF9 ;1
RETLW 0x94 ;2
RETLW 0xB0 ;3
RETLW 0x39 ;4
RETLW 0x32 ;5
RETLW 0x12 ;6
RETLW 0xF8 ;7
RETLW 0x10 ;8
RETLW 0x30 ;9
RETLW 0x18 ;A
RETLW 0x13 ;b
RETLW 0x97 ;c
RETLW 0x91 ;d
RETLW 0x16 ;E
RETLW 0x1E ;F
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 程序开始
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
START: CALL PIC_INITAL
;关闭液晶屏显示:
;延时200ms
CALL DELAY200MS
;DS1302初始化:
CALL DS1302_INIT
;读取小时计数据:
BSF T1CON,TMR1ON;打开定时器1
; BSF T2CON,TMR2ON;打开定时器2
MOVLW 0C0H
MOVWF INTCON ;允许定时器1/2中断.
;预设置:
BSF DISP_HOUR
BCF COM_0
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 循环程序开始
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
MAIN: BTFSS FLAG_20MS
GOTO MAIN_1
BCF FLAG_20MS
CALL KEY_OPT
CALL LED_OPT
MAIN_1: BTFSS FLAG_500MS
GOTO MAIN
BCF FLAG_500MS
BTFSS KEY_DOWN
CALL DS1302_DATA_READ
MAIN_3:
CLRWDT
GOTO MAIN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;1. 按键运算子程序:
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
KEY_OPT:
BCF STATUS,C
BTFSS KEY_ADJ
BSF STATUS,C
RLF KEY_ADJ_DATA
MOVFW KEY_ADJ_DATA
ADDLW .1
BTFSC STATUS,Z
BSF KEY_ADJ_DOWN
; MOVFW KEY_ADJ_DATA
; BTFSC STATUS,Z
; BTFSS KEY_ADJ_DOWN
; GOTO $+2
; BSF KEY_ADJ_EN
BCF STATUS,C
BTFSS KEY_ADD
BSF STATUS,C
RLF KEY_ADD_DATA
MOVFW KEY_ADD_DATA
ADDLW .1
BTFSC STATUS,Z
BSF KEY_ADD_DOWN
; MOVFW KEY_ADD_DATA
; BTFSC STATUS,Z
; BTFSS KEY_ADD_DOWN
; GOTO $+2
; BSF KEY_ADD_EN
BCF STATUS,C
BTFSS KEY_DEC
BSF STATUS,C
RLF KEY_DEC_DATA
MOVFW KEY_DEC_DATA
ADDLW .1
BTFSC STATUS,Z
BSF KEY_DEC_DOWN
; MOVFW KEY_DEC_DATA
; BTFSC STATUS,Z
; BTFSS KEY_DEC_DOWN
; GOTO $+2
; BSF KEY_DEC_EN
;-------------------------
;1.调整按键
;---------------------------------
KET_ADJ_OPT:
MOVFW KEY_ADJ_DATA
BTFSC STATUS,Z
BTFSS KEY_ADJ_DOWN
GOTO KEY_ADD_OPT
BCF KEY_ADJ_DOWN
;时钟移位及调整:
BTFSS DISP_HOUR
GOTO KEY_ADJ_YEAR
INCF KEY_STEP
MOVLW .1
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_HOUR1
BSF KEY_HOUR
BCF KEY_MINUTES
RETURN
KEY_ADJ_HOUR1:
MOVLW .2
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_HOUR2
BSF KEY_MINUTES
BCF KEY_HOUR
RETURN
KEY_ADJ_HOUR2:
MOVLW .3
SUBWF KEY_STEP,W
BTFSS STATUS,C
RETURN
CLRF KEY_STEP
BCF KEY_MINUTES
BCF KEY_HOUR
BTFSC KEY_DOWN
GOTO RTC_DATA_STORE
RETURN
;年份调整:
KEY_ADJ_YEAR:
BTFSS DISP_YEAR
GOTO KEY_ADJ_DATE
INCF KEY_STEP
MOVLW .1
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_YEAR1
BSF KEY_YEAR
RETURN
KEY_ADJ_YEAR1:
MOVLW .2
SUBWF KEY_STEP,W
BTFSS STATUS,C
RETURN
CLRF KEY_STEP
BCF KEY_YEAR
BTFSC KEY_DOWN
GOTO RTC_DATA_STORE
RETURN
;月日调整:
KEY_ADJ_DATE:
BTFSS DISP_DATE
GOTO KEY_ADJ_DAY
INCF KEY_STEP
MOVLW .1
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_DATE1
BCF KEY_DATE
BSF KEY_MONTH
RETURN
KEY_ADJ_DATE1:
MOVLW .2
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_DATE2
BCF KEY_MONTH
BSF KEY_DATE
RETURN
KEY_ADJ_DATE2:
MOVLW .3
SUBWF KEY_STEP,W
BTFSS STATUS,C
RETURN
CLRF KEY_STEP
BCF KEY_MONTH
BCF KEY_DATE
BTFSC KEY_DOWN
GOTO RTC_DATA_STORE
RETURN
;星期调整:
KEY_ADJ_DAY:
BTFSS DISP_DAY
RETURN
INCF KEY_STEP
MOVLW .1
SUBWF KEY_STEP,W
BTFSS STATUS,Z
GOTO KEY_ADJ_DAY1
BSF KEY_DAY
RETURN
KEY_ADJ_DAY1:
MOVLW .2
SUBWF KEY_STEP,W
BTFSS STATUS,C
RETURN
CLRF KEY_STEP
BCF KEY_DAY
BTFSC KEY_DOWN
GOTO RTC_DATA_STORE
RETURN
;-------------------------
;2.加1调整按键
;---------------------------------
KEY_ADD_OPT:
MOVFW KEY_ADD_DATA
BTFSC STATUS,Z
BTFSS KEY_ADD_DOWN
GOTO KEY_DEC_OPT
BCF KEY_ADD_DOWN
;若无调整项目,则为移位显示年/月日/时间/星期/秒显示内容
MOVFW KEY_STU
BTFSS STATUS,Z
GOTO KEY_ADD_OPT1
RLF DISP_STU
BTFSC DISP_STU,5
BSF DISP_YEAR
MOVLW 0X1F
ANDWF DISP_STU
RETURN
KEY_ADD_OPT1:
BSF KEY_DOWN
;小时累加:
BTFSS KEY_HOUR
GOTO KEY_OPT21
INCF RTC_HOUR,W
CALL DA_OPT
MOVWF RTC_HOUR
XORLW 0X24
BTFSC STATUS,Z
CLRF RTC_HOUR
BSF CHANG_HOUR
RETURN
;分钟累加:
KEY_OPT21:
BTFSS KEY_MINUTES
GOTO KEY_OPT22
INCF RTC_MINUTES,W
CALL DA_OPT
MOVWF RTC_MINUTES
XORLW 0X60
BTFSC STATUS,Z
CLRF RTC_MINUTES
BSF CHANG_MINUTES
RETURN
;年份累加:
KEY_OPT22:
BTFSS KEY_YEAR
GOTO KEY_OPT23
INCF RTC_YEAR,W
CALL DA_OPT
MOVWF RTC_YEAR
BSF CHANG_YEAR
RETURN
;月分累加:
KEY_OPT23:
BTFSS KEY_MONTH
GOTO KEY_OPT24
BSF CHANG_MONTH
INCF RTC_MONTH,W
CALL DA_OPT
MOVWF RTC_MONTH
XORLW 0X13
BTFSS STATUS,Z
RETURN
MOVLW .1
MOVWF RTC_MONTH
RETURN
;日期累加:
KEY_OPT24:
BTFSS KEY_DATE
GOTO KEY_OPT25
CALL RTC_MONTH_DATE
INCF R0,W
CALL DA_OPT
MOVWF R0
;--------对日期进行加1:
BSF CHANG_DATE
INCF RTC_DATE,W
CALL DA_OPT
MOVWF RTC_DATE
XORWF R0,W
BTFSS STATUS,Z
RETURN
MOVLW .1
MOVWF RTC_DATE
RETURN
;星期累加:
KEY_OPT25:
BTFSS KEY_DAY
RETURN
BSF CHANG_DAY
INCF RTC_DAY
MOVLW 07H
ANDWF RTC_DAY
BTFSC STATUS,Z
INCF RTC_DAY
RETURN
;-------------------------
;2.减1调整按键
;---------------------------------
KEY_DEC_OPT:
MOVFW KEY_DEC_DATA
BTFSC STATUS,Z
BTFSS KEY_DEC_DOWN
RETURN
BCF KEY_DEC_DOWN
;若无调整项目,则为移位显示年/月日/时间/星期/秒显示内容
MOVFW KEY_STU
BTFSS STATUS,Z
GOTO KEY_DEC_OPT1
RRF DISP_STU
BTFSC STATUS,C
BSF DISP_SECOND
MOVLW 0X1F
ANDWF DISP_STU
RETURN
KEY_DEC_OPT1:
;小时减少:
BSF KEY_DOWN
BTFSS KEY_HOUR
GOTO KEY_OPT31
BSF CHANG_HOUR
DECF RTC_HOUR,W
CALL DEC_ADJ
MOVWF RTC_HOUR
SUBLW 0X23
BTFSC STATUS,C
RETURN
MOVLW 0X23
MOVWF RTC_HOUR
RETURN
;分钟减少:
KEY_OPT31:
BTFSS KEY_MINUTES
GOTO KEY_OPT32
BSF CHANG_MINUTES
DECF RTC_MINUTES,W
CALL DEC_ADJ
MOVWF RTC_MINUTES
SUBLW 0X59
BTFSC STATUS,C
RETURN
MOVLW 0X59
MOVWF RTC_MINUTES
RETURN
;年份减少:
KEY_OPT32:
BTFSS KEY_YEAR
GOTO KEY_OPT33
BSF CHANG_YEAR
DECF RTC_YEAR,W
CALL DEC_ADJ
MOVWF RTC_YEAR
RETURN
;月份减少:
KEY_OPT33:
BTFSS KEY_MONTH
GOTO KEY_OPT34
BSF CHANG_MONTH
DECF RTC_MONTH,W
CALL DEC_ADJ
MOVWF RTC_MONTH
BTFSC STATUS,Z
GOTO $+4
SUBLW 0X12
BTFSC STATUS,C
RETURN
MOVLW 0X12
MOVWF RTC_MONTH
RETURN
;日期减少:
KEY_OPT34:
BTFSS KEY_DATE
GOTO KEY_OPT35
BSF CHANG_DATE
CALL RTC_MONTH_DATE
DECF RTC_DATE,W
CALL DEC_ADJ
MOVWF RTC_DATE
BTFSC STATUS,Z
GOTO $+4
SUBWF R0,W
BTFSC STATUS,C
RETURN
MOVFW R0
MOVWF RTC_DATE
RETURN
;星期减少:
KEY_OPT35:
BTFSS KEY_DAY
RETURN
BSF CHANG_DAY
DECFSZ RTC_DAY
RETURN
MOVLW .7
MOVWF RTC_DAY
RETURN
;-------------------------
;存贮
;---------------------------------
RTC_DATA_STORE:
BCF KEY_DOWN
;写保护关闭
CLRF R1
MOVLW DS1302_SET1_W
CALL DS1302_RTC_WRITE
BTFSS CHANG_HOUR
GOTO KEY_OPT02
BCF CHANG_HOUR
MOVFW RTC_HOUR
MOVWF R1
MOVLW DS1302_HOUR_W
CALL DS1302_RTC_WRITE
KEY_OPT02:
BTFSS CHANG_MINUTES
GOTO KEY_OPT03
BCF CHANG_MINUTES
CLRF R1
MOVLW DS1302_SEC_W
CALL DS1302_RTC_WRITE
MOVFW RTC_MINUTES
MOVWF R1
MOVLW DS1302_MIN_W
CALL DS1302_RTC_WRITE
KEY_OPT03:
BTFSS CHANG_YEAR
GOTO KEY_OPT04
BCF CHANG_YEAR
MOVFW RTC_YEAR
MOVWF R1
MOVLW DS1302_YEAR_W
CALL DS1302_RTC_WRITE
KEY_OPT04:
BTFSS CHANG_MONTH
GOTO KEY_OPT05
BCF CHANG_MONTH
MOVFW RTC_MONTH
MOVWF R1
MOVLW DS1302_MONTH_W
CALL DS1302_RTC_WRITE
KEY_OPT05:
BTFSS CHANG_DATE
GOTO KEY_OPT06
BCF CHANG_DATE
MOVFW RTC_DATE
MOVWF R1
MOVLW DS1302_DATE_W
CALL DS1302_RTC_WRITE
KEY_OPT06:
BTFSS CHANG_DAY
GOTO KEY_OPT07
BCF CHANG_DAY
MOVFW RTC_DAY
MOVWF R1
MOVLW DS1302_DAY_W
CALL DS1302_RTC_WRITE
KEY_OPT07:
GOTO DS1302_WP_ENABLE
;---------------------------------
DEC_ADJ:
;---------------------------------
CLRF STATUS
MOVWF R7
ADDLW 0X06
BTFSS STATUS,DC
GOTO $+3
MOVLW 0X06
SUBWF R7
MOVFW R7
ADDLW 60H
BTFSS STATUS,C
GOTO $+3
MOVLW 0X60
SUBWF R7
MOVFW R7
RETURN
;---------------------------------
;月分所对应的日期总数查表
;---------------------------------
RTC_MONTH_DATE:
CLRW
BTFSC RTC_MONTH,4
MOVLW .10
ADDWF RTC_MONTH,W
CALL RTC_DATE_SET
MOVWF R0
;进行闰年的日期调整:
XORLW 0X28
BTFSS STATUS,Z
RETURN
;对闰年进行判断:
BCF YEAR_RUN
CLRW
BTFSC RTC_YEAR,4
MOVLW 0X02
ADDWF RTC_YEAR,W
ANDLW 0X03
BTFSS STATUS,Z
RETURN
BSF YEAR_RUN
INCF R0
RETURN
;***************************************
; 十进制转换子程序
;***************************************
DA_OPT: BCF STATUS,RP0
BCF STATUS,RP1
MOVWF R7
ADDLW 06H
BTFSC STATUS,DC
MOVWF R7
MOVF R7,W
ADDLW 60H
BTFSC STATUS,C
MOVWF R7
MOVF R7,W
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;2. LED数据转换子程序:
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LED_OPT:
BTFSS DISP_HOUR
GOTO LED_DISP_DATE
;---------------------------------
;1.时间数据显示
;---------------------------------
BTFSC KEY_HOUR
BTFSS SECOND
GOTO LED_DISP_HOUR1
MOVLW 0XFF
MOVWF LED_DATA0
MOVWF LED_DATA1
GOTO LED_DISP_HOUR2
LED_DISP_HOUR1:
SWAPF RTC_HOUR,W
ANDLW 0X0F
BTFSC STATUS,Z
MOVLW 0XFF
BTFSS STATUS,Z
CALL LED_SEG
MOVWF LED_DATA0
MOVFW RTC_HOUR
CALL LED_SEG
BTFSS SECOND
ANDLW 0XEF
MOVWF LED_DATA1
LED_DISP_HOUR2:
BTFSC KEY_MINUTES
BTFSS SECOND
GOTO LED_DISP_HOUR3
MOVLW 0XFF
MOVWF LED_DATA2
MOVWF LED_DATA3
GOTO LED_DISP_HOUR4
LED_DISP_HOUR3:
SWAPF RTC_MINUTES,W
CALL LED_SEG
BTFSS SECOND
ANDLW 0XEF
MOVWF LED_DATA2
MOVFW RTC_MINUTES
CALL LED_SEG
MOVWF LED_DATA3
LED_DISP_HOUR4:
;根据秒数据,进行时间段位显示
MOVLW 0xFF
MOVWF R1
SWAPF RTC_SECOND,W
ANDLW 0x0F
MOVWF R0
BCF STATUS,C
RRF R0
CLRW
SUBWF R0,W
BTFSS STATUS,Z
GOTO $+3
BCF R1,2 ;T3
GOTO LED_OPT_END
MOVLW 0x01
SUBWF R0,W
BTFSS STATUS,Z
BCF R1,5
BTFSC STATUS,Z
BCF R1,3 ;T4
GOTO LED_OPT_END
;---------------------------------
;2.日期数据显示:
;---------------------------------
LED_DISP_DATE:
BTFSS DISP_DATE
GOTO LED_DISP_YEAR
BTFSC KEY_MONTH
BTFSS SECOND
GOTO LED_DISP_DATE1
MOVLW 0XFF
MOVWF LED_DATA0
MOVWF LED_DATA1
GOTO LED_DISP_DATE2
LED_DISP_DATE1:
SWAPF RTC_MONTH,W
ANDLW 0x0F
BTFSC STATUS,Z
MOVLW 0XFF
BTFSS STATUS,Z
CALL LED_SEG
MOVWF LED_DATA0
MOVFW RTC_MONTH
CALL LED_SEG
MOVWF LED_DATA1
LED_DISP_DATE2:
BTFSC KEY_DATE
BTFSS SECOND
GOTO LED_DISP_DATE3
MOVLW 0XFF
MOVWF LED_DATA2
MOVWF LED_DATA3
GOTO LED_DISP_DATE4
LED_DISP_DATE3:
SWAPF RTC_DATE,W
ANDLW 0x0F
BTFSC STATUS,Z
MOVLW 0XFF
BTFSS STATUS,Z
CALL LED_SEG
MOVWF LED_DATA2
MOVFW RTC_DATE
CALL LED_SEG
MOVWF LED_DATA3
LED_DISP_DATE4:
MOVLW 0XFD
MOVWF R1
GOTO LED_OPT_END
;---------------------------------
;3.年份数据显示:
;---------------------------------
LED_DISP_YEAR:
BTFSS DISP_YEAR
GOTO LED_DISP_DAY
BTFSC KEY_YEAR
BTFSS SECOND
GOTO LED_DISP_YEAR1
MOVLW 0XFF
MOVWF LED_DATA0
MOVWF LED_DATA1
MOVWF LED_DATA2
MOVWF LED_DATA3
GOTO LED_DISP_YEAR2
LED_DISP_YEAR1:
MOVLW 0x94 ;2
MOVWF LED_DATA0
MOVLW 0x50 ;0
MOVWF LED_DATA1
SWAPF RTC_YEAR,W
CALL LED_SEG
MOVWF LED_DATA2
MOVFW RTC_YEAR
CALL LED_SEG
MOVWF LED_DATA3
LED_DISP_YEAR2:
MOVLW 0XFE
MOVWF R1
GOTO LED_OPT_END
;---------------------------------
;4.星期数据显示:
;---------------------------------
LED_DISP_DAY:
BTFSS DISP_DAY
GOTO LED_DISP_SECOND
MOVLW 0x91 ;d
MOVWF LED_DATA0
MOVLW 0xBF ;-
MOVWF LED_DATA1
MOVLW 0XFF
MOVWF LED_DATA2
BTFSC KEY_DAY
BTFSS SECOND
GOTO LED_DISP_DAY1
MOVLW 0XFF
MOVWF LED_DATA3
GOTO LED_DISP_DAY2
LED_DISP_DAY1:
MOVFW RTC_DAY
MOVWF R0
INCF R0
BTFSS R0,3
DECF R0
MOVFW R0
CALL LED_SEG
MOVWF LED_DATA3
LED_DISP_DAY2:
MOVLW 0X7F
MOVWF R1
GOTO LED_OPT_END
;---------------------------------
;5.秒数据显示:
;---------------------------------
LED_DISP_SECOND:
MOVLW 0xFF
MOVWF LED_DATA0
MOVLW 0XEF
MOVWF LED_DATA1
SWAPF RTC_SECOND,W
CALL LED_SEG
ANDLW 0XEF
MOVWF LED_DATA2
MOVFW RTC_SECOND
CALL LED_SEG
MOVWF LED_DATA3
MOVLW 0XBF
MOVWF R1
GOTO LED_OPT_END
LED_OPT_END:
MOVFW R1
MOVWF LED_DATA4
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;200毫秒延时子程序
;延时时间:2+(256×3+13)×256+2=199940μS
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
DELAY200MS:
CLRF R7
CLRF R6
DECFSZ R6
GOTO $-1
CLRWDT
INCF R6
INCF R6
DECFSZ R6
GOTO $-1
DECFSZ R7
GOTO $-8
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
INCLUDE <DS1302.ASM>
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;PIC设置子程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
PIC_INITAL:
CLRF STATUS
CLRF PCLATH
;**BANK0**
CLRF PORTB
CLRF PORTC
BSF COM_1
BSF COM_2
BSF COM_3
BSF COM_4
;设置T1为内部时钟,不分频,T1模块暂时处理关闭状态
CLRF T1CON
CLRF TMR1L
CLRF TMR1H
;CCP1为比较模式,50MS比较中断(50000):
MOVLW B'00001011'
MOVWF CCP1CON
MOVLW LOW(.2000)
MOVWF CCPR1L
MOVLW HIGH(.2000)
MOVWF CCPR1H
;T2设置;用于步进电机运转控制:
; CLRF TMR2
; MOVLW B'00001001'
CLRF T2CON ;设置T2的预分频4,后分频2,4×250×2=2MS
CLRF ADCON0 ;将ATAD时间设置为4.0uS
;**BANK1**
BSF STATUS,RP0
MOVLW B'10111111'
;BIT7: 禁止PORTB上拉=1
;BIT6: 中断边沿选择位,现不使用
;BIT5: T0在T0CKI(RA4)引脚信号的跳变沿计数=1,=0为内部时钟
;BIT4: 在T0CKI 引脚信号的下降沿进行递增计数=1,=0为上升沿
;BIT3: 分频器给WDT=1
;BIT2-0: 分频系数:111=分频(256)
MOVWF OPTION_REG
MOVLW 0FDH
MOVWF TRISA ;除RA0,1外全为输入脚
CLRF TRISB ;RB全为输出脚
CLRF TRISC ;RC全为输出脚
CLRF PIE1
CLRF PIE2
BSF PIE1,CCP1IE
; BSF PIE1,TMR1IE
; MOVLW .249 ;4×(249+1)×2=2MS定时中断
; MOVWF PR2
; MOVLW 50H
MOVLW 0x07
MOVWF ADCON1 ;AD关闭
;**BANK0**
CLRF STATUS
;内存清零:
MOVLW 20H
MOVWF FSR
CLRF INDF
INCF FSR
BTFSS FSR,7
GOTO $-3
;清中断标志:
CLRF PIR1
CLRF PIR2
CLRF INTCON
RETURN
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;CCP1中断服务子程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CCP1_PROG:
BCF PIR1,CCP1IF
BSF FLAG_4MS
INCF TIMER_4MS
MOVLW .5
SUBWF TIMER_4MS,W
BTFSS STATUS,C
GOTO LED_OUT;INT_END
CLRF TIMER_4MS
BSF FLAG_20MS
INCF TIMER_20MS
MOVLW .50
SUBWF TIMER_20MS,W
BTFSS STATUS,C
GOTO LED_OUT;INT_END
CLRF TIMER_20MS
BSF FLAG_500MS
MOVLW 01H ;秒显位取反
XORWF TYPE
; GOTO INT_END
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;3. LED数据显示子程序:
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
LED_OUT:
BTFSC COM_4
GOTO LED_OUT1
BSF COM_4
MOVFW LED_DATA0
MOVWF PORTB
BCF COM_0
GOTO INT_END
LED_OUT1:
BTFSC COM_0
GOTO LED_OUT2
BSF COM_0
MOVFW LED_DATA1
MOVWF PORTB
BCF COM_1
GOTO INT_END
LED_OUT2:
BTFSC COM_1
GOTO LED_OUT3
BSF COM_1
MOVFW LED_DATA2
MOVWF PORTB
BCF COM_2
GOTO INT_END
LED_OUT3:
BTFSC COM_2
GOTO LED_OUT4
BSF COM_2
MOVFW LED_DATA3
MOVWF PORTB
BCF COM_3
GOTO INT_END
LED_OUT4:
BSF COM_3
MOVFW LED_DATA4
MOVWF PORTB
BCF COM_4
GOTO INT_END
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ORG 2100H
;---00H~0FH---------------
DATA 51H,06H,0BH,40H,51H,00H
DATA 00H,00H,00H,00H,00H
DATA 00H,00H,00H,00H,00H
ORG 2130H
DATA 00H
ORG 2007H
; DATA 3B7AH;调试参数
DATA 0846H;生产参数
;***************************************
END
;*************************************
; DS1302读写与设置子程序
;*************************************
;说明:
;用于对MAXIN(DALLAS)的DS1302进行读写与相关设置
;DS1302写指令格式:(低位在前方式收发数据)
;-----------------------------------------------------------
;| BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 |
;| 1 | RAM/CK | A4 | A3 | A2 | A1 | A0 | R/W |
;-----------------------------------------------------------
;第6位为L时,读写时钟;为H时,读写内部RAM
;第0位为L时,写DS1302;为H时,读DS1302
;#DEFINE DS1302_RAM_R 0xC1
;#DEFINE DS1302_RAM_W 0xC0
;#DEFINE DS1302_RTC_R 0x81
;#DEFINE DS1302_RTC_W 0X80
;相关读写RTC数据指令(单字节模式下):
;#DEFINE DS1302_SEC_W 0X80
;#DEFINE DS1302_SEC_R 0x81;秒读写
; BIT7=振荡时钟使能(0),BIT6~4=十位秒数据,BIT3~0=个位秒数据
;#DEFINE DS1302_MIN_W 0X82
;#DEFINE DS1302_MIN_R 0X83;分读写
; BIT7=未用,BIT6~4=十位分钟数据,BIT3~0=个位分钟数据
;#DEFINE DS1302_HOUR_W 0X84
;#DEFINE DS1302_HOUR_R 0X85;时读写
; BIT7=12/24制指示,12H=1,24H=0;
; BIT6:未用,读为0
; BIT5:24小时制为小时的十位数据;12小时制为上午(0)/下午(1)指示
; BIT4:小时数据的十位
; BIT3~0:个位小时数据.
;#DEFINE DS1302_DATE_W 0X86
;#DEFINE DS1302_DATE_R 0X87;日读写
; BIT7~6:未用,读为0
; BIT5~4:十位日期
; BIT3~0:个位日期
;#DEFINE DS1302_MONTH_W 0X88
;#DEFINE DS1302_MONTH_R 0X89;月读写
; BIT7~5:未用,读为0
; BIT4:十位月份
; BIT3~0:个位月份
;#DEFINE DS1302_DAY_W 0X8A
;#DEFINE DS1302_DAY_R 0X8B;周读写
; BIT7~3:未用,读为0
; BIT2~0:星期数据
;#DEFINE DS1302_YEAR_W 0X8C
;#DEFINE DS1302_YEAR_R 0X8D;年读写
; BIT7~4:十位年数据(固定为20)
; BIT3~0:个位年
;#DEFINE DS1302_SET1_W 0X8E
;#DEFINE DS1302_SET1_R 0X8F;配置1读写
; BIT7: 写保护,H为禁止写保护
; BIT6~0:未用,读为0
;#DEFINE DS1302_SET2_W 0X90
;#DEFINE DS1302_SET2_R 0X91;配置2读写
; BIT7~4:涓流充电使能=1010,其它数据不使能
; BIT3~2:充电二极管选择:01=1个二极管,10=2个二极管串联
; BIT1~0:充电电阻选择:00=0Ω,01=2KΩ,10=4KΩ,11=8KΩ
;------------------------------------------------
;需设置的管脚:
; #DEFINE RTC_CS PORTC,0;DS1302片选,H=选通
; #DEFINE RTC_DA PORTC,1;DS1302数据,I/O
; #DEFINE RTC_CK PORTC,2;DS1302时钟
;需使用的寄存器:
; RTC_SECOND EQU 50H ;秒数据
; #DEFINE RTC_MINUTES RTC_SECOND+1;分钟数据
; #DEFINE RTC_HOUR RTC_SECOND+2;小时数据
; #DEFINE RTC_DATE RTC_SECOND+3;日期数据
; #DEFINE RTC_MONTH RTC_SECOND+4;月份数据
; #DEFINE RTC_DAY RTC_SECOND+5;日期数据
; #DEFINE RTC_YEAR RTC_SECOND+6;年数据
; #DEFINE RTC_SET1 RTC_SECOND+7
; #DEFINE RTC_SET2 RTC_SECOND+8;涓流充电控制
;涉及到的工作寄存器:
; W:中间寄存器
; R0:命令传输寄存器
; R1:数据传输寄存器
; R7:读取字节数寄存器
; R6:位发送控制寄存器
; FSR:INDF:间接寄存器
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
; 子程序开始
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;*************************************
;DS1302读出时钟数据程序:
;*************************************
DS1302_DATA_READ:
MOVLW .7
MOVWF R7
MOVLW DS1302_SEC_R
MOVWF R2
MOVLW RTC_SECOND
MOVWF FSR
MOVFW R2
CALL DS1302_RTC_READ
MOVWF INDF
INCF FSR
INCF R2
INCF R2
DECFSZ R7
GOTO $-7
RETURN
;*************************************
;DS1302初始化程序:
;*************************************
DS1302_INIT:
CALL DS1302_DATA_READ
;写保护关闭
DS1302_WP_DISABLE:
CLRF R1
MOVLW DS1302_SET1_W
CALL DS1302_RTC_WRITE
DS1302_CHARGE:
;设置涓流充电参数:
MOVLW B'00001011';B'10101011';(涓流充电允许=1010,2个二极管=10,充电限流电阻8KΩ=11)
MOVWF R1
MOVLW DS1302_SET2_W
CALL DS1302_RTC_WRITE
DS1302_HOUR_SYS:
;设置时间制:若是12小时制,则改为24小时制
BTFSS RTC_HOUR,7
GOTO $+.6
BCF RTC_HOUR,7
MOVFW RTC_HOUR
MOVWF R1
MOVLW DS1302_HOUR_W
CALL DS1302_RTC_WRITE
;检查时钟振荡,停振则开启:
DS1302_OSO_SET:
BTFSS RTC_SECOND,7
GOTO $+.5
CLRF RTC_SECOND
CLRF R1
MOVLW DS1302_SEC_W
CALL DS1302_RTC_WRITE
;写保护打开:
DS1302_WP_ENABLE:
MOVLW 80H
MOVWF R1
MOVLW DS1302_SET1_W
CALL DS1302_RTC_WRITE
RETURN
;*************************************
;DS1302读数据子程序:
;*************************************
;W:给定的指令(含地址)
;R1:读出的数据
DS1302_RTC_READ:
BCF RTC_CK
BSF RTC_CS
CALL DS1302_OUT
CALL DS1302_IN
BCF RTC_CS
RETURN
;*************************************
;DS1302写数据子程序:
;*************************************
DS1302_RTC_WRITE:
;W:给定的指令(含地址)
;R1:需写入的数据
BCF RTC_CK
BSF RTC_CS
CALL DS1302_OUT
MOVFW R1
CALL DS1302_OUT
BCF RTC_CS
RETURN
;-------------------------------------
;DS1302字节数据发送子程序:
;-------------------------------------
DS1302_OUT:
MOVWF R0
MOVLW .8
MOVWF R6
BSF STATUS,RP0
BCF TRISA,0;RTC_DA
CLRF STATUS
DS1302_OUT1:
BCF RTC_CK
BTFSS R0,0
BCF RTC_DA
BTFSC R0,0
BSF RTC_DA
GOTO $+1
GOTO $+1
RRF R0
BSF RTC_CK
DECFSZ R6
GOTO DS1302_OUT1
BSF STATUS,RP0
BSF TRISA,0;RTC_DA
CLRF STATUS
BCF RTC_CK
RETURN
;-------------------------------------
;DS1302字节数据接收子程序:
;-------------------------------------
DS1302_IN:
MOVLW .8
MOVWF R6
DS1302_IN1:
BTFSS RTC_DA
BCF STATUS,C
BTFSC RTC_DA
BSF STATUS,C
RRF R0
BSF RTC_CK
GOTO $+1
GOTO $+1
BCF RTC_CK
DECFSZ R6
GOTO DS1302_IN1
MOVFW R0
RETURN
一周热门 更多>