PIC16F887数码管显示10 37 81怎么编写程序 小白求教

2019-03-25 19:07发布

最好有详细程序参考下 现在就显示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
       
       

一周热门 更多>