昨天晚上刚弄完工的,相机不在,用手机拍的,不清晰。日历,星期,温度,农历滚动显示:高手看了别笑话。
- ;***************引脚定义,根据使用不同的管脚而改动*************
- ;农历,星期,1302程序由网上下载
- ABCD EQU P2 ;行扫描0-7
- SEG EQU P1.1 ; 红
- SER EQU P1.0 ;内容发送绿
- SRCLK EQU P1.2 ;串行CP端
- RCLK EQU P1.3 ;输出CP端
- EN EQU P1.4 ;EN为138使能端.高电平关闭显示;低电平显示
- DQ EQU P3.6 ;温度18b20
- BEEP EQU P3.7 ;蜂鸣器
- AN EQU P0.1 ;中间按键
- ANS EQU P0.0 ;上按键
- ANX EQU P0.4 ;下按键
- ANZ EQU P0.2 ;左按键
- ANY EQU P0.3 ;右按键
- T_CLK EQU P0.7 ;实时时钟时钟线引脚
- T_IO EQU P0.6 ;实时时钟数据线引脚
- T_RST EQU P0.5 ;实时时钟复位线引脚
- ;温度存放地址
- A_BIT EQU 22H ;存放个位数变量
- B_BIT EQU 21H ;存放十位数变量
- C_BIT EQU 24H ;存放 小数变量
- D_BIT EQU 20H ;存放 百 位数变量
- FLAG EQU 26H ;DS18B20是否存在标志
- XSD EQU 23H ;点
- WDFH EQU 25H ;℃
- WDGW EQU 27H ;温度高位值
- WDDW EQU 28H ;温度低位值
- QUSHU EQU 28H
- QUSHU1 EQU 08H
- QUSHU2 EQU 09H
- LSTZSJ1 EQU 0AH
- LSTZSJ EQU 0BH
- MIAO EQU 20H ;秒
- FEN EQU 21H ;分
- SHI EQU 22H ;时
- RIQI EQU 23H ;日
- YUE EQU 24H ;月 ACC.7=0为2000年
- XQI EQU 25H ;星期
- NIAN EQU 26H ;年
- start_year EQU 01; 定义查询表起始年份,01--199 表示 1901-2099 年
- ;以下三单元为需转换的公历日期 是子程序的入口数据
- time_year EQU NIAN
- time_month EQU YUE ;BIT7 表示世纪,为 1 表示 19 世纪,为 0 表示 20 世纪
- time_date EQU RIQI
- ;以下三单元存转换后农历日期 与入口单元重叠,如要保留入口信息,请重定义出口地址
- CONvert_yeAr DATA 3Fh
- CONvert_mONth DATA 3Eh ;BIT7 为 1 表示闰月
- CONvert_dAte DATA 3Dh
- temp_Byte4 DATA 3Bh
- temp_Byte5 DATA 3Ch
- temp_Byte1 EQU 20H
- temp_Byte2 EQU 21H
- temp_Byte3 EQU 22H
- ;*************************************************************
- ;*********************中断入口程序****************************
- ORG 0000H
- LJMP MAIN
- ; ORG 0003H
- ; RETI
- ; ORG 000BH ; 定时器 T0中断入口
- ; JMP EXT0 ; 跳至T0中断子程序
- ; ORG 0013H
- ; RETI
- ;; ORG 001BH
- ; RETI
- ; ORG 0023H
- ; RETI
- ;***************主程序****************************************/
- MAIN: MOV SP,#69H ;堆栈首址
- LCALL BEEP_BZ
- LCALL AN_DEL
- LCALL BEEP_BZ ;开机鸣响2声
- LCALL RE_TEMP ;对DS18B20初始化及读取
- LCALL GET1302 ;读时间
- MOV A,MIAO
- JNB ACC.7,STRAT ;如果秒最高位是1初始化时钟
- LCALL IN_1302 ;时钟芯片初始化
- STRAT: ; MOV SP,#69H ;堆栈首址
- ; MOV R0,#30H ;初使化寄存显示单元
- ; MOV R1,#74 ;30H-单元清零
- ; MOV A,#0
- ST: ; MOV @R0,A
- ; INC R0
- ; DJNZ R1,ST
- ST1:
- LCALL Get1302 ;读取时间
- LCALL XSSJ ;时间数据转换
- LCALL PLAY1 ;显示时间
- MOV A,MIAO ;如果秒=30显示滚动日期
- CJNE A,#30H,ST2
- LCALL GDRQ
- ST2: JNB ANZ,WD ;按下左键调用温度显示
- ; JNB ANY,YYUE ;按下右键调用音乐
- JNB ANX,G_DRQ ;按下下键调用滚动显示日历
- JNB AN,TZSJ ;按下中间按键调用调时
- JMP ST1
- ;*****************************
- G_DRQ:LCALL GDRQ
- JMP ST1
- ;*****************************************************
- WD: LCALL AN_DEL
- JB ANZ,WD_OUT
- LCALL BEEP_BZ
- WD_1: LCALL RE_TEMP ;读取温度
- LCALL TURN ;转化温度子程序
- LCALL XSWD ;温度数据转换
- LCALL PLAY ;显示
- JB ANZ,WD_1
- LCALL AN_DEL
- LCALL BEEP_BZ
- JNB ANZ,WDOUT
- WD_OUT:RET
- GDRQ: LCALL Get1302 ;读取时间
- LCALL RQFL ;调用日期分离程序
- LCALL L30_
- RET
- WDOUT:LJMP ST1
- ;*******************************************调整时间程序*************
- TZSJ:
- LCALL AN_DEL
- JNB AN,$
- LCALL BEEP_BZ
- TZSJ_1: LCALL S_NIAN ;显示调年
- JNB ANS, N_J1 ;年+1
- JNB ANX,N_1 ;年-1
- JNB ANY,TZ_YUE ;调月
- JNB AN,TZSJOUT;确认
- JNB ANZ, TZ_NOUT
- JMP TZSJ_1
- TZSJOUT:;LCALL GetWeek
- LCALL Set1302
- LCALL BEEP_BZ
- TZ_NOUT: LJMP ST1
- N_J1: LCALL AN_DEL ;年+1
- LCALL BEEP_BZ
- LCALL NIAN_J1
- LJMP TZSJ_1
- N_1: LCALL AN_DEL ;年-1
- LCALL BEEP_BZ
- LCALL NIAN_1
- LJMP TZSJ_1
- ;***************************************
- Y_J1: LCALL AN_DEL;月+1
- LCALL BEEP_BZ
- LCALL YUE_J1
- LJMP TZ_YUE1
- Y_1: LCALL AN_DEL ;月-1
- LCALL BEEP_BZ
- LCALL YUE_1
- LJMP TZ_YUE1
- ;*********
- TZ_YUE: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_YUE1: LCALL S_YUE;显示调月
- JNB ANS,Y_J1;月+1
- JNB ANX,Y_1;月-1
- JNB ANY,TZ_RIQI;调日期
- JNB AN,TZ_YUEOUT
- JNB ANZ, TZ_YOUT
- JMP TZ_YUE1
- TZ_YUEOUT:LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_YOUT:LJMP ST1
- ;***************************************
- R_J1: LCALL AN_DEL;月+1
- LCALL BEEP_BZ
- LCALL RIQI_J1
- LJMP TZ_RIQI1
- R_1: LCALL AN_DEL ;月-1
- LCALL BEEP_BZ
- LCALL RIQI_1
- LJMP TZ_RIQI1
- ;*********
- TZ_RIQI: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_RIQI1: LCALL S_RIQI;显示调日期
- JNB ANS,R_J1;日期+1
- JNB ANX,R_1;日期-1
- JNB ANY,TZ_SHI;
- JNB AN,TZ_RIQIOUT
- JNB ANZ, TZ_ROUT
- JMP TZ_RIQI1
- TZ_RIQIOUT:;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_ROUT:LJMP ST1
- ;***************************************
- S_J1: LCALL AN_DEL;时+1
- LCALL BEEP_BZ
- LCALL SHI_J1
- LJMP TZ_SHI1
- S_1: LCALL AN_DEL ;时-1
- LCALL BEEP_BZ
- LCALL SHI_1
- LJMP TZ_SHI1
- ;*********
- TZ_SHI: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_SHI1: LCALL S_SHI;显示调时
- JNB ANS,S_J1;时+1
- JNB ANX,S_1;时-1
- TZ_SHI4:JNB ANY,TZ_FEN
- JNB AN,TZ_SHIOUT
- JNB ANZ, TZ_SOUT
- JMP TZ_SHI1
- TZ_SHIOUT:;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_SOUT: LJMP ST1
- ;*********
- TZ_FEN: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_FEN1: LCALL S_FEN;显示调分
- JNB ANS,F_J1;分+1
- JNB ANX,F_1;分-1
- ;TZ_RIQI4:JNB ANY,TZ_FEN;
- JNB AN,TZ_FENOUT
- JNB ANZ, TZ_FOUT
- JMP TZ_FEN1
- TZ_FENOUT:MOV MIAO,#0
- ;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_FOUT:LJMP ST1
- ;***************************************
- F_J1: LCALL AN_DEL;时+1
- LCALL BEEP_BZ
- LCALL FEN_J1
- LJMP TZ_FEN1
- F_1: LCALL AN_DEL ;时-1
- LCALL BEEP_BZ
- LCALL FEN_1
- LJMP TZ_FEN1
- ;***************************************************
- ;YYUE: LCALL START1 ;调用音乐
- ; RET
- SHIJ: LCALL IN_1302 ;调用时间初始化
- RET
- AN_DEL: MOV R6,#0
- AN_DEL1:LCALL DEL
- DJNZ R6,AN_DEL1
- RET
- ;********************调整年月日程序*********************************/=======================================================================
- S_NIAN: MOV 40H,#52 ;显示调年
- MOV 41H,#30
- MOV A,NIAN
- ANL A,#0FH
- MOV 43H,A
- MOV A,NIAN
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_YUE: MOV 40H,#52 ;显示调月
- MOV 41H,#31
- MOV A,YUE
- ANL A,#0FH
- MOV 43H,A
- MOV A,YUE
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_RIQI: MOV 40H,#52 ;显示调日期
- MOV 41H,#32
- MOV A,RIQI
- ANL A,#0FH
- MOV 43H,A
- MOV A,RIQI
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_SHI: MOV 40H,#52 ;显示调时
- MOV 41H,#53
- MOV A,SHI
- ANL A,#0FH
- MOV 43H,A
- MOV A,SHI
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_FEN: MOV 40H,#52 ;显示调分
- MOV 41H,#54
- MOV A,FEN
- ANL A,#0FH
- MOV 43H,A
- MOV A,FEN
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- ;;;;;;;;;;;;;;;;;;;;
- FEN_J1:MOV LSTZSJ1,FEN;分+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#60,FEN_J12;小时60清0
- MOV LSTZSJ,#0
- FEN_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV FEN,LSTZSJ1
- RET
- FEN_1: MOV LSTZSJ1,FEN;分-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#0,FEN_12 ;分是0加60
- MOV LSTZSJ,#60
- FEN_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV FEN,LSTZSJ1
- RET
- ;;;;
- SHI_J1:MOV LSTZSJ1,SHI;小时+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#24,SHI_J12;小时24清0
- MOV LSTZSJ,#0
- SHI_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV SHI,LSTZSJ1
- RET
- SHI_1: MOV LSTZSJ1,SHI;小时-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#0,SHI_12 ;小时是0加24
- MOV LSTZSJ,#24
- SHI_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV SHI,LSTZSJ1
- RET
- ;;;;
- RIQI_J1:MOV LSTZSJ1,RIQI;日+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#32,RIQI_J12;日是32清0
- MOV LSTZSJ,#1
- RIQI_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV RIQI,LSTZSJ1
- RET
- RIQI_1: MOV LSTZSJ1,RIQI;日-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,RIQI_12 ;日是1加32
- MOV LSTZSJ,#32
- RIQI_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV RIQI,LSTZSJ1
- RET
- ;;;;
- YUE_J1:MOV LSTZSJ1,YUE;月+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#13,YUE_J12;月是13清0
- MOV LSTZSJ,#1
- YUE_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV YUE,LSTZSJ1
- RET
- YUE_1: MOV LSTZSJ1,YUE;月-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,YUE_12
- MOV LSTZSJ,#13
- YUE_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV YUE,LSTZSJ1
- RET
- NIAN_J1:MOV LSTZSJ1,NIAN;年+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;年+1
- MOV A,LSTZSJ
- CJNE A,#100,NIAN_J12;年是100清0
- MOV LSTZSJ,#01
- NIAN_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV NIAN,LSTZSJ1
- RET
- NIAN_1: ;CJNE A,#13H,SMAJ_QR
- MOV LSTZSJ1,NIAN;年-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,NIAN_12
- MOV LSTZSJ,#100
- NIAN_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV NIAN,LSTZSJ1
- RET
- ;;;;;;;;;;;;;
- TSSJTZ:MOV A,LSTZSJ1;数据调整,10到16进制如21:00100001转为 21:00010101
- ANL A,#0FH
- MOV LSTZSJ,A
- MOV A,LSTZSJ1
- SWAP A
- ANL A,#0FH
- MOV B,#10
- MUL AB
- ADD A,LSTZSJ
- MOV LSTZSJ,A
- RET
- TSSJTZ1:MOV A,LSTZSJ ;数据调整,16到10进制
- MOV B,#10
- DIV AB
- SWAP A
- MOV LSTZSJ,A
- MOV A,B
- ORL A,LSTZSJ
- MOV LSTZSJ1,A
- RET ;*/
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE_88 : MOV 2BH,#8 ;扫描的行数,共8行
- FF2: LCALL LINE_11 ;扫描显示1行子程序
- DJNZ 2BH,FF2 ;扫描下一行
- MOV 2DH,#0
- RET
- ;*********扫描显示一行子程序********************
- LINE_11: LCALL MSTR_YD_
- MOV 30H,#0
- MOV 31H,#0
- LCALL SEND_11 ;发送串行口子程序
- LCALL XTH ;选通行子程序
- LCALL DL22US
- INC 2DH
- RET
- SEND_11: MOV R0,#30H
- MOV R1,#35H
- MOV R5,#4 ;一行有2个字节;如每次显示字数不同要作相应改动
- LQ_11: MOV R2,#8 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- LCALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_11 ;2个字节全部移入了没有,未继续
- RET ;
- ;*************************************** 日期分离程序====================================
- RQFL: MOV 40H,#12
- MOV 41H,#12
- MOV 42H,#12
- MOV 43H,#12
- MOV A,YUE
- JB ACC.7,RQFL1
- MOV 44H,#2
- MOV 45H,#0
- JMP RQFL3
- RQFL1: MOV 44H,#1
- MOV 45H,#9
- RQFL3:
- MOV A,NIAN
- ANL A,#0FH
- MOV 47H,A
- MOV A,NIAN
- SWAP A
- ANL A,#0FH
- MOV 46H,A
- MOV 48H,#30 ;显示年
- MOV A,YUE
- ANL A,#0FH
- MOV 4AH,A
- MOV A,YUE
- SWAP A
- ANL A,#03H
- JZ YUE_S_1
- YUE_S_2:MOV 49H,A
- YUE_S_3: MOV 4BH,#31 ;显示 月
- MOV A,RIQI
- ANL A,#0FH
- MOV 4DH,A
- MOV A,RIQI
- SWAP A
- ANL A,#03H
- JZ RIQI_S_1
- RIQI_S_2:MOV 4CH,A
- RIQI_S_3:MOV 4EH,#32 ;显示 日
- MOV 4FH,#12
- MOV 50H,#16 ;显示星期
- MOV 51H,#17
- MOV 52H,#12
- LCALL GetWeek
- MOV A,XQI
- ANL A,#07H
- CJNE A,#0,XQ_1
- MOV 53H,#32
- JMP XQ_OUT
- RIQI_S_1:MOV 4CH,#12
- JMP RIQI_S_3
- YUE_S_1: MOV 49H,#12
- JMP YUE_S_3
- XQ_1: ADD A,#41
- MOV 53H,A
- XQ_OUT:
- MOV 54H,#12 ;空格
- LCALL RE_TEMP ;读取温度
- LCALL TURN ;转化温度子程序
- MOV 55H,#15 ;T
- MOV 56H,#14 ;:
- MOV 57H,20H ;温度百位
- MOV 58H,21H ;温度十位
- MOV 59H,22H ;温度个位
- MOV 5AH,#13 ;小数点
- MOV 5BH,24H ;温度小数位
- MOV 5CH,#11 ;℃符号
- MOV 5DH,#12
- MOV 5EH,#33 ;农
- MOV 5FH,#34 ;历
- LCALL Get1302
- LCALL CONvert ;调用公历转农历程序
- MOV A,CONvert_mONth
- JNB ACC.7,RQFL4
- MOV 60H,#51
- JMP RQFL5
- RQFL4:MOV 60H,#12
- RQFL5:LCALL NL_YUE ;调用农历月份
- MOV 62H,#31 ;显示月
- LCALL NL_RIQI
- MOV 65H,#12
- MOV 66H,#12
- MOV 67H,#12
- MOV 68H,#12
- ; MOV 69H,#12
- RQFLB: RET
- ;***********************
- NL_YUE: MOV A, CONvert_mONth ;农历月
- ANL A,#1FH
- JNB ACC.4,NL_RIQI0
- ANL A,#0FH
- ADD A,#10
- NL_RIQI0: CJNE A,#1,NL_YUE1
- MOV 61H,#35
- JMP NL_YOUT
- NL_YUE1: CJNE A,#10,NL_YUE2
- MOV 61H,#39
- JMP NL_YOUT
- NL_YUE2: CJNE A,#11,NL_YUE3
- MOV 61H,#37
- JMP NL_YOUT
- NL_YUE3: CJNE A,#12,NL_YUE4
- MOV 61H,#38
- JMP NL_YOUT
- NL_YUE4: ADD A,#41
- MOV 61H,A
- NL_YOUT: RET
- ;***************
- NL_RIQI:MOV A, CONvert_dAte ;农历日
- SWAP A
- ANL A,#0FH
- CJNE A,#0,NL_RIQI1
- MOV 63H,#36 ;显示 初
- JMP NL_ROUT
- NL_RIQI1:CJNE A,#1,NL_RIQI2
- MOV 63H,#39 ;显示 十
- JMP NL_ROUT
- NL_RIQI2:CJNE A,#2,NL_RIQI3
- MOV 63H,#40 ;显示 二十
- JMP NL_ROUT
- NL_RIQI3:CJNE A,#3,NL_ROUT
- MOV 63H,#41 ;显示 三十
- JMP NL_ROUT
- NL_ROUT:MOV A, CONvert_dAte ;农历日
- ANL A,#0FH
- CJNE A,#0,NL_RIQI4
- MOV 64H,#39 ;显示 十
- JMP NL_RIQI5
- NL_RIQI4:ADD A,#41
- MOV 64H,A
- NL_RIQI5: RET
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
- ;;;;;;;;;;;;;;;;;;;;;;;
- L30_: MOV 2DH,#0
- MOV QUSHU,#40H
- MOV 2FH,#37 ;共有多少个半角字符,一个汉字等于两个字符,个数值为实际字数*2+屏长度数
- HHH_: LCALL L31_ ;. 扫描一个字节
- DJNZ 2FH,HHH_ ;字数没完继续
- RET
- L31_: MOV B, #1 ;每次移入内存单元的数据要左移次数次值 ,从第一开始。
- II_: MOV 29H,#5 ;左移速度
- III_: LCALL L32_ ;扫描显示1帧
- DJNZ 29H,III_ ;速度没完继续
- INC B ;左移次数+1
- MOV A,#9
- CJNE A,B,II_ ;如果B中的数超过8就完成1个字节的8次左移显示,否则继续循环.
- INC QUSHU ;日期数据+1---5CH→
- RET
- L32_: MOV 2BH,#8 ;扫描的行数,共8行
- JJ_: LCALL L33_ ;扫描显示1行子程序
- INC 2DH
- DJNZ 2BH,JJ_ ;8行没完继续
- MOV 2DH,#0 ;8行完成后再从0行开始扫描
- RET
- L33_: MOV 2EH,B ;显示内容要左移几次数再显示的赋值给2EH单元
- LCALL SEND_YD ;发送串行口子程序
- LCALL XT_H ;选通行子程序
- LCALL MSTR_YD_ ;将显示内容移入内存单元30H→
- EE_: LCALL ZY
- DJNZ 2EH,EE_
- LCALL ZYXZ ;左移速度同步修正
- RET
- MSTR_YD_:SETB RS1 ;R0,R1-数据存放起始地址,2DH行数据,R3-21H,22H临时数据,R4-每屏的字节数, ,20H日期数据起始地址
- SETB RS0
- MOV R0,#30H
- MOV R1,#35H
- MOV R4,#5 ;每幕显示的字节数加1
- BB_YD_: LCALL L_SHUJU
- MOV @R0,A
- MOV @R1,A
- INC QUSHU ;加1,移到下一个字节的对应位置
- INC R0
- INC R1
- DJNZ R4,BB_YD_
- MOV A,QUSHU
- CLR C
- SUBB A,#5
- MOV QUSHU,A
- CLR RS1
- CLR RS0
- RET
- ;;;使用R0,R1,R6,R7,B,2DH
- L_SHUJU: MOV DPTR,#TAB10
- MOV QUSHU1,R0
- MOV QUSHU2,R1
- MOV R6,B
- MOV R0,QUSHU
- L_SHU: MOV A,@R0
- MOV B,#8
- MUL AB
- MOV R7,A
- MOV A,DPH
- ADD A,B
- MOV DPH,A
- MOV A,R7
- MOV B,2DH
- ADD A,B
- MOVC A,@A+DPTR
- MOV R0,QUSHU1
- MOV R1,QUSHU2
- MOV B,R6
- RET
- ;*****************************发送数据到串口子程序*****************************************************/
- SEND_YD: MOV R0,#30H
- MOV R5,#4 ;如每次显示字数不同要作相应改动
- LQ_YD: CLR C ;清C方便每个字节的移动
- MOV R2,#8 ;每个字节有8位
- MOV A,@R0 ;将显存的字节的单元移入A
- CPL A ;取反
- LCALL DD1_YD ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- DJNZ R5,LQ_YD ;8个字节全部移入了没有,未继续
- RET
- DD1_YD: CLR SRCLK ;清串行CP端
- RLC A ;将每个字节移位
- ; MOV SER,C ;将移入C的位移入信号端
- MOV SEG,C
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD1_YD ;每个字节位移8次够了没有?
- RET
- ;*******选通行子程序***2BH行数据*********************************************************************************/
- XT_H: CLR RCLK ;将输出CP变为低电平为上升沿作准备
- SETB EN ;将使能端变为高电平为下降沿作准备
- MOV R5,2BH
- CJNE R5,#7,HSM_1
- MOV ABCD,#11111110B
- JMP XTH_OUT
- HSM_1: CJNE R5,#6,HSM_2
- MOV ABCD,#11111101B
- JMP XTH_OUT
- HSM_2: CJNE R5,#5,HSM_3
- MOV ABCD,#11111011B
- JMP XTH_OUT
- HSM_3: CJNE R5,#4,HSM_4
- MOV ABCD,#11110111B
- JMP XTH_OUT
- HSM_4: CJNE R5,#3,HSM_5
- MOV ABCD,#11101111B
- JMP XTH_OUT
- HSM_5: CJNE R5,#2,HSM_6
- MOV ABCD,#11011111B
- JMP XTH_OUT
- HSM_6: CJNE R5,#1,HSM_7
- MOV ABCD,#10111111B
- JMP XTH_OUT
- HSM_7: CJNE R5,#8,XTH_OUT
- MOV ABCD,#01111111B
- XTH_OUT:
- SETB RCLK ;输出CP为上升沿,显示一个
- CLR EN ;138可显示
- RET
- ;**********左移一位子程序*******************************************************************************/
- ZY: ;30H后存入显示内容,R0为显示未址,R2为移出高位个数 字数*2+1
- SETB RS1
- CLR RS0
- MOV R2,#5
- MOV R0, #34H ;显示单元未址
- CLR C
- CC: MOV A, @R0
- RLC A ;将后一字节的最高位移到C里,再移到前一字节的最低位
- MOV @R0, A
- DEC R0
- DJNZ R2, CC
- CLR C
- CLR RS1
- CLR RS0
- RET
- ;********************移动查模式时速度同步修正子程序*****************************************************/
- ZYXZ: MOV R5,B
- MOV A,#9
- SUBB A,R5
- MOV R4,A
- AA: LCALL DL22US
- NOP
- DJNZ R4 ,AA
- RET
- ;*********************************************************************************/
- ;********************时间数据转换*************************************=====================================================================*/
- XSSJ:
- MOV A,FEN ;分
- MOV B,#10h
- DIV AB ;把41H高低4位分开
- MOV 43H,A ;高4位存入
- MOV A,B
- MOV 44H,A ;低4位存入
- MOV A,MIAO ;秒
- MOV B,#10h
- DIV AB ;把40H高低4位分开
- mov 45H,A ;高4位存入
- mov a,b
- mov 46H,a ;低4位存入
- MOV A,SHI
- MOV B,#16
- DIV AB
- MOV 40H,A
- MOV A,B
- MOV 41H,A
- MOV 42H,#15
- MOV A,40H
- JNZ XSSJ_1
- MOV 40H,#12
- XSSJ_1: RET
- ;*************************时间显示程序****************************
- PLAY1: MOV DPTR,#TABX
- MOV 2DH,#0
- MOV 2FH,#20 ;速度
- GG1: CALL LINE_8 ;扫描显示1帧
- DJNZ 2FH,GG1
- RET
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE_8 : MOV 2BH,#8 ;扫描的行数,共8行
- FF1: CALL LINE_1 ;扫描显示1行子程序
- DJNZ 2BH,FF1 ;扫描下一行
- MOV A,2DH
- SUBB A ,#8 ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
- MOV 2DH,A
- RET
- ;*********扫描显示一行子程序********************
- LINE_1: CALL MSTR_R ;将显示内容移入内存单元
- CALL MSTR_G
- MOV 35H,#0
- MOV 36H,#0
- ; MOV 3BH,#0
- MOV 3AH,#0
- CALL SEND_1 ;发送串行口子程序
- CALL XTH ;选通行子程序
- CALL DL22US
- INC 2DH
- RET
- ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***2EH,2FH缓冲**************
- SEND_1: MOV R0,#30H
- MOV R1,#38H
- MOV R5,#2 ;一行有2个字节;如每次显示字数不同要作相应改动
- LQ_1: MOV R2,#5 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_1 ;2个字节全部移入了没有,未继续
- CALL SEND_2
- CALL SEND_3
- RET ;
- SEND_2: MOV R0,#32H
- MOV R1,#3AH
- MOV R5,#1
- LQ_2: MOV R2,#2 ;每个字节有2位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_2 ;2个字节全部移入了没有,未继续
- RET
- SEND_3: MOV R0,#33H
- MOV R1,#3BH
- MOV R5,#4
- LQ_3: MOV R2,#5 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_3 ;2个字节全部移入了没有,未继续
- RET
- DD_1: CLR SRCLK ;清串行CP端
- CLR C
- MOV A,R6
- RLC A ;将每个字节移位
- MOV R6,A
- CPL C
- MOV SER,C ;红色
- CLR C
- MOV A,R7
- RLC A
- MOV R7,A
- CPL C
- MOV SEG,C ;绿色
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD_1 ;每个字节位移5次够了没有?
- RET
- ;*************************温度显示程序****************************
- PLAY: MOV DPTR,#TABX
- MOV 2DH,#0
- MOV 2FH,#60 ;速度
- GG: CALL LINE8 ;扫描显示1帧
- DJNZ 2FH,GG
- RET
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE8 : MOV 2BH,#8 ;扫描的行数,共8行
- FF: CALL LINE1 ;扫描显示1行子程序
- DJNZ 2BH,FF ;扫描下一行
- MOV A,2DH
- SUBB A ,#8 ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
- MOV 2DH,A
- RET
- ;*********扫描显示一行子程序********************
- LINE1: CALL MSTR_R ;将显示内容移入内存单元
- CALL MSTR_G
- MOV 34H,#0
- MOV 35H,#0
- MOV 3BH,#0
- CALL SEND ;发送串行口子程序
- CALL XTH ;选通行子程序
- CALL DL22US
- INC 2DH
- RET
- ;****************************************************************************
- ;**显示内容移入内存单元子程序*取红色到30H-34H,绿色35H-39H*2DH取字节数据***********************
- MSTR_R: MOV R0,#30H
- MOV R4,#7 ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
- MOV R1,#40H
- BB_R:
- MOV A,@R1
- MOV B,#8
- MUL AB
- ADD A,2DH
- MOVC A, @A+DPTR
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R4,BB_R
- MOV R1,#40H
- RET
- MSTR_G: MOV R0,#38H
- MOV R4,#7 ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
- MOV R1,#40H
- BB_G:
- MOV A,@R1
- MOV B,#8
- MUL AB
- ADD A,2DH
- MOVC A, @A+DPTR
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R4,BB_G
- MOV R1,#40H
- RET
- ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***R6,R7**************
- SEND: MOV R0,#30H
- MOV R1,#38H
- MOV R5,#6 ;一行有4个字节;如每次显示字数不同要作相应改动
- LQ: MOV R2,#5 ;每个字节有8位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- LCALL DD1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ ;8个字节全部移入了没有,未继续
- CLR SRCLK
- SETB C
- MOV SER,C
- MOV SEG,C
- SETB SRCLK
- RET ;
- DD1: CLR SRCLK ;清串行CP端
- CLR C
- MOV A,R6
- RLC A ;将每个字节移位
- MOV R6,A
- CPL C
- MOV SER,C ;红色
- CLR C
- MOV A,R7
- RLC A
- MOV R7,A
- CPL C
- MOV SEG,C ;绿色
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD1 ;每个字节位移8次够了没有?
- RET
- ;*******选通行子程序***2BH行数据*********************************************************************************/
- XTH: CLR RCLK ;将输出CP变为低电平为上升沿作准备
- SETB EN ;将使能端变为高电平为下降沿作准备
- MOV R5,2BH
- CJNE R5,#8,HSM1
- MOV ABCD,#11111110B
- JMP XTHOUT
- HSM1: CJNE R5,#7,HSM2
- MOV ABCD,#11111101B
- JMP XTHOUT
- HSM2: CJNE R5,#6,HSM3
- MOV ABCD,#11111011B
- JMP XTHOUT
- HSM3: CJNE R5,#5,HSM4
- MOV ABCD,#11110111B
- JMP XTHOUT
- HSM4: CJNE R5,#4,HSM5
- MOV ABCD,#11101111B
- JMP XTHOUT
- HSM5: CJNE R5,#3,HSM6
- MOV ABCD,#11011111B
- JMP XTHOUT
- HSM6: CJNE R5,#2,HSM7
- MOV ABCD,#10111111B
- JMP XTHOUT
- HSM7: CJNE R5,#1,XTHOUT
- MOV ABCD,#01111111B
- XTHOUT:
- SETB RCLK ;输出CP为上升沿,显示一个
- CLR EN ;138可显示
- RET
- ;******22US延时子程序********
- DL22US: MOV R7,#50
- DJNZ R7,$
- RET ;
- DEL: MOV R7,#0
- DJNZ R7,$
- RET
- BEEP_BZ:; CLR BEEP ;蜂鸣器鸣响
- MOV R6,#40
- BEEP_2: CALL DEL
- CPL BEEP
- DJNZ R6, BEEP_2
- SETB BEEP ;蜂鸣器停止
- RET
- ;***********************************字码表****************************************
- TAB10:
- DB 038H,044H,082H,082H,082H,082H,044H,038H;"0",0
- DB 010H,070H,010H,010H,010H,010H,010H,0FEH;"1",1
- DB 07CH,082H,082H,006H,00CH,070H,0FAH,09EH;"2",2
- DB 07EH,044H,00CH,038H,006H,002H,086H,07CH;"3",3
- DB 004H,00CH,01CH,034H,064H,0FEH,004H,03FH;"4",4
- DB 07EH,042H,040H,07CH,042H,002H,086H,07CH;"5",5
- DB 03CH,062H,0C0H,0FCH,082H,082H,0C2H,07CH;"6",6
- DB 0FEH,084H,088H,018H,010H,030H,020H,020H;"7",7
- DB 07CH,082H,082H,07CH,086H,082H,0C6H,07CH;"8",8
- DB 07CH,086H,082H,082H,07EH,002H,084H,078H;"9",9
- DB 000H, 000H, 000H, 000H, 0FCH, 000H, 000H, 000H ;- 10
- DB 080H, 078H, 084H, 080H, 080H, 080H, 084H, 078H ;"C",11
- DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H ;无显示,12
- DB 000H, 000H, 000H, 000H, 030H, 030H, 000H, 000H ;点,13
- DB 000H, 000H, 030H, 030H, 000H, 030H, 030H, 000H ;: 14
- DB 0FEH,092H,010H,010H,010H,010H,010H,038H;"T",15
- DB 7EH,42H,7EH,7EH,48H,7EH,88H,7EH ;温 16
- DB 57H,0FDH,57H,75H,57H,0FDH,55H,8BH ;度 17
- ;DB 0D6H, 092H, 092H, 092H, 09AH, 06CH, 064H, 044H;"W",16
- ;DB 0EEH, 044H, 048H, 070H, 050H, 048H, 044H, 0EEH;"K",17
- DB 0FCH,042H,042H,07CH,040H,040H,0E0H,000H;"P",18
- DB 0CEH,084H,084H,0FCH,084H,084H,0CEH,000H;"H",19
- DB 000H,000H,078H,084H,0FCH,080H,07CH,000H;"e",20
- DB 000H,000H,0DCH,078H,030H,078H,0ECH,000H;"x",21
- DB 018H,000H,038H,008H,008H,008H,008H,0F0H;"j",22
- DB 000H,000H,0FEH,092H,092H,092H,0DAH,000H;"m",23
- DB 000H,020H,000H,060H,020H,020H,020H,0F8H;"i",24
- DB 000H,000H,000H,0D8H,066H,042H,042H,0E7H;"n",25
- DB 0E7H,042H,044H,024H,02CH,028H,018H,010H;"V",26
- DB 03CH,05AH,0AAH,0AAH,0B4H,042H,03CH,000H;"@",27
- DB 000H,000H,03CH,062H,040H,042H,03CH,000H;"c",28
- DB 000H,000H,03CH,042H,042H,042H,03CH,000H;"o",29
- DB 010H,03EH,048H,0BCH,028H,07EH,008H,008H;年,30
- DB 03CH,024H,03CH,024H,03CH,024H,044H,08CH;月,31
- DB 0FCH,084H,084H,0FCH,084H,084H,084H,0FCH;日,32
- DB 10H,0FEH,92H,20H,34H,68H,0A4H,32H;农,33
- DB 7EH,48H,7EH,4AH,4AH,4AH,4AH,96H;历,34
- DB 000H,0FEH,010H,010H,05CH,050H,050H,0FEH;正,35
- DB 040H,0E0H,03EH,06AH,0CAH,04AH,052H,044H;初,36
- DB 010H,01EH,024H,058H,018H,024H,0DBH,018H;冬,37
- DB 000H,075H,05FH,075H,05FH,075H,057H,0B7H;腊,38
- DB 010H,010H,010H,0FEH,010H,010H,010H,010H;十,39
- DB 000H,044H,0FEH,044H,044H,044H,044H,07CH;二十,40
- DB 054H,054H,054H,0FEH,054H,054H,054H,094H;卅,41
- DB 000H,000H,000H,000H,0FEH,000H,000H,000H;一,42
- DB 000H,000H,07CH,000H,000H,0FEH,000H,000H;二,43
- DB 000H,000H,07CH,000H,038H,000H,0FEH,000H;三,44
- DB 000H,0FEH,0AAH,0AAH,0AAH,0CEH,082H,0FEH;四,45
- DB 07CH,010H,010H,07CH,014H,014H,024H,0FEH;五,46
- DB 000H,010H,000H,0FEH,000H,028H,046H,082H;六,47
- DB 000H,020H,020H,0FEH,020H,020H,022H,01CH;七,48
- DB 000H,028H,028H,028H,044H,044H,082H,000H;八,49
- DB 020H,020H,0FCH,028H,028H,028H,04AH,086H;九,50
- DB 05EH,082H,0BAH,092H,0BAH,092H,0BAH,086H;闰,51
- DB 0BEH,2AH,0FEH,6AH,0BEH,0F6H,0BEH,46H ;调,52
- DB 04H,0FEH,0A4H,0B4H,0ECH,0A4H,0E4H,0CH ;时 53
- DB 28H,44H,82H,7CH,24H,24H,44H,8CH;分 54
- DB 04H,24H,6CH,0F6H,25H,72H,0A4H,28H ;秒 55
- ;********************温度数据转换*************************************=====================================================================*/
- XSWD: CALL RE_TEMP
- MOV XSD,#13
- MOV WDFH,#11
- MOV R0,#20H
- MOV R1,#40H
- MOV R2,#7
- XSWD2: MOV A,@R0
- MOV @R1,A
- INC R0
- INC R1
- DJNZ R2,XSWD2
- RET
- ;;;;;;;;;;;;以下是温度程序;;;;;;;;;==
- ; 程序功能:数字温度计(+125- -55)
- RE_TEMP: ;对DS18B20初始化及读取
- SETB DQ
- CALL RESET_1820 ;调用复位子程序
- JB FLAG, STT ;判断DS1820是否存在?
- RET ;*/
- STT: ; DS18B20存在
- MOV A,#0CCH ;跳过ROM匹配
- CALL WRITE_1820 ;写入数据
- MOV A,#44H ;发出温度转换命令
- CALL WRITE_1820 ;写入数据
- CALL RESET_1820 ;准备读温度前先复位
- MOV A,#0CCH ;跳过ROM匹配
- CALL WRITE_1820 ;写入数据
- MOV A,#0BEH ;发出读温度命令
- CALL WRITE_1820 ;写入数据
- CALL READ_1820 ;读出温度数据
- RET ;*/
- RESET_1820: ;复位(有具体的时序要求)
- SETB DQ
- NOP
- NOP
- CLR DQ
- ;主机发出延时521微秒的复位低脉冲
- MOV R1,#2 ; 3
- DLY: MOV R0,#107
- DJNZ R0,$
- DJNZ R1,DLY
- ;然后拉高数据线
- SETB DQ
- NOP
- NOP
- NOP
- MOV R0,#25H
- T2: JNB DQ ,T3 ;等待DS18B20回应
- DJNZ R0, T2
- JMP T4
- T3: SETB FLAG ;置标志位,表示DS1820存在
- JMP T5
- T4: CLR FLAG ;清标志位,表示DS1820不存在
- JMP T7
- T5: MOV R0,#117
- T6: DJNZ R0,T6 ;时序要求延时一段时间
- T7: SETB DQ
- RET
- ;---------------------------------------------- */
- WRITE_1820: ;写入DS18B20(有具体的时序要求)
- MOV R2,#8 ;一共8位数据
- CLR C
- WR1: CLR DQ ;总线低位,开始写入
- MOV R3,#7
- DJNZ R3,[code];***************引脚定义,根据使用不同的管脚而改动*************
- ;农历,星期,1302程序由网上下载
- ABCD EQU P2 ;行扫描0-7
- SEG EQU P1.1 ; 红
- SER EQU P1.0 ;内容发送绿
- SRCLK EQU P1.2 ;串行CP端
- RCLK EQU P1.3 ;输出CP端
- EN EQU P1.4 ;EN为138使能端.高电平关闭显示;低电平显示
- DQ EQU P3.6 ;温度18b20
- BEEP EQU P3.7 ;蜂鸣器
- AN EQU P0.1 ;中间按键
- ANS EQU P0.0 ;上按键
- ANX EQU P0.4 ;下按键
- ANZ EQU P0.2 ;左按键
- ANY EQU P0.3 ;右按键
- T_CLK EQU P0.7 ;实时时钟时钟线引脚
- T_IO EQU P0.6 ;实时时钟数据线引脚
- T_RST EQU P0.5 ;实时时钟复位线引脚
- ;温度存放地址
- A_BIT EQU 22H ;存放个位数变量
- B_BIT EQU 21H ;存放十位数变量
- C_BIT EQU 24H ;存放 小数变量
- D_BIT EQU 20H ;存放 百 位数变量
- FLAG EQU 26H ;DS18B20是否存在标志
- XSD EQU 23H ;点
- WDFH EQU 25H ;℃
- WDGW EQU 27H ;温度高位值
- WDDW EQU 28H ;温度低位值
- QUSHU EQU 28H
- QUSHU1 EQU 08H
- QUSHU2 EQU 09H
- LSTZSJ1 EQU 0AH
- LSTZSJ EQU 0BH
- MIAO EQU 20H ;秒
- FEN EQU 21H ;分
- SHI EQU 22H ;时
- RIQI EQU 23H ;日
- YUE EQU 24H ;月 ACC.7=0为2000年
- XQI EQU 25H ;星期
- NIAN EQU 26H ;年
- start_year EQU 01; 定义查询表起始年份,01--199 表示 1901-2099 年
- ;以下三单元为需转换的公历日期 是子程序的入口数据
- time_year EQU NIAN
- time_month EQU YUE ;BIT7 表示世纪,为 1 表示 19 世纪,为 0 表示 20 世纪
- time_date EQU RIQI
- ;以下三单元存转换后农历日期 与入口单元重叠,如要保留入口信息,请重定义出口地址
- CONvert_yeAr DATA 3Fh
- CONvert_mONth DATA 3Eh ;BIT7 为 1 表示闰月
- CONvert_dAte DATA 3Dh
- temp_Byte4 DATA 3Bh
- temp_Byte5 DATA 3Ch
- temp_Byte1 EQU 20H
- temp_Byte2 EQU 21H
- temp_Byte3 EQU 22H
- ;*************************************************************
- ;*********************中断入口程序****************************
- ORG 0000H
- LJMP MAIN
- ; ORG 0003H
- ; RETI
- ; ORG 000BH ; 定时器 T0中断入口
- ; JMP EXT0 ; 跳至T0中断子程序
- ; ORG 0013H
- ; RETI
- ;; ORG 001BH
- ; RETI
- ; ORG 0023H
- ; RETI
- ;***************主程序****************************************/
- MAIN: MOV SP,#69H ;堆栈首址
- LCALL BEEP_BZ
- LCALL AN_DEL
- LCALL BEEP_BZ ;开机鸣响2声
- LCALL RE_TEMP ;对DS18B20初始化及读取
- LCALL GET1302 ;读时间
- MOV A,MIAO
- JNB ACC.7,STRAT ;如果秒最高位是1初始化时钟
- LCALL IN_1302 ;时钟芯片初始化
- STRAT: ; MOV SP,#69H ;堆栈首址
- ; MOV R0,#30H ;初使化寄存显示单元
- ; MOV R1,#74 ;30H-单元清零
- ; MOV A,#0
- ST: ; MOV @R0,A
- ; INC R0
- ; DJNZ R1,ST
- ST1:
- LCALL Get1302 ;读取时间
- LCALL XSSJ ;时间数据转换
- LCALL PLAY1 ;显示时间
- MOV A,MIAO ;如果秒=30显示滚动日期
- CJNE A,#30H,ST2
- LCALL GDRQ
- ST2: JNB ANZ,WD ;按下左键调用温度显示
- ; JNB ANY,YYUE ;按下右键调用音乐
- JNB ANX,G_DRQ ;按下下键调用滚动显示日历
- JNB AN,TZSJ ;按下中间按键调用调时
- JMP ST1
- ;*****************************
- G_DRQ:LCALL GDRQ
- JMP ST1
- ;*****************************************************
- WD: LCALL AN_DEL
- JB ANZ,WD_OUT
- LCALL BEEP_BZ
- WD_1: LCALL RE_TEMP ;读取温度
- LCALL TURN ;转化温度子程序
- LCALL XSWD ;温度数据转换
- LCALL PLAY ;显示
- JB ANZ,WD_1
- LCALL AN_DEL
- LCALL BEEP_BZ
- JNB ANZ,WDOUT
- WD_OUT:RET
- GDRQ: LCALL Get1302 ;读取时间
- LCALL RQFL ;调用日期分离程序
- LCALL L30_
- RET
- WDOUT:LJMP ST1
- ;*******************************************调整时间程序*************
- TZSJ:
- LCALL AN_DEL
- JNB AN,$
- LCALL BEEP_BZ
- TZSJ_1: LCALL S_NIAN ;显示调年
- JNB ANS, N_J1 ;年+1
- JNB ANX,N_1 ;年-1
- JNB ANY,TZ_YUE ;调月
- JNB AN,TZSJOUT;确认
- JNB ANZ, TZ_NOUT
- JMP TZSJ_1
- TZSJOUT:;LCALL GetWeek
- LCALL Set1302
- LCALL BEEP_BZ
- TZ_NOUT: LJMP ST1
- N_J1: LCALL AN_DEL ;年+1
- LCALL BEEP_BZ
- LCALL NIAN_J1
- LJMP TZSJ_1
- N_1: LCALL AN_DEL ;年-1
- LCALL BEEP_BZ
- LCALL NIAN_1
- LJMP TZSJ_1
- ;***************************************
- Y_J1: LCALL AN_DEL;月+1
- LCALL BEEP_BZ
- LCALL YUE_J1
- LJMP TZ_YUE1
- Y_1: LCALL AN_DEL ;月-1
- LCALL BEEP_BZ
- LCALL YUE_1
- LJMP TZ_YUE1
- ;*********
- TZ_YUE: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_YUE1: LCALL S_YUE;显示调月
- JNB ANS,Y_J1;月+1
- JNB ANX,Y_1;月-1
- JNB ANY,TZ_RIQI;调日期
- JNB AN,TZ_YUEOUT
- JNB ANZ, TZ_YOUT
- JMP TZ_YUE1
- TZ_YUEOUT:LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_YOUT:LJMP ST1
- ;***************************************
- R_J1: LCALL AN_DEL;月+1
- LCALL BEEP_BZ
- LCALL RIQI_J1
- LJMP TZ_RIQI1
- R_1: LCALL AN_DEL ;月-1
- LCALL BEEP_BZ
- LCALL RIQI_1
- LJMP TZ_RIQI1
- ;*********
- TZ_RIQI: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_RIQI1: LCALL S_RIQI;显示调日期
- JNB ANS,R_J1;日期+1
- JNB ANX,R_1;日期-1
- JNB ANY,TZ_SHI;
- JNB AN,TZ_RIQIOUT
- JNB ANZ, TZ_ROUT
- JMP TZ_RIQI1
- TZ_RIQIOUT:;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_ROUT:LJMP ST1
- ;***************************************
- S_J1: LCALL AN_DEL;时+1
- LCALL BEEP_BZ
- LCALL SHI_J1
- LJMP TZ_SHI1
- S_1: LCALL AN_DEL ;时-1
- LCALL BEEP_BZ
- LCALL SHI_1
- LJMP TZ_SHI1
- ;*********
- TZ_SHI: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_SHI1: LCALL S_SHI;显示调时
- JNB ANS,S_J1;时+1
- JNB ANX,S_1;时-1
- TZ_SHI4:JNB ANY,TZ_FEN
- JNB AN,TZ_SHIOUT
- JNB ANZ, TZ_SOUT
- JMP TZ_SHI1
- TZ_SHIOUT:;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_SOUT: LJMP ST1
- ;*********
- TZ_FEN: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_FEN1: LCALL S_FEN;显示调分
- JNB ANS,F_J1;分+1
- JNB ANX,F_1;分-1
- ;TZ_RIQI4:JNB ANY,TZ_FEN;
- JNB AN,TZ_FENOUT
- JNB ANZ, TZ_FOUT
- JMP TZ_FEN1
- TZ_FENOUT:MOV MIAO,#0
- ;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_FOUT:LJMP ST1
- ;***************************************
- F_J1: LCALL AN_DEL;时+1
- LCALL BEEP_BZ
- LCALL FEN_J1
- LJMP TZ_FEN1
- F_1: LCALL AN_DEL ;时-1
- LCALL BEEP_BZ
- LCALL FEN_1
- LJMP TZ_FEN1
- ;***************************************************
- ;YYUE: LCALL START1 ;调用音乐
- ; RET
- SHIJ: LCALL IN_1302 ;调用时间初始化
- RET
- AN_DEL: MOV R6,#0
- AN_DEL1:LCALL DEL
- DJNZ R6,AN_DEL1
- RET
- ;********************调整年月日程序*********************************/=======================================================================
- S_NIAN: MOV 40H,#52 ;显示调年
- MOV 41H,#30
- MOV A,NIAN
- ANL A,#0FH
- MOV 43H,A
- MOV A,NIAN
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_YUE: MOV 40H,#52 ;显示调月
- MOV 41H,#31
- MOV A,YUE
- ANL A,#0FH
- MOV 43H,A
- MOV A,YUE
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_RIQI: MOV 40H,#52 ;显示调日期
- MOV 41H,#32
- MOV A,RIQI
- ANL A,#0FH
- MOV 43H,A
- MOV A,RIQI
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_SHI: MOV 40H,#52 ;显示调时
- MOV 41H,#53
- MOV A,SHI
- ANL A,#0FH
- MOV 43H,A
- MOV A,SHI
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_FEN: MOV 40H,#52 ;显示调分
- MOV 41H,#54
- MOV A,FEN
- ANL A,#0FH
- MOV 43H,A
- MOV A,FEN
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- ;;;;;;;;;;;;;;;;;;;;
- FEN_J1:MOV LSTZSJ1,FEN;分+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#60,FEN_J12;小时60清0
- MOV LSTZSJ,#0
- FEN_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV FEN,LSTZSJ1
- RET
- FEN_1: MOV LSTZSJ1,FEN;分-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#0,FEN_12 ;分是0加60
- MOV LSTZSJ,#60
- FEN_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV FEN,LSTZSJ1
- RET
- ;;;;
- SHI_J1:MOV LSTZSJ1,SHI;小时+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#24,SHI_J12;小时24清0
- MOV LSTZSJ,#0
- SHI_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV SHI,LSTZSJ1
- RET
- SHI_1: MOV LSTZSJ1,SHI;小时-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#0,SHI_12 ;小时是0加24
- MOV LSTZSJ,#24
- SHI_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV SHI,LSTZSJ1
- RET
- ;;;;
- RIQI_J1:MOV LSTZSJ1,RIQI;日+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#32,RIQI_J12;日是32清0
- MOV LSTZSJ,#1
- RIQI_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV RIQI,LSTZSJ1
- RET
- RIQI_1: MOV LSTZSJ1,RIQI;日-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,RIQI_12 ;日是1加32
- MOV LSTZSJ,#32
- RIQI_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV RIQI,LSTZSJ1
- RET
- ;;;;
- YUE_J1:MOV LSTZSJ1,YUE;月+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#13,YUE_J12;月是13清0
- MOV LSTZSJ,#1
- YUE_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV YUE,LSTZSJ1
- RET
- YUE_1: MOV LSTZSJ1,YUE;月-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,YUE_12
- MOV LSTZSJ,#13
- YUE_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV YUE,LSTZSJ1
- RET
- NIAN_J1:MOV LSTZSJ1,NIAN;年+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;年+1
- MOV A,LSTZSJ
- CJNE A,#100,NIAN_J12;年是100清0
- MOV LSTZSJ,#01
- NIAN_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV NIAN,LSTZSJ1
- RET
- NIAN_1: ;CJNE A,#13H,SMAJ_QR
- MOV LSTZSJ1,NIAN;年-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,NIAN_12
- MOV LSTZSJ,#100
- NIAN_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV NIAN,LSTZSJ1
- RET
- ;;;;;;;;;;;;;
- TSSJTZ:MOV A,LSTZSJ1;数据调整,10到16进制如21:00100001转为 21:00010101
- ANL A,#0FH
- MOV LSTZSJ,A
- MOV A,LSTZSJ1
- SWAP A
- ANL A,#0FH
- MOV B,#10
- MUL AB
- ADD A,LSTZSJ
- MOV LSTZSJ,A
- RET
- TSSJTZ1:MOV A,LSTZSJ ;数据调整,16到10进制
- MOV B,#10
- DIV AB
- SWAP A
- MOV LSTZSJ,A
- MOV A,B
- ORL A,LSTZSJ
- MOV LSTZSJ1,A
- RET ;*/
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE_88 : MOV 2BH,#8 ;扫描的行数,共8行
- FF2: LCALL LINE_11 ;扫描显示1行子程序
- DJNZ 2BH,FF2 ;扫描下一行
- MOV 2DH,#0
- RET
- ;*********扫描显示一行子程序********************
- LINE_11: LCALL MSTR_YD_
- MOV 30H,#0
- MOV 31H,#0
- LCALL SEND_11 ;发送串行口子程序
- LCALL XTH ;选通行子程序
- LCALL DL22US
- INC 2DH
- RET
- SEND_11: MOV R0,#30H
- MOV R1,#35H
- MOV R5,#4 ;一行有2个字节;如每次显示字数不同要作相应改动
- LQ_11: MOV R2,#8 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- LCALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_11 ;2个字节全部移入了没有,未继续
- RET ;
- ;*************************************** 日期分离程序====================================
- RQFL: MOV 40H,#12
- MOV 41H,#12
- MOV 42H,#12
- MOV 43H,#12
- MOV A,YUE
- JB ACC.7,RQFL1
- MOV 44H,#2
- MOV 45H,#0
- JMP RQFL3
- RQFL1: MOV 44H,#1
- MOV 45H,#9
- RQFL3:
- MOV A,NIAN
- ANL A,#0FH
- MOV 47H,A
- MOV A,NIAN
- SWAP A
- ANL A,#0FH
- MOV 46H,A
- MOV 48H,#30 ;显示年
- MOV A,YUE
- ANL A,#0FH
- MOV 4AH,A
- MOV A,YUE
- SWAP A
- ANL A,#03H
- JZ YUE_S_1
- YUE_S_2:MOV 49H,A
- YUE_S_3: MOV 4BH,#31 ;显示 月
- MOV A,RIQI
- ANL A,#0FH
- MOV 4DH,A
- MOV A,RIQI
- SWAP A
- ANL A,#03H
- JZ RIQI_S_1
- RIQI_S_2:MOV 4CH,A
- RIQI_S_3:MOV 4EH,#32 ;显示 日
- MOV 4FH,#12
- MOV 50H,#16 ;显示星期
- MOV 51H,#17
- MOV 52H,#12
- LCALL GetWeek
- MOV A,XQI
- ANL A,#07H
- CJNE A,#0,XQ_1
- MOV 53H,#32
- JMP XQ_OUT
- RIQI_S_1:MOV 4CH,#12
- JMP RIQI_S_3
- YUE_S_1: MOV 49H,#12
- JMP YUE_S_3
- XQ_1: ADD A,#41
- MOV 53H,A
- XQ_OUT:
- MOV 54H,#12 ;空格
- LCALL RE_TEMP ;读取温度
- LCALL TURN ;转化温度子程序
- MOV 55H,#15 ;T
- MOV 56H,#14 ;:
- MOV 57H,20H ;温度百位
- MOV 58H,21H ;温度十位
- MOV 59H,22H ;温度个位
- MOV 5AH,#13 ;小数点
- MOV 5BH,24H ;温度小数位
- MOV 5CH,#11 ;℃符号
- MOV 5DH,#12
- MOV 5EH,#33 ;农
- MOV 5FH,#34 ;历
- LCALL Get1302
- LCALL CONvert ;调用公历转农历程序
- MOV A,CONvert_mONth
- JNB ACC.7,RQFL4
- MOV 60H,#51
- JMP RQFL5
- RQFL4:MOV 60H,#12
- RQFL5:LCALL NL_YUE ;调用农历月份
- MOV 62H,#31 ;显示月
- LCALL NL_RIQI
- MOV 65H,#12
- MOV 66H,#12
- MOV 67H,#12
- MOV 68H,#12
- ; MOV 69H,#12
- RQFLB: RET
- ;***********************
- NL_YUE: MOV A, CONvert_mONth ;农历月
- ANL A,#1FH
- JNB ACC.4,NL_RIQI0
- ANL A,#0FH
- ADD A,#10
- NL_RIQI0: CJNE A,#1,NL_YUE1
- MOV 61H,#35
- JMP NL_YOUT
- NL_YUE1: CJNE A,#10,NL_YUE2
- MOV 61H,#39
- JMP NL_YOUT
- NL_YUE2: CJNE A,#11,NL_YUE3
- MOV 61H,#37
- JMP NL_YOUT
- NL_YUE3: CJNE A,#12,NL_YUE4
- MOV 61H,#38
- JMP NL_YOUT
- NL_YUE4: ADD A,#41
- MOV 61H,A
- NL_YOUT: RET
- ;***************
- NL_RIQI:MOV A, CONvert_dAte ;农历日
- SWAP A
- ANL A,#0FH
- CJNE A,#0,NL_RIQI1
- MOV 63H,#36 ;显示 初
- JMP NL_ROUT
- NL_RIQI1:CJNE A,#1,NL_RIQI2
- MOV 63H,#39 ;显示 十
- JMP NL_ROUT
- NL_RIQI2:CJNE A,#2,NL_RIQI3
- MOV 63H,#40 ;显示 二十
- JMP NL_ROUT
- NL_RIQI3:CJNE A,#3,NL_ROUT
- MOV 63H,#41 ;显示 三十
- JMP NL_ROUT
- NL_ROUT:MOV A, CONvert_dAte ;农历日
- ANL A,#0FH
- CJNE A,#0,NL_RIQI4
- MOV 64H,#39 ;显示 十
- JMP NL_RIQI5
- NL_RIQI4:ADD A,#41
- MOV 64H,A
- NL_RIQI5: RET
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
- ;;;;;;;;;;;;;;;;;;;;;;;
- L30_: MOV 2DH,#0
- MOV QUSHU,#40H
- MOV 2FH,#37 ;共有多少个半角字符,一个汉字等于两个字符,个数值为实际字数*2+屏长度数
- HHH_: LCALL L31_ ;. 扫描一个字节
- DJNZ 2FH,HHH_ ;字数没完继续
- RET
- L31_: MOV B, #1 ;每次移入内存单元的数据要左移次数次值 ,从第一开始。
- II_: MOV 29H,#5 ;左移速度
- III_: LCALL L32_ ;扫描显示1帧
- DJNZ 29H,III_ ;速度没完继续
- INC B ;左移次数+1
- MOV A,#9
- CJNE A,B,II_ ;如果B中的数超过8就完成1个字节的8次左移显示,否则继续循环.
- INC QUSHU ;日期数据+1---5CH→
- RET
- L32_: MOV 2BH,#8 ;扫描的行数,共8行
- JJ_: LCALL L33_ ;扫描显示1行子程序
- INC 2DH
- DJNZ 2BH,JJ_ ;8行没完继续
- MOV 2DH,#0 ;8行完成后再从0行开始扫描
- RET
- L33_: MOV 2EH,B ;显示内容要左移几次数再显示的赋值给2EH单元
- LCALL SEND_YD ;发送串行口子程序
- LCALL XT_H ;选通行子程序
- LCALL MSTR_YD_ ;将显示内容移入内存单元30H→
- EE_: LCALL ZY
- DJNZ 2EH,EE_
- LCALL ZYXZ ;左移速度同步修正
- RET
- MSTR_YD_:SETB RS1 ;R0,R1-数据存放起始地址,2DH行数据,R3-21H,22H临时数据,R4-每屏的字节数, ,20H日期数据起始地址
- SETB RS0
- MOV R0,#30H
- MOV R1,#35H
- MOV R4,#5 ;每幕显示的字节数加1
- BB_YD_: LCALL L_SHUJU
- MOV @R0,A
- MOV @R1,A
- INC QUSHU ;加1,移到下一个字节的对应位置
- INC R0
- INC R1
- DJNZ R4,BB_YD_
- MOV A,QUSHU
- CLR C
- SUBB A,#5
- MOV QUSHU,A
- CLR RS1
- CLR RS0
- RET
- ;;;使用R0,R1,R6,R7,B,2DH
- L_SHUJU: MOV DPTR,#TAB10
- MOV QUSHU1,R0
- MOV QUSHU2,R1
- MOV R6,B
- MOV R0,QUSHU
- L_SHU: MOV A,@R0
- MOV B,#8
- MUL AB
- MOV R7,A
- MOV A,DPH
- ADD A,B
- MOV DPH,A
- MOV A,R7
- MOV B,2DH
- ADD A,B
- MOVC A,@A+DPTR
- MOV R0,QUSHU1
- MOV R1,QUSHU2
- MOV B,R6
- RET
- ;*****************************发送数据到串口子程序*****************************************************/
- SEND_YD: MOV R0,#30H
- MOV R5,#4 ;如每次显示字数不同要作相应改动
- LQ_YD: CLR C ;清C方便每个字节的移动
- MOV R2,#8 ;每个字节有8位
- MOV A,@R0 ;将显存的字节的单元移入A
- CPL A ;取反
- LCALL DD1_YD ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- DJNZ R5,LQ_YD ;8个字节全部移入了没有,未继续
- RET
- DD1_YD: CLR SRCLK ;清串行CP端
- RLC A ;将每个字节移位
- ; MOV SER,C ;将移入C的位移入信号端
- MOV SEG,C
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD1_YD ;每个字节位移8次够了没有?
- RET
- ;*******选通行子程序***2BH行数据*********************************************************************************/
- XT_H: CLR RCLK ;将输出CP变为低电平为上升沿作准备
- SETB EN ;将使能端变为高电平为下降沿作准备
- MOV R5,2BH
- CJNE R5,#7,HSM_1
- MOV ABCD,#11111110B
- JMP XTH_OUT
- HSM_1: CJNE R5,#6,HSM_2
- MOV ABCD,#11111101B
- JMP XTH_OUT
- HSM_2: CJNE R5,#5,HSM_3
- MOV ABCD,#11111011B
- JMP XTH_OUT
- HSM_3: CJNE R5,#4,HSM_4
- MOV ABCD,#11110111B
- JMP XTH_OUT
- HSM_4: CJNE R5,#3,HSM_5
- MOV ABCD,#11101111B
- JMP XTH_OUT
- HSM_5: CJNE R5,#2,HSM_6
- MOV ABCD,#11011111B
- JMP XTH_OUT
- HSM_6: CJNE R5,#1,HSM_7
- MOV ABCD,#10111111B
- JMP XTH_OUT
- HSM_7: CJNE R5,#8,XTH_OUT
- MOV ABCD,#01111111B
- XTH_OUT:
- SETB RCLK ;输出CP为上升沿,显示一个
- CLR EN ;138可显示
- RET
- ;**********左移一位子程序*******************************************************************************/
- ZY: ;30H后存入显示内容,R0为显示未址,R2为移出高位个数 字数*2+1
- SETB RS1
- CLR RS0
- MOV R2,#5
- MOV R0, #34H ;显示单元未址
- CLR C
- CC: MOV A, @R0
- RLC A ;将后一字节的最高位移到C里,再移到前一字节的最低位
- MOV @R0, A
- DEC R0
- DJNZ R2, CC
- CLR C
- CLR RS1
- CLR RS0
- RET
- ;********************移动查模式时速度同步修正子程序*****************************************************/
- ZYXZ: MOV R5,B
- MOV A,#9
- SUBB A,R5
- MOV R4,A
- AA: LCALL DL22US
- NOP
- DJNZ R4 ,AA
- RET
- ;*********************************************************************************/
- ;********************时间数据转换*************************************=====================================================================*/
- XSSJ:
- MOV A,FEN ;分
- MOV B,#10h
- DIV AB ;把41H高低4位分开
- MOV 43H,A ;高4位存入
- MOV A,B
- MOV 44H,A ;低4位存入
- MOV A,MIAO ;秒
- MOV B,#10h
- DIV AB ;把40H高低4位分开
- mov 45H,A ;高4位存入
- mov a,b
- mov 46H,a ;低4位存入
- MOV A,SHI
- MOV B,#16
- DIV AB
- MOV 40H,A
- MOV A,B
- MOV 41H,A
- MOV 42H,#15
- MOV A,40H
- JNZ XSSJ_1
- MOV 40H,#12
- XSSJ_1: RET
- ;*************************时间显示程序****************************
- PLAY1: MOV DPTR,#TABX
- MOV 2DH,#0
- MOV 2FH,#20 ;速度
- GG1: CALL LINE_8 ;扫描显示1帧
- DJNZ 2FH,GG1
- RET
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE_8 : MOV 2BH,#8 ;扫描的行数,共8行
- FF1: CALL LINE_1 ;扫描显示1行子程序
- DJNZ 2BH,FF1 ;扫描下一行
- MOV A,2DH
- SUBB A ,#8 ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
- MOV 2DH,A
- RET
- ;*********扫描显示一行子程序********************
- LINE_1: CALL MSTR_R ;将显示内容移入内存单元
- CALL MSTR_G
- MOV 35H,#0
- MOV 36H,#0
- ; MOV 3BH,#0
- MOV 3AH,#0
- CALL SEND_1 ;发送串行口子程序
- CALL XTH ;选通行子程序
- CALL DL22US
- INC 2DH
- RET
- ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***2EH,2FH缓冲**************
- SEND_1: MOV R0,#30H
- MOV R1,#38H
- MOV R5,#2 ;一行有2个字节;如每次显示字数不同要作相应改动
- LQ_1: MOV R2,#5 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_1 ;2个字节全部移入了没有,未继续
- CALL SEND_2
- CALL SEND_3
- RET ;
- SEND_2: MOV R0,#32H
- MOV R1,#3AH
- MOV R5,#1
- LQ_2: MOV R2,#2 ;每个字节有2位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_2 ;2个字节全部移入了没有,未继续
- RET
- SEND_3: MOV R0,#33H
- MOV R1,#3BH
- MOV R5,#4
- LQ_3: MOV R2,#5 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_3 ;2个字节全部移入了没有,未继续
- RET
- DD_1: CLR SRCLK ;清串行CP端
- CLR C
- MOV A,R6
- RLC A ;将每个字节移位
- MOV R6,A
- CPL C
- MOV SER,C ;红色
- CLR C
- MOV A,R7
- RLC A
- MOV R7,A
- CPL C
- MOV SEG,C ;绿色
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD_1 ;每个字节位移5次够了没有?
- RET
- ;*************************温度显示程序****************************
- PLAY: MOV DPTR,#TABX
- MOV 2DH,#0
- MOV 2FH,#60 ;速度
- GG: CALL LINE8 ;扫描显示1帧
- DJNZ 2FH,GG
- RET
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE8 : MOV 2BH,#8 ;扫描的行数,共8行
- FF: CALL LINE1 ;扫描显示1行子程序
- DJNZ 2BH,FF ;扫描下一行
- MOV A,2DH
- SUBB A ,#8 ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
- MOV 2DH,A
- RET
- ;*********扫描显示一行子程序********************
- LINE1: CALL MSTR_R ;将显示内容移入内存单元
- CALL MSTR_G
- MOV 34H,#0
- MOV 35H,#0
- MOV 3BH,#0
- CALL SEND ;发送串行口子程序
- CALL XTH ;选通行子程序
- CALL DL22US
- INC 2DH
- RET
- ;****************************************************************************
- ;**显示内容移入内存单元子程序*取红色到30H-34H,绿色35H-39H*2DH取字节数据***********************
- MSTR_R: MOV R0,#30H
- MOV R4,#7 ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
- MOV R1,#40H
- BB_R:
- MOV A,@R1
- MOV B,#8
- MUL AB
- ADD A,2DH
- MOVC A, @A+DPTR
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R4,BB_R
- MOV R1,#40H
- RET
- MSTR_G: MOV R0,#38H
- MOV R4,#7 ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
- MOV R1,#40H
- BB_G:
- MOV A,@R1
- MOV B,#8
- MUL AB
- ADD A,2DH
- MOVC A, @A+DPTR
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R4,BB_G
- MOV R1,#40H
- RET
- ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***R6,R7**************
- SEND: MOV R0,#30H
- MOV R1,#38H
- MOV R5,#6 ;一行有4个字节;如每次显示字数不同要作相应改动
- LQ: MOV R2,#5 ;每个字节有8位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- LCALL DD1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ ;8个字节全部移入了没有,未继续
- CLR SRCLK
- SETB C
- MOV SER,C
- MOV SEG,C
- SETB SRCLK
- RET ;
- DD1: CLR SRCLK ;清串行CP端
- CLR C
- MOV A,R6
- RLC A ;将每个字节移位
- MOV R6,A
- CPL C
- MOV SER,C ;红色
- CLR C
- MOV A,R7
- RLC A
- MOV R7,A
- CPL C
- MOV SEG,C ;绿色
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD1 ;每个字节位移8次够了没有?
- RET
- ;*******选通行子程序***2BH行数据*********************************************************************************/
- XTH: CLR RCLK ;将输出CP变为低电平为上升沿作准备
- SETB EN ;将使能端变为高电平为下降沿作准备
- MOV R5,2BH
- CJNE R5,#8,HSM1
- MOV ABCD,#11111110B
- JMP XTHOUT
- HSM1: CJNE R5,#7,HSM2
- MOV ABCD,#11111101B
- JMP XTHOUT
- HSM2: CJNE R5,#6,HSM3
- MOV ABCD,#11111011B
- JMP XTHOUT
- HSM3: CJNE R5,#5,HSM4
- MOV ABCD,#11110111B
- JMP XTHOUT
- HSM4: CJNE R5,#4,HSM5
- MOV ABCD,#11101111B
- JMP XTHOUT
- HSM5: CJNE R5,#3,HSM6
- MOV ABCD,#11011111B
- JMP XTHOUT
- HSM6: CJNE R5,#2,HSM7
- MOV ABCD,#10111111B
- JMP XTHOUT
- HSM7: CJNE R5,#1,XTHOUT
- MOV ABCD,#01111111B
- XTHOUT:
- SETB RCLK ;输出CP为上升沿,显示一个
- CLR EN ;138可显示
- RET
- ;******22US延时子程序********
- DL22US: MOV R7,#50
- DJNZ R7,$
- RET ;
- DEL: MOV R7,#0
- DJNZ R7,$
- RET
- BEEP_BZ:; CLR BEEP ;蜂鸣器鸣响
- MOV R6,#40
- BEEP_2: CALL DEL
- CPL BEEP
- DJNZ R6, BEEP_2
- SETB BEEP ;蜂鸣器停止
- RET
- ;***********************************字码表****************************************
- TAB10:
- DB 038H,044H,082H,082H,082H,082H,044H,038H;"0",0
- DB 010H,070H,010H,010H,010H,010H,010H,0FEH;"1",1
- DB 07CH,082H,082H,006H,00CH,070H,0FAH,09EH;"2",2
- DB 07EH,044H,00CH,038H,006H,002H,086H,07CH;"3",3
- DB 004H,00CH,01CH,034H,064H,0FEH,004H,03FH;"4",4
- DB 07EH,042H,040H,07CH,042H,002H,086H,07CH;"5",5
- DB 03CH,062H,0C0H,0FCH,082H,082H,0C2H,07CH;"6",6
- DB 0FEH,084H,088H,018H,010H,030H,020H,020H;"7",7
- DB 07CH,082H,082H,07CH,086H,082H,0C6H,07CH;"8",8
- DB 07CH,086H,082H,082H,07EH,002H,084H,078H;"9",9
- DB 000H, 000H, 000H, 000H, 0FCH, 000H, 000H, 000H ;- 10
- DB 080H, 078H, 084H, 080H, 080H, 080H, 084H, 078H ;"C",11
- DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H ;无显示,12
- DB 000H, 000H, 000H, 000H, 030H, 030H, 000H, 000H ;点,13
- DB 000H, 000H, 030H, 030H, 000H, 030H, 030H, 000H ;: 14
- DB 0FEH,092H,010H,010H,010H,010H,010H,038H;"T",15
- DB 7EH,42H,7EH,7EH,48H,7EH,88H,7EH ;温 16
- DB 57H,0FDH,57H,75H,57H,0FDH,55H,8BH ;度 17
- ;DB 0D6H, 092H, 092H, 092H, 09AH, 06CH, 064H, 044H;"W",16
- ;DB 0EEH, 044H, 048H, 070H, 050H, 048H, 044H, 0EEH;"K",17
- DB 0FCH,042H,042H,07CH,040H,040H,0E0H,000H;"P",18
- DB 0CEH,084H,084H,0FCH,084H,084H,0CEH,000H;"H",19
- DB 000H,000H,078H,084H,0FCH,080H,07CH,000H;"e",20
- DB 000H,000H,0DCH,078H,030H,078H,0ECH,000H;"x",21
- DB 018H,000H,038H,008H,008H,008H,008H,0F0H;"j",22
- DB 000H,000H,0FEH,092H,092H,092H,0DAH,000H;"m",23
- DB 000H,020H,000H,060H,020H,020H,020H,0F8H;"i",24
- DB 000H,000H,000H,0D8H,066H,042H,042H,0E7H;"n",25
- DB 0E7H,042H,044H,024H,02CH,028H,018H,010H;"V",26
- DB 03CH,05AH,0AAH,0AAH,0B4H,042H,03CH,000H;"@",27
- DB 000H,000H,03CH,062H,040H,042H,03CH,000H;"c",28
- DB 000H,000H,03CH,042H,042H,042H,03CH,000H;"o",29
- DB 010H,03EH,048H,0BCH,028H,07EH,008H,008H;年,30
- DB 03CH,024H,03CH,024H,03CH,024H,044H,08CH;月,31
- DB 0FCH,084H,084H,0FCH,084H,084H,084H,0FCH;日,32
- DB 10H,0FEH,92H,20H,34H,68H,0A4H,32H;农,33
- DB 7EH,48H,7EH,4AH,4AH,4AH,4AH,96H;历,34
- DB 000H,0FEH,010H,010H,05CH,050H,050H,0FEH;正,35
- DB 040H,0E0H,03EH,06AH,0CAH,04AH,052H,044H;初,36
- DB 010H,01EH,024H,058H,018H,024H,0DBH,018H;冬,37
- DB 000H,075H,05FH,075H,05FH,075H,057H,0B7H;腊,38
- DB 010H,010H,010H,0FEH,010H,010H,010H,010H;十,39
- DB 000H,044H,0FEH,044H,044H,044H,044H,07CH;二十,40
- DB 054H,054H,054H,0FEH,054H,054H,054H,094H;卅,41
- DB 000H,000H,000H,000H,0FEH,000H,000H,000H;一,42
- DB 000H,000H,07CH,000H,000H,0FEH,000H,000H;二,43
- DB 000H,000H,07CH,000H,038H,000H,0FEH,000H;三,44
- DB 000H,0FEH,0AAH,0AAH,0AAH,0CEH,082H,0FEH;四,45
- DB 07CH,010H,010H,07CH,014H,014H,024H,0FEH;五,46
- DB 000H,010H,000H,0FEH,000H,028H,046H,082H;六,47
- DB 000H,020H,020H,0FEH,020H,020H,022H,01CH;七,48
- DB 000H,028H,028H,028H,044H,044H,082H,000H;八,49
- DB 020H,020H,0FCH,028H,028H,028H,04AH,086H;九,50
- DB 05EH,082H,0BAH,092H,0BAH,092H,0BAH,086H;闰,51
- DB 0BEH,2AH,0FEH,6AH,0BEH,0F6H,0BEH,46H ;调,52
- DB 04H,0FEH,0A4H,0B4H,0ECH,0A4H,0E4H,0CH ;时 53
- DB 28H,44H,82H,7CH,24H,24H,44H,8CH;分 54
- DB 04H,24H,6CH,0F6H,25H,72H,0A4H,28H ;秒 55
- ;********************温度数据转换*************************************=====================================================================*/
- XSWD: CALL RE_TEMP
- MOV XSD,#13
- MOV WDFH,#11
- MOV R0,#20H
- MOV R1,#40H
- MOV R2,#7
- XSWD2: MOV A,@R0
- MOV @R1,A
- INC R0
- INC R1
- DJNZ R2,XSWD2
- RET
- ;;;;;;;;;;;;以下是温度程序;;;;;;;;;==
- ; 程序功能:数字温度计(+125- -55)
- RE_TEMP: ;对DS18B20初始化及读取
- SETB DQ
- CALL RESET_1820 ;调用复位子程序
- JB FLAG, STT ;判断DS1820是否存在?
- RET ;*/
- STT: ; DS18B20存在
- MOV A,#0CCH ;跳过ROM匹配
- CALL WRITE_1820 ;写入数据
- MOV A,#44H ;发出温度转换命令
- CALL WRITE_1820 ;写入数据
- CALL RESET_1820 ;准备读温度前先复位
- MOV A,#0CCH ;跳过ROM匹配
- CALL WRITE_1820 ;写入数据
- MOV A,#0BEH ;发出读温度命令
- CALL WRITE_1820 ;写入数据
- CALL READ_1820 ;读出温度数据
- RET ;*/
- RESET_1820: ;复位(有具体的时序要求)
- SETB DQ
- NOP
- NOP
- CLR DQ
- ;主机发出延时521微秒的复位低脉冲
- MOV R1,#2 ; 3
- DLY: MOV R0,#107
- DJNZ R0,$
- DJNZ R1,DLY
- ;然后拉高数据线
- SETB DQ
- NOP
- NOP
- NOP
- MOV R0,#25H
- T2: JNB DQ ,T3 ;等待DS18B20回应
- DJNZ R0, T2
- JMP T4
- T3: SETB FLAG ;置标志位,表示DS1820存在
- JMP T5
- T4: CLR FLAG ;清标志位,表示DS1820不存在
- JMP T7
- T5: MOV R0,#117
- T6: DJNZ R0,T6 ;时序要求延时一段时间
- T7: SETB DQ
- RET
- ;---------------------------------------------- */
- WRITE_1820: ;写入DS18B20(有具体的时序要求)
- MOV R2,#8 ;一共8位数据
- CLR C
- WR1: CLR DQ ;总线低位,开始写入
- MOV R3,#7
- DJNZ R3,[ DISCUZ_CODE_1 ]nbsp; ;保持16微秒以上
- RRC A ;把字节DATA分成8个BIT环移给C
- MOV DQ, C ;写入一个BIT
- MOV R3,#23
- DJNZ R3,[ DISCUZ_CODE_1 ]nbsp; ;等待
- SETB DQ ;重新释放总线
- NOP
- DJNZ R2,WR1 ;写入下一个BIT
- SETB DQ
- RET
- READ_1820: ;将温度高位和低位从DS18B20中读出
- MOV R4,#2 ; 读出两个字节的数据
- MOV R1,#WDDW ;低位存
- RE0: MOV R2,#8 ;数据一共有8位
- RE1: CLR C
- SETB DQ
- NOP
- NOP
- NOP
- CLR DQ ;读前总线保持为低
- NOP
- NOP
- NOP
- SETB DQ ;开始读总线释放
- MOV R3,#9
- RE2: DJNZ R3,RE2 ;延时18微妙
- MOV C, DQ ; 从总线读到一个BIT
- MOV R3,#23
- RE3: DJNZ R3,RE3 ;等待100μ秒
- RRC A ;把读得的位值环移给A
- DJNZ R2,RE1 ;读下一个BIT
- MOV @R1,A
- DEC R1
- DJNZ R4,RE0
- RET
- ;;;;;;;;;;;;;;;;;;;; */
- TURN: MOV A,WDGW
- JBC ACC.4,TU ;是零下跳到TU
- MOV D_BIT,#0FFH
- DIS: MOV DPTR,#TAB
- MOV A,WDDW ;低位
- ANL A,#0FH ;取小数
- MOVC A,@A+DPTR
- MOV C_BIT,A ;精确到0.1度的小数值
- MOV A,WDDW
- SWAP A ;高低位互换
- ANL A,#0FH
- MOV WDDW,A
- MOV A,WDGW
- ANL A,#0FH
- SWAP A
- ORL A,WDDW;重新组合,为不带小数的温度值
- MOV WDDW,A
- MOV A,D_BIT
- CJNE A,#10,TU_1;百位不是-跳转
- MOV A,WDDW
- DIS_1:
- MOV B,#10
- DIV AB
- MOV A_BIT,B;十位值
- MOV B_BIT,A;个位值
- MOV A,D_BIT
- CJNE A,#0,TU_2;百位不是0跳转
- MOV D_BIT,#12;是0消隐
- DIS_2:MOV A,B_BIT
- CJNE A,#0,TUR;十位不是0转
- MOV B_BIT,#12;是0消隐
- TUR: RET
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- TU: MOV D_BIT,#10;显示-号
- CPL A
- ANL A,#0FH
- mov WDGW,A;取反A存入高位
- MOV A,WDDW
- CPL A
- CLR C
- INC A
- MOV WDDW,A
- MOV A,WDGW
- ADDC A,#0
- MOV WDGW,A
- JMP DIS
- TU_1: MOV A,WDDW
- MOV B,#100
- DIV AB
- MOV D_BIT,A;百位值
- MOV A,B
- JMP DIS_1
- TU_2: CJNE A,#10,TUR;百位不是-跳转
- JMP DIS_2
- TAB:DB 0, 1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
- ;;;;;;;;;;;;以上是温度程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
- TABX:;5*7小字符 用于固定显示时间和温度
- DB 060H, 090H, 090H, 090H, 090H, 090H, 060H, 000H ;0
- DB 020H, 060H, 020H, 020H, 020H, 020H, 070H, 000H ;1
- DB 060H, 090H, 010H, 020H, 040H, 080H, 0F0H, 000H ;2
- DB 060H, 090H, 010H, 060H, 010H, 090H, 060H, 000H ;3
- DB 020H, 060H, 0A0H, 0A0H, 0F0H, 020H, 020H, 000H ;4
- DB 0F0H, 080H, 0E0H, 090H, 010H, 090H, 060H, 000H ;5
- DB 060H, 090H, 080H, 0E0H, 090H, 090H, 060H, 000H ;6
- DB 0F0H, 010H, 010H, 020H, 040H, 040H, 040H, 000H ;7
- DB 060H, 090H, 090H, 060H, 090H, 090H, 060H, 000H ;8
- DB 060H, 090H, 090H, 070H, 010H, 090H, 060H, 000H ;9
- DB 000H, 000H, 000H, 0F0H, 000H, 000H, 000H, 000H ;- 10
- DB 080H, 030H, 040H, 040H, 040H, 040H, 030H, 000H ;C 11
- DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H ; 空格 12
- DB 000H, 000H, 000H, 000H, 060H, 060H, 000H, 000H ;. 13
- DB 000H, 060H, 060H, 000H, 060H, 060H, 000H, 000H ;: 14
- DB 000H, 000H, 080H, 000H, 000H, 080H, 000H, 000H ;: 单冒号15
- /*;程序功能:歌曲演奏
- START1: MOV TMOD,#00000001B; 设T0方式1
- MOV IE,#10000010B;允许T0中断
- MOV DPTR,#TABLE ; 存表首地址
- LOOP: CLR A ; 清零
- MOVC A,@A+DPTR ; 查表
- MOV R1,A ; 定时器高8位存R1
- INC DPTR ; 指针加1
- CLR A ; 清零
- MOVC A,@A+DPTR ; 查表
- MOV R0,A ; 定时器低8位存R0
- ORL A,R1 ; 进行"或"运算
- JZ NEXT0 ; 全0为休止符
- MOV A, R0 ;
- ANL A, R1 ; 进行"与"运算
- CJNE A,#0FFH,NEXT; 全1表示乐曲结束
- RET
- NEXT: MOV TH0,R1 ; 装入高位定时值
- MOV TL0,R0 ; 装入低位定时值
- SETB TR0 ; 启动定时器T0
- setb tf0 ;启动定时器工作
- JMP NEXT1 ; 转移NEXT1处
- NEXT0: CLR TR0 ; 关闭定时器停止发音
- NEXT1: CLR A ; 清零
- INC DPTR ; 指针加1
- MOVC A,@A+DPTR ; 查延时常数
- MOV R2, A ; 延时常数存入R2
- LOOP1: ACALL DDELAY ; 调延时子程序
- DJNZ R2, LOOP1 ; 控制延时次数
- INC DPTR ; 指针加1
- JMP LOOP ; 转移LOOP处
- EXT0: MOV TH0,R1 ; 重装定时值
- MOV TL0,R0 ;
- CPL BEEP ; 反相输出
- RETI ; 中断返回
- DDELAY: MOV R7,#2 ; 延时187ms
- D2: MOV R6,#187 ;
- D3: MOV R5,#248 ;
- DJNZ R5,[ DISCUZ_CODE_1 ]nbsp; ;
- DJNZ R6,D3 ;
- DJNZ R7,D2 ;
- RET ;
- TABLE:
- DB 0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H,0FEH,2AH,04H,0FEH,02H,04H ;
- DB 00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H ;
- DB 0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H ;
- DB 0FEH,0C0H,04H, 0FEH,84H,04H,0FEH,2AH,04H, 0FEH,02H,04H,0FDH,0C6H,04H ;
- DB 0FEH,98H,03H, 0FEH,98H,01H,0FEH,84H,04H, 0FEH,2AH,04H,0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FFH,0FFH */
- ;以下为公历转农历子程序
- CONvert: MOV A,time_year ;将年月日转化为 HEX 格式 16进制
- MOV B,#16
- DIV AB
- MOV CONvert_yeAr,B
- MOV B,#10
- MUL AB
- ADD A,CONvert_yeAr
- MOV CONvert_yeAr,A
- MOV A,time_month
- MOV C,ACC.7
- MOV f0,C ;f0暂存世纪标志,仅用于数据表定位
- CLR ACC.7
- JNB ACC.4,CON_02
- CLR ACC.4 ;ACC.4 为 1 表示大于 10 月
- ADD A,#10
- CON_02: MOV CONvert_mONth,A
- MOV A,time_date;
- SWAP A
- ANL A,#07H
- MOV B,#10
- MUL AB
- MOV CONVERT_DATE,A
- MOV A,TIME_DATE
- ANL A,#0FH
- ADD A,CONvert_dAte
- MOV CONvert_dAte,A
- MOV dptr,#mONth_dAtA ;以下定位本年数据在表格中的位置
- MOV A,CONvert_yeAr
- JB f0,CON_06 ;当前为 19 世纪年跳转
- ; ADD A,#100 ;从 19 世纪起定义表格起始年,20 世纪要加 100 年
- CON_06: CLR C
- SUBB A,#stArt_yeAr
- MOV B,#3 ;表格每年 3 字节
- MUL AB
- ADD A,dpl
- MOV dpl,A
- MOV A,B
- ADDC A,dph
- MOV dph,A
- MOV A,#2
- MOVC A,@A+dptr ;读本年表格最后一字节(春节日期)
- CLR ACC.7 ;ACC.7 是闰年第 13 个月大小,在此不用
- MOV B,#32
- DIV AB
- MOV temp_Byte1,A ;春节月份
- MOV temp_Byte2,B ;春节日
- ;以下计算当前日期距元旦天数
- MOV temp_Byte3,#0 ;设距元旦天数高位为 0
- MOV A,CONvert_mONth
- CJNE A,#10,CON_08
- CON_08: JC CON_09 ;9 月以前日子数小于 256 天,高字节为 0(9 月份过去的整月为 8 个月)
- MOV temp_Byte3,#1
- CON_09: MOV A,CONvert_yeAr
- ANL A,#03h ;ACC 为除 4 的余数
- JNZ CON_10 ;转常年处理
- ;年除 4 余数为 0 是闰年
- MOV A,CONvert_mONth
- LCALL get_ruN_dAys_lOw ;取得闰年过去月的天数的低字节
- SJMP CON_12
- CON_10: MOV A,CONvert_mONth
- LCALL get_dAys_lOw ;取得常年过去月的天数的低字节
- CON_12: MOV B,CONvert_dAte
- DEC B ;因为日期从 1 日起,而不是 0 日起
- ADD A,B ;过去的整月天数加当月天数
- MOV temp_Byte4,A
- JNC CON_14
- INC temp_Byte3 ;temp_Byte3,temp_Byte4 分别为公历年过去的天数的高低字节
- ;以下求春节距元旦天数,因肯定小于 256 天所以只用一字节表示
- CON_14: MOV A,temp_Byte1
- LCALL get_dAys_lOw ;春节不会在 3 月份,不用考虑闰年
- DEC A ;因为日期从 1 日起
- ADD A,temp_Byte2
- MOV temp_Byte5,A ;temp_Byte5,为春节距元旦天数
- MOV A,CONvert_mONth
- CJNE A,temp_Byte1,CON_20 ;转换月与春节月比较
- MOV A,CONvert_dAte
- CJNE A,temp_Byte2,CON_20 ;转换日与春节日比较
- CON_20: JC CON_22
- LJMP CON_60 ;当前日大于等于春节日期,公历年与农历年同年份
- CON_22: MOV A,CONvert_yeAr ;不到春节,农历年比公历年低一年
- JNZ CON_24
- MOV A,#100 ;年有效数 0-99
- CON_24: DEC A
- MOV CONvert_yeAr,A
- MOV A,dpl
- CLR C
- SUBB A,#3
- MOV dpl,A
- JNC CON_26
- DEC dph ;表格指针指向上一年
- CON_26: MOV A,temp_Byte5
- CLR C
- SUBB A,temp_Byte4
- MOV temp_Byte3,A ;temp_Byte3 中为当前日离春节的天数
- MOV CONvert_mONth,#12 ;农历月为 12 月
- CLR f0 ;1901-2099 年没有闰 12 月,清闰月标志
- CLR A
- MOVC A,@A+dptr
- ANL A,#0f0h
- SWAP A;
- MOV temp_Byte4,A ;temp_Byte4 中为闰月
- JZ CON_30 ;没有闰月转移
- MOV A,#2 ;有闰月,取第 13 个月天数
- MOVC A,@A+dptr
- MOV C,ACC.7
- MOV A,#1
- MOVC A,@A+dptr
- RLC A ;ACC 中为最后 6 个月的大小值
- SJMP CON_34
- CON_30: MOV A,#1
- MOVC A,@A+dptr ;ACC 中为最后 6 个月的大小值
- CON_34: MOV temp_Byte5,A
- CON_40: MOV A,temp_Byte5
- RRC A
- MOV temp_Byte5,A
- JC CON_42
- MOV B,#29 ;小月 29 天
- SJMP CON_44
- CON_42: MOV B,#30 ;大月 30 天
- CON_44: MOV A,temp_Byte3
- CLR C
- SUBB A,B
- JZ CON_46 ;正好够减,就是农历日 1 日
- JNC CON_50 ;不够减一月天数,结束农历月调整
- CPL A ;求补取绝对值
- INC A
- CON_46: INC A ;加 1 即为农历日
- MOV B,#10 ;转换并保存农历日,月,年
- DIV AB
- SWAP A
- ORL A,B
- MOV CONvert_dAte,A
- MOV A,CONvert_mONth
- MOV B,#10
- DIV AB
- SWAP A
- ORL A,B
- MOV C,f0
- MOV ACC.7,C
- MOV CONvert_mONth,A
- MOV A,CONvert_yeAr
- MOV B,#10
- DIV AB
- SWAP A
- ORL A,B
- MOV CONvert_yeAr,A
- RET ;结束转换 ==========================
- CON_50: MOV temp_Byte3,A ;temp_Byte3 存减去一月后的天数
- JB f0,CON_52 ;是闰月,前推一月,月份不减
- DEC CONvert_mONth;
- CON_52: MOV A,CONvert_mONth
- CJNE A,temp_Byte4,CON_54
- CPL f0 ;当前月与闰月相同,更改闰月标志
- CON_54: SJMP CON_40
- CON_60: MOV A,temp_Byte4 ;春节日小于当前日,农历年同公历年
- CLR C
- SUBB A,temp_Byte5
- MOV temp_Byte4,A
- JNC CON_62
- DEC temp_Byte3 ;temp_Byte3 temp_Byte4 中为公历日离春节的天数
- CON_62: MOV CONvert_mONth,#1 ;农历月为 1 月
- CLR A
- MOVC A,@A+dptr
- MOV temp_Byte5,A
- ANL A,#0f0h
- SWAP A;
- XCH A,temp_Byte5 ;temp_Byte5 中为闰月,ACC 为当年农历表第一字节
- CLR f0 ;第一个月肯定不是闰月
- ANL A,#0fh
- MOV temp_Byte1,A
- MOV A,#1
- MOVC A,@A+dptr
- MOV temp_Byte2,A
- ANL A,#0f0h
- ORL A,temp_Byte1
- SWAP A
- MOV temp_Byte1,A
- MOV A,#2
- MOVC A,@A+dptr
- MOV C,ACC.7
- MOV A,temp_Byte2
- ANL A,#0fh
- SWAP A
- MOV ACC.3,C;
- MOV temp_Byte2,A ;以上 temp_Byte1,temp_Byte2 各 BIT 存农历年大小
- CON_70: MOV A,temp_Byte2
- RLC A
- MOV temp_Byte2,A
- MOV A,temp_Byte1
- RLC A
- MOV temp_Byte1,A
- JC CON_72
- MOV B,#29 ;小月 29 天处理
- SJMP CON_74
- CON_72: MOV B,#30 ;大月 30 天
- CON_74: MOV A,temp_Byte4
- CLR C
- SUBB A,B
- JNC CON_78 ;低字节够减跳转
- MOV B,A ;低字节不够减, B 暂存减后结果,
- MOV A,temp_Byte3
- JZ CON_76 ;高字节为 0,不够减
- DEC temp_Byte3
- MOV temp_Byte4,B
- SJMP CON_80
- CON_76: MOV A,temp_Byte4 ;不够减结束月调整
- LJMP CON_46 ;转日期加 1 后,处理并保存转换后农历年月日
- CON_78: MOV temp_Byte4,A ;temp_Byte3 temp_Byte4 天数为减去一月后天数
- CON_80: MOV A,CONvert_mONth
- CJNE A,temp_Byte5,CON_82
- CPL f0 ;当前月与闰月相同,更改闰月标志
- JNB f0,CON_82 ;更改标志后是非闰月,月份加 1
- SJMP CON_70
- CON_82: INC CONvert_mONth;
- SJMP CON_70
- get_dAys_lOw:
- MOVC A,@A+PC ;取得常年过去月的天数的低字节
- RET
- DB 0,31,59,90,120,151,181,212,243,17,48,78
- get_ruN_dAys_lOw:
- MOVC A,@A+PC ;取得闰年过去月的天数的低字节
- RET
- DB 0,31,60,91,121,152,182,213,244,18,49,79
- mONth_dAtA:
- ;公历年对应的农历数据,每年三字节,
- ;格式第一字节 BIT7-4 位表示闰月月份,值为 0 为无闰月,BIT3-0 对应农历第 1-4 月的大小
- ;第二字节 BIT7-0 对应农历第 5-12 月大小,第三字节 BIT7 表示农历第 13 个月大小
- ;月份对应的位为 1 表示本农历月大(30 天),为 0 表示小(29 天).
- ;第三字节 BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
- /*DB 004h,0Aeh,053h,00Ah,057h,048h,055h,026h,0Bdh,00dh,026h,050h,00dh,095h,044h; 1905
- DB 046h,0AAh,0B9h,005h,06Ah,04dh,009h,0Adh,042h,024h,0Aeh,0B6h,004h,0Aeh,04Ah; 1910
- DB 06Ah,04dh,0Beh,00Ah,04dh,052h,00dh,025h,046h,05dh,052h,0BAh,00Bh,054h,04eh; 1915
- DB 00dh,06Ah,043h,029h,06dh,037h,009h,05Bh,04Bh,074h,09Bh,0C1h,004h,097h,054h; 1920
- DB 00Ah,04Bh,048h,05Bh,025h,0BCh,006h,0A5h,050h,006h,0d4h,045h,04Ah,0dAh,0B8h; 1925
- DB 002h,0B6h,04dh,009h,057h,042h,024h,097h,0B7h,004h,097h,04Ah,066h,04Bh,03eh; 1930
- DB 00dh,04Ah,051h,00eh,0A5h,046h,056h,0d4h,0BAh,005h,0Adh,04eh,002h,0B6h,044h; 1935
- DB 039h,037h,038h,009h,02eh,04Bh,07Ch,096h,0Bfh,00Ch,095h,053h,00dh,04Ah,048h; 1940
- DB 06dh,0A5h,03Bh,00Bh,055h,04fh,005h,06Ah,045h,04Ah,0Adh,0B9h,002h,05dh,04dh; 1945
- DB 009h,02dh,042h,02Ch,095h,0B6h,00Ah,095h,04Ah,07Bh,04Ah,0Bdh,006h,0CAh,051h; 1950
- DB 00Bh,055h,046h,055h,05Ah,0BBh,004h,0dAh,04eh,00Ah,05Bh,043h,035h,02Bh,0B8h; 1955
- DB 005h,02Bh,04Ch,08Ah,095h,03fh,00eh,095h,052h,006h,0AAh,048h,07Ah,0d5h,03Ch; 1960
- DB 00Ah,0B5h,04fh,004h,0B6h,045h,04Ah,057h,039h,00Ah,057h,04dh,005h,026h,042h; 1965
- DB 03eh,093h,035h,00dh,095h,049h,075h,0AAh,0Beh,005h,06Ah,051h,009h,06dh,046h; 1970
- DB 054h,0Aeh,0BBh,004h,0Adh,04fh,00Ah,04dh,043h,04dh,026h,0B7h,00dh,025h,04Bh; 1975
- DB 08dh,052h,0Bfh,00Bh,054h,052h,00Bh,06Ah,047h,069h,06dh,03Ch,009h,05Bh,050h; 1980
- DB 004h,09Bh,045h,04Ah,04Bh,0B9h,00Ah,04Bh,04dh,0ABh,025h,0C2h,006h,0A5h,054h; 1985
- DB 006h,0d4h,049h,06Ah,0dAh,03dh,00Ah,0B6h,051h,009h,037h,046h,054h,097h,0BBh; 1990
- DB 004h,097h,04fh,006h,04Bh,044h,036h,0A5h,037h,00eh,0A5h,04Ah,086h,0B2h,0Bfh; 1995
- DB 005h,0ACh,053h,00Ah,0B6h,047h,059h,036h,0BCh,009h,02eh,050h,00Ch,096h,045h; 2000 */
- DB 04dh,04Ah,0B8h,00dh,04Ah,04Ch,00dh,0A5h,041h,025h,0AAh,0B6h,005h,06Ah,049h; 2005
- DB 07Ah,0Adh,0Bdh,002h,05dh,052h,009h,02dh,047h,05Ch,095h,0BAh,00Ah,095h,04eh; 2010
- DB 00Bh,04Ah,043h,04Bh,055h,037h,00Ah,0d5h,04Ah,095h,05Ah,0Bfh,004h,0BAh,053h; 2015
- DB 00Ah,05Bh,048h,065h,02Bh,0BCh,005h,02Bh,050h,00Ah,093h,045h,047h,04Ah,0B9h; 2020
- DB 006h,0AAh,04Ch,00Ah,0d5h,041h,024h,0dAh,0B6h,004h,0B6h,04Ah,069h,057h,03dh; 2025
- DB 00Ah,04eh,051h,00dh,026h,046h,05eh,093h,03Ah,00dh,053h,04dh,005h,0AAh,043h; 2030
- DB 036h,0B5h,037h,009h,06dh,04Bh,0B4h,0Aeh,0Bfh,004h,0Adh,053h,00Ah,04dh,048h; 2035
- DB 06dh,025h,0BCh,00dh,025h,04fh,00dh,052h,044h,05dh,0AAh,038h,00Bh,05Ah,04Ch; 2040
- DB 005h,06dh,041h,024h,0Adh,0B6h,004h,09Bh,04Ah,07Ah,04Bh,0Beh,00Ah,04Bh,051h; 2045
- DB 00Ah,0A5h,046h,05Bh,052h,0BAh,006h,0d2h,04eh,00Ah,0dAh,042h,035h,05Bh,037h; 2050
- DB 009h,037h,04Bh,084h,097h,0C1h,004h,097h,053h,006h,04Bh,048h,066h,0A5h,03Ch; 2055
- DB 00eh,0A5h,04fh,006h,0B2h,044h,04Ah,0B6h,038h,00Ah,0Aeh,04Ch,009h,02eh,042h; 2060
- DB 03Ch,097h,035h,00Ch,096h,049h,07dh,04Ah,0Bdh,00dh,04Ah,051h,00dh,0A5h,045h; 2065
- DB 055h,0AAh,0BAh,005h,06Ah,04eh,00Ah,06dh,043h,045h,02eh,0B7h,005h,02dh,04Bh; 2070
- DB 08Ah,095h,0Bfh,00Ah,095h,053h,00Bh,04Ah,047h,06Bh,055h,03Bh,00Ah,0d5h,04fh; 2075
- DB 005h,05Ah,045h,04Ah,05dh,038h,00Ah,05Bh,04Ch,005h,02Bh,042h,03Ah,093h,0B6h; 2080
- DB 006h,093h,049h,077h,029h,0Bdh,006h,0AAh,051h,00Ah,0d5h,046h,054h,0dAh,0BAh; 2085
- DB 004h,0B6h,04eh,00Ah,057h,043h,045h,027h,038h,00dh,026h,04Ah,08eh,093h,03eh; 2090
- DB 00dh,052h,052h,00dh,0AAh,047h,066h,0B5h,03Bh,005h,06dh,04fh,004h,0Aeh,045h; 2095
- DB 04Ah,04eh,0B9h,00Ah,04dh,04Ch,00dh,015h,041h,02dh,092h,0B5h,00dh,053h,049h; 2100
- ;ds1302时钟上升沿输入命令或数据,下降沿输出数据.===========================================================================
- IN_1302:mov MIAO,#00H ;秒赋初值 出厂日期:2010.6.25.12:00:00
- mov FEN,#00H ;分赋初值
- mov SHI,#12H ;时赋初值
- mov RIQI,#025H ;日赋初值h
- mov YUE,#06H ;月赋初值
- mov XQI,#05H ;星期赋初值
- mov NIAN,#10H ;年赋初值
- lcall set1302 ;调用初值设定子程序
- RET
- ;入口参数:初始时间:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)*/
- Set1302:
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B, #8EH ;控制寄存器 10001110b
- LCALL RTInputByte
- MOV B, #00H ;写操作前WP=0
- LCALL RTInputByte
- MOV B, #90H ;控制寄存器 10010000b
- LCALL RTInputByte
- MOV B, #10101001b ;充电
- LCALL RTInputByte
- SETB T_CLK
- CLR T_RST
- MOV R0, #MIAO;
- MOV R7, #7 ;秒 分 时 日 月 星期 年 共7个字节
- MOV R1, #80H ;秒写地址 10000000b
- S13021: CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B, R1 ;写秒 分 时 日 月 星期 年 地址
- LCALL RTInputByte
- MOV A, @R0 ;写秒数据
- MOV B, A
- LCALL RTInputByte
- INC R0
- INC R1
- INC R1
- SETB T_CLK
- CLR T_RST
- DJNZ R7, S13021
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B, #8EH ;控制寄存器
- LCALL RTInputByte
- MOV B, #80H ;控制,WP=1,写保护
- LCALL RTInputByte
- SETB T_CLK
- CLR T_RST
- RET
- ;功 能:从DS1302 读时间
- Get1302:
- MOV R0, #MIAO;
- MOV R7, #7
- MOV R1, #81H ;秒地址
- G13021: CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B, R1 ;秒 分 时 日 月 星期 年 地址
- LCALL RTInputByte
- LCALL RTOutputByte
- MOV @R0, A ;秒
- INC R0
- INC R1
- INC R1
- SETB T_CLK
- CLR T_RST
- DJNZ R7, G13021
- RET
- ;功 能:写1302一字节 (内部子程序)
- RTInputByte:
- MOV R3, #8 ;一个字节有八个位,移八次.
- Inbit1: MOV A, B
- RRC A ;通过A移入CY.
- MOV B, A
- MOV T_IO, C ;移入芯片内.
- SETB T_CLK
- CLR T_CLK
- DJNZ R3, Inbit1
- RET
- ;功 能:读1302一字节
- RTOutputByte:
- MOV R3, #8 ;一个字节有八个位,移八次.
- Out_1: MOV C, T_IO ;从芯片内移到CY
- RRC A ;通过CY移入A.
- SETB T_CLK
- CLR T_CLK
- DJNZ R3,Out_1
- RET
- ;=================================================
- ;以下子程序用于从当前公历日期,推算星期,
- ;入口:time_yeAr,time_month ,time_date ,定义公历年 月 日,BCD 码,其中月的
- ;BIT7 表示世纪,0表示20 世纪,1表示 19 世纪,出口 time_week, 0-6 表示星期日-星期六,程序不改变入口数据
- ;使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3
- GetWeek: MOV A,NIAN
- MOV B,#16
- DIV AB
- MOV temp_Byte1,B
- MOV B,#10
- MUL AB
- ADD A,temp_Byte1
- MOV temp_Byte1,A ;temp_Byte1=年
- MOV A,YUE
- JB ACC.7,getw02
- MOV A,#100
- ADD A,temp_Byte1
- MOV temp_Byte1,A ;20世纪年+100
- MOV A,YUE
- CLR ACC.7
- getw02: JNB ACC.4,getw04
- ADD A,#10
- CLR ACC.4
- getw04: MOV temp_Byte2,A ;temp_Byte2=月
- MOV A,RIQI
- MOV B,#16
- DIV AB
- MOV temp_Byte3,B
- MOV B,#10
- MUL AB
- ADD A,temp_Byte3
- MOV temp_Byte3,A ;temp_Byte3=日
- MOV A,temp_Byte1;
- ANL A,#03h
- JNZ getw10 ;非闰年转移
- MOV A,temp_Byte2
- CJNE A,#3,getw06
- getw06: JNC getw10 ;月大于 2 转移
- DEC temp_Byte3 ;份小于等于 2,又是闰年,日减 1
- getw10: MOV A,temp_Byte2;
- LCALL get_CorreCt ;取月校正表数据
- ADD A,temp_Byte1
- MOV B,#7
- DIV AB ;B放年加校正日数之和后除7 的余数 不先做这一步;有可能数据溢出
- MOV A,temp_Byte1
- ANL A,#0fCh
- RR A
- RR A ;以上年除 4 即闰年数
- ADD A,B
- ADD A,temp_Byte3
- MOV B,#7
- DIV AB
- MOV XQI,B ; time_week,B
- RET
- get_COrreCt:
- MOVC A,@A+PC
- RET
- DB 0,3,3,6,1,4,6,2,5,0,3,5
- END
-
复制代码 nbsp; ;保持16微秒以上
RRC A ;把字节DATA分成8个BIT环移给C
MOV DQ, C ;写入一个BIT
MOV R3,#23
DJNZ R3,- ;***************引脚定义,根据使用不同的管脚而改动*************
- ;农历,星期,1302程序由网上下载
- ABCD EQU P2 ;行扫描0-7
- SEG EQU P1.1 ; 红
- SER EQU P1.0 ;内容发送绿
- SRCLK EQU P1.2 ;串行CP端
- RCLK EQU P1.3 ;输出CP端
- EN EQU P1.4 ;EN为138使能端.高电平关闭显示;低电平显示
- DQ EQU P3.6 ;温度18b20
- BEEP EQU P3.7 ;蜂鸣器
- AN EQU P0.1 ;中间按键
- ANS EQU P0.0 ;上按键
- ANX EQU P0.4 ;下按键
- ANZ EQU P0.2 ;左按键
- ANY EQU P0.3 ;右按键
- T_CLK EQU P0.7 ;实时时钟时钟线引脚
- T_IO EQU P0.6 ;实时时钟数据线引脚
- T_RST EQU P0.5 ;实时时钟复位线引脚
- ;温度存放地址
- A_BIT EQU 22H ;存放个位数变量
- B_BIT EQU 21H ;存放十位数变量
- C_BIT EQU 24H ;存放 小数变量
- D_BIT EQU 20H ;存放 百 位数变量
- FLAG EQU 26H ;DS18B20是否存在标志
- XSD EQU 23H ;点
- WDFH EQU 25H ;℃
- WDGW EQU 27H ;温度高位值
- WDDW EQU 28H ;温度低位值
- QUSHU EQU 28H
- QUSHU1 EQU 08H
- QUSHU2 EQU 09H
- LSTZSJ1 EQU 0AH
- LSTZSJ EQU 0BH
- MIAO EQU 20H ;秒
- FEN EQU 21H ;分
- SHI EQU 22H ;时
- RIQI EQU 23H ;日
- YUE EQU 24H ;月 ACC.7=0为2000年
- XQI EQU 25H ;星期
- NIAN EQU 26H ;年
- start_year EQU 01; 定义查询表起始年份,01--199 表示 1901-2099 年
- ;以下三单元为需转换的公历日期 是子程序的入口数据
- time_year EQU NIAN
- time_month EQU YUE ;BIT7 表示世纪,为 1 表示 19 世纪,为 0 表示 20 世纪
- time_date EQU RIQI
- ;以下三单元存转换后农历日期 与入口单元重叠,如要保留入口信息,请重定义出口地址
- CONvert_yeAr DATA 3Fh
- CONvert_mONth DATA 3Eh ;BIT7 为 1 表示闰月
- CONvert_dAte DATA 3Dh
- temp_Byte4 DATA 3Bh
- temp_Byte5 DATA 3Ch
- temp_Byte1 EQU 20H
- temp_Byte2 EQU 21H
- temp_Byte3 EQU 22H
- ;*************************************************************
- ;*********************中断入口程序****************************
- ORG 0000H
- LJMP MAIN
- ; ORG 0003H
- ; RETI
- ; ORG 000BH ; 定时器 T0中断入口
- ; JMP EXT0 ; 跳至T0中断子程序
- ; ORG 0013H
- ; RETI
- ;; ORG 001BH
- ; RETI
- ; ORG 0023H
- ; RETI
- ;***************主程序****************************************/
- MAIN: MOV SP,#69H ;堆栈首址
- LCALL BEEP_BZ
- LCALL AN_DEL
- LCALL BEEP_BZ ;开机鸣响2声
- LCALL RE_TEMP ;对DS18B20初始化及读取
- LCALL GET1302 ;读时间
- MOV A,MIAO
- JNB ACC.7,STRAT ;如果秒最高位是1初始化时钟
- LCALL IN_1302 ;时钟芯片初始化
- STRAT: ; MOV SP,#69H ;堆栈首址
- ; MOV R0,#30H ;初使化寄存显示单元
- ; MOV R1,#74 ;30H-单元清零
- ; MOV A,#0
- ST: ; MOV @R0,A
- ; INC R0
- ; DJNZ R1,ST
- ST1:
- LCALL Get1302 ;读取时间
- LCALL XSSJ ;时间数据转换
- LCALL PLAY1 ;显示时间
- MOV A,MIAO ;如果秒=30显示滚动日期
- CJNE A,#30H,ST2
- LCALL GDRQ
- ST2: JNB ANZ,WD ;按下左键调用温度显示
- ; JNB ANY,YYUE ;按下右键调用音乐
- JNB ANX,G_DRQ ;按下下键调用滚动显示日历
- JNB AN,TZSJ ;按下中间按键调用调时
- JMP ST1
- ;*****************************
- G_DRQ:LCALL GDRQ
- JMP ST1
- ;*****************************************************
- WD: LCALL AN_DEL
- JB ANZ,WD_OUT
- LCALL BEEP_BZ
- WD_1: LCALL RE_TEMP ;读取温度
- LCALL TURN ;转化温度子程序
- LCALL XSWD ;温度数据转换
- LCALL PLAY ;显示
- JB ANZ,WD_1
- LCALL AN_DEL
- LCALL BEEP_BZ
- JNB ANZ,WDOUT
- WD_OUT:RET
- GDRQ: LCALL Get1302 ;读取时间
- LCALL RQFL ;调用日期分离程序
- LCALL L30_
- RET
- WDOUT:LJMP ST1
- ;*******************************************调整时间程序*************
- TZSJ:
- LCALL AN_DEL
- JNB AN,$
- LCALL BEEP_BZ
- TZSJ_1: LCALL S_NIAN ;显示调年
- JNB ANS, N_J1 ;年+1
- JNB ANX,N_1 ;年-1
- JNB ANY,TZ_YUE ;调月
- JNB AN,TZSJOUT;确认
- JNB ANZ, TZ_NOUT
- JMP TZSJ_1
- TZSJOUT:;LCALL GetWeek
- LCALL Set1302
- LCALL BEEP_BZ
- TZ_NOUT: LJMP ST1
- N_J1: LCALL AN_DEL ;年+1
- LCALL BEEP_BZ
- LCALL NIAN_J1
- LJMP TZSJ_1
- N_1: LCALL AN_DEL ;年-1
- LCALL BEEP_BZ
- LCALL NIAN_1
- LJMP TZSJ_1
- ;***************************************
- Y_J1: LCALL AN_DEL;月+1
- LCALL BEEP_BZ
- LCALL YUE_J1
- LJMP TZ_YUE1
- Y_1: LCALL AN_DEL ;月-1
- LCALL BEEP_BZ
- LCALL YUE_1
- LJMP TZ_YUE1
- ;*********
- TZ_YUE: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_YUE1: LCALL S_YUE;显示调月
- JNB ANS,Y_J1;月+1
- JNB ANX,Y_1;月-1
- JNB ANY,TZ_RIQI;调日期
- JNB AN,TZ_YUEOUT
- JNB ANZ, TZ_YOUT
- JMP TZ_YUE1
- TZ_YUEOUT:LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_YOUT:LJMP ST1
- ;***************************************
- R_J1: LCALL AN_DEL;月+1
- LCALL BEEP_BZ
- LCALL RIQI_J1
- LJMP TZ_RIQI1
- R_1: LCALL AN_DEL ;月-1
- LCALL BEEP_BZ
- LCALL RIQI_1
- LJMP TZ_RIQI1
- ;*********
- TZ_RIQI: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_RIQI1: LCALL S_RIQI;显示调日期
- JNB ANS,R_J1;日期+1
- JNB ANX,R_1;日期-1
- JNB ANY,TZ_SHI;
- JNB AN,TZ_RIQIOUT
- JNB ANZ, TZ_ROUT
- JMP TZ_RIQI1
- TZ_RIQIOUT:;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_ROUT:LJMP ST1
- ;***************************************
- S_J1: LCALL AN_DEL;时+1
- LCALL BEEP_BZ
- LCALL SHI_J1
- LJMP TZ_SHI1
- S_1: LCALL AN_DEL ;时-1
- LCALL BEEP_BZ
- LCALL SHI_1
- LJMP TZ_SHI1
- ;*********
- TZ_SHI: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_SHI1: LCALL S_SHI;显示调时
- JNB ANS,S_J1;时+1
- JNB ANX,S_1;时-1
- TZ_SHI4:JNB ANY,TZ_FEN
- JNB AN,TZ_SHIOUT
- JNB ANZ, TZ_SOUT
- JMP TZ_SHI1
- TZ_SHIOUT:;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_SOUT: LJMP ST1
- ;*********
- TZ_FEN: LCALL AN_DEL
- JNB ANY,$
- LCALL BEEP_BZ
- TZ_FEN1: LCALL S_FEN;显示调分
- JNB ANS,F_J1;分+1
- JNB ANX,F_1;分-1
- ;TZ_RIQI4:JNB ANY,TZ_FEN;
- JNB AN,TZ_FENOUT
- JNB ANZ, TZ_FOUT
- JMP TZ_FEN1
- TZ_FENOUT:MOV MIAO,#0
- ;LCALL GetWeek
- LCALL SET1302
- LCALL BEEP_BZ
- TZ_FOUT:LJMP ST1
- ;***************************************
- F_J1: LCALL AN_DEL;时+1
- LCALL BEEP_BZ
- LCALL FEN_J1
- LJMP TZ_FEN1
- F_1: LCALL AN_DEL ;时-1
- LCALL BEEP_BZ
- LCALL FEN_1
- LJMP TZ_FEN1
- ;***************************************************
- ;YYUE: LCALL START1 ;调用音乐
- ; RET
- SHIJ: LCALL IN_1302 ;调用时间初始化
- RET
- AN_DEL: MOV R6,#0
- AN_DEL1:LCALL DEL
- DJNZ R6,AN_DEL1
- RET
- ;********************调整年月日程序*********************************/=======================================================================
- S_NIAN: MOV 40H,#52 ;显示调年
- MOV 41H,#30
- MOV A,NIAN
- ANL A,#0FH
- MOV 43H,A
- MOV A,NIAN
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_YUE: MOV 40H,#52 ;显示调月
- MOV 41H,#31
- MOV A,YUE
- ANL A,#0FH
- MOV 43H,A
- MOV A,YUE
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_RIQI: MOV 40H,#52 ;显示调日期
- MOV 41H,#32
- MOV A,RIQI
- ANL A,#0FH
- MOV 43H,A
- MOV A,RIQI
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_SHI: MOV 40H,#52 ;显示调时
- MOV 41H,#53
- MOV A,SHI
- ANL A,#0FH
- MOV 43H,A
- MOV A,SHI
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- S_FEN: MOV 40H,#52 ;显示调分
- MOV 41H,#54
- MOV A,FEN
- ANL A,#0FH
- MOV 43H,A
- MOV A,FEN
- SWAP A
- ANL A,#0FH
- MOV 42H,A
- MOV 2DH,#0
- MOV QUSHU,#40H
- LCALL LINE_88
- RET
- ;;;;;;;;;;;;;;;;;;;;
- FEN_J1:MOV LSTZSJ1,FEN;分+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#60,FEN_J12;小时60清0
- MOV LSTZSJ,#0
- FEN_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV FEN,LSTZSJ1
- RET
- FEN_1: MOV LSTZSJ1,FEN;分-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#0,FEN_12 ;分是0加60
- MOV LSTZSJ,#60
- FEN_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV FEN,LSTZSJ1
- RET
- ;;;;
- SHI_J1:MOV LSTZSJ1,SHI;小时+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#24,SHI_J12;小时24清0
- MOV LSTZSJ,#0
- SHI_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV SHI,LSTZSJ1
- RET
- SHI_1: MOV LSTZSJ1,SHI;小时-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#0,SHI_12 ;小时是0加24
- MOV LSTZSJ,#24
- SHI_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV SHI,LSTZSJ1
- RET
- ;;;;
- RIQI_J1:MOV LSTZSJ1,RIQI;日+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#32,RIQI_J12;日是32清0
- MOV LSTZSJ,#1
- RIQI_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV RIQI,LSTZSJ1
- RET
- RIQI_1: MOV LSTZSJ1,RIQI;日-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,RIQI_12 ;日是1加32
- MOV LSTZSJ,#32
- RIQI_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV RIQI,LSTZSJ1
- RET
- ;;;;
- YUE_J1:MOV LSTZSJ1,YUE;月+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;月+1
- MOV A,LSTZSJ
- CJNE A,#13,YUE_J12;月是13清0
- MOV LSTZSJ,#1
- YUE_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV YUE,LSTZSJ1
- RET
- YUE_1: MOV LSTZSJ1,YUE;月-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,YUE_12
- MOV LSTZSJ,#13
- YUE_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV YUE,LSTZSJ1
- RET
- NIAN_J1:MOV LSTZSJ1,NIAN;年+1程序
- LCALL TSSJTZ ;;数据调整,10到16进制如21:00100001转为 21:00010101
- INC LSTZSJ;年+1
- MOV A,LSTZSJ
- CJNE A,#100,NIAN_J12;年是100清0
- MOV LSTZSJ,#01
- NIAN_J12:
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV NIAN,LSTZSJ1
- RET
- NIAN_1: ;CJNE A,#13H,SMAJ_QR
- MOV LSTZSJ1,NIAN;年-1程序
- LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
- MOV A,LSTZSJ
- CJNE A,#1,NIAN_12
- MOV LSTZSJ,#100
- NIAN_12:DEC LSTZSJ
- LCALL TSSJTZ1;数据调整,16到10进制
- MOV NIAN,LSTZSJ1
- RET
- ;;;;;;;;;;;;;
- TSSJTZ:MOV A,LSTZSJ1;数据调整,10到16进制如21:00100001转为 21:00010101
- ANL A,#0FH
- MOV LSTZSJ,A
- MOV A,LSTZSJ1
- SWAP A
- ANL A,#0FH
- MOV B,#10
- MUL AB
- ADD A,LSTZSJ
- MOV LSTZSJ,A
- RET
- TSSJTZ1:MOV A,LSTZSJ ;数据调整,16到10进制
- MOV B,#10
- DIV AB
- SWAP A
- MOV LSTZSJ,A
- MOV A,B
- ORL A,LSTZSJ
- MOV LSTZSJ1,A
- RET ;*/
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE_88 : MOV 2BH,#8 ;扫描的行数,共8行
- FF2: LCALL LINE_11 ;扫描显示1行子程序
- DJNZ 2BH,FF2 ;扫描下一行
- MOV 2DH,#0
- RET
- ;*********扫描显示一行子程序********************
- LINE_11: LCALL MSTR_YD_
- MOV 30H,#0
- MOV 31H,#0
- LCALL SEND_11 ;发送串行口子程序
- LCALL XTH ;选通行子程序
- LCALL DL22US
- INC 2DH
- RET
- SEND_11: MOV R0,#30H
- MOV R1,#35H
- MOV R5,#4 ;一行有2个字节;如每次显示字数不同要作相应改动
- LQ_11: MOV R2,#8 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- LCALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_11 ;2个字节全部移入了没有,未继续
- RET ;
- ;*************************************** 日期分离程序====================================
- RQFL: MOV 40H,#12
- MOV 41H,#12
- MOV 42H,#12
- MOV 43H,#12
- MOV A,YUE
- JB ACC.7,RQFL1
- MOV 44H,#2
- MOV 45H,#0
- JMP RQFL3
- RQFL1: MOV 44H,#1
- MOV 45H,#9
- RQFL3:
- MOV A,NIAN
- ANL A,#0FH
- MOV 47H,A
- MOV A,NIAN
- SWAP A
- ANL A,#0FH
- MOV 46H,A
- MOV 48H,#30 ;显示年
- MOV A,YUE
- ANL A,#0FH
- MOV 4AH,A
- MOV A,YUE
- SWAP A
- ANL A,#03H
- JZ YUE_S_1
- YUE_S_2:MOV 49H,A
- YUE_S_3: MOV 4BH,#31 ;显示 月
- MOV A,RIQI
- ANL A,#0FH
- MOV 4DH,A
- MOV A,RIQI
- SWAP A
- ANL A,#03H
- JZ RIQI_S_1
- RIQI_S_2:MOV 4CH,A
- RIQI_S_3:MOV 4EH,#32 ;显示 日
- MOV 4FH,#12
- MOV 50H,#16 ;显示星期
- MOV 51H,#17
- MOV 52H,#12
- LCALL GetWeek
- MOV A,XQI
- ANL A,#07H
- CJNE A,#0,XQ_1
- MOV 53H,#32
- JMP XQ_OUT
- RIQI_S_1:MOV 4CH,#12
- JMP RIQI_S_3
- YUE_S_1: MOV 49H,#12
- JMP YUE_S_3
- XQ_1: ADD A,#41
- MOV 53H,A
- XQ_OUT:
- MOV 54H,#12 ;空格
- LCALL RE_TEMP ;读取温度
- LCALL TURN ;转化温度子程序
- MOV 55H,#15 ;T
- MOV 56H,#14 ;:
- MOV 57H,20H ;温度百位
- MOV 58H,21H ;温度十位
- MOV 59H,22H ;温度个位
- MOV 5AH,#13 ;小数点
- MOV 5BH,24H ;温度小数位
- MOV 5CH,#11 ;℃符号
- MOV 5DH,#12
- MOV 5EH,#33 ;农
- MOV 5FH,#34 ;历
- LCALL Get1302
- LCALL CONvert ;调用公历转农历程序
- MOV A,CONvert_mONth
- JNB ACC.7,RQFL4
- MOV 60H,#51
- JMP RQFL5
- RQFL4:MOV 60H,#12
- RQFL5:LCALL NL_YUE ;调用农历月份
- MOV 62H,#31 ;显示月
- LCALL NL_RIQI
- MOV 65H,#12
- MOV 66H,#12
- MOV 67H,#12
- MOV 68H,#12
- ; MOV 69H,#12
- RQFLB: RET
- ;***********************
- NL_YUE: MOV A, CONvert_mONth ;农历月
- ANL A,#1FH
- JNB ACC.4,NL_RIQI0
- ANL A,#0FH
- ADD A,#10
- NL_RIQI0: CJNE A,#1,NL_YUE1
- MOV 61H,#35
- JMP NL_YOUT
- NL_YUE1: CJNE A,#10,NL_YUE2
- MOV 61H,#39
- JMP NL_YOUT
- NL_YUE2: CJNE A,#11,NL_YUE3
- MOV 61H,#37
- JMP NL_YOUT
- NL_YUE3: CJNE A,#12,NL_YUE4
- MOV 61H,#38
- JMP NL_YOUT
- NL_YUE4: ADD A,#41
- MOV 61H,A
- NL_YOUT: RET
- ;***************
- NL_RIQI:MOV A, CONvert_dAte ;农历日
- SWAP A
- ANL A,#0FH
- CJNE A,#0,NL_RIQI1
- MOV 63H,#36 ;显示 初
- JMP NL_ROUT
- NL_RIQI1:CJNE A,#1,NL_RIQI2
- MOV 63H,#39 ;显示 十
- JMP NL_ROUT
- NL_RIQI2:CJNE A,#2,NL_RIQI3
- MOV 63H,#40 ;显示 二十
- JMP NL_ROUT
- NL_RIQI3:CJNE A,#3,NL_ROUT
- MOV 63H,#41 ;显示 三十
- JMP NL_ROUT
- NL_ROUT:MOV A, CONvert_dAte ;农历日
- ANL A,#0FH
- CJNE A,#0,NL_RIQI4
- MOV 64H,#39 ;显示 十
- JMP NL_RIQI5
- NL_RIQI4:ADD A,#41
- MOV 64H,A
- NL_RIQI5: RET
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
- ;;;;;;;;;;;;;;;;;;;;;;;
- L30_: MOV 2DH,#0
- MOV QUSHU,#40H
- MOV 2FH,#37 ;共有多少个半角字符,一个汉字等于两个字符,个数值为实际字数*2+屏长度数
- HHH_: LCALL L31_ ;. 扫描一个字节
- DJNZ 2FH,HHH_ ;字数没完继续
- RET
- L31_: MOV B, #1 ;每次移入内存单元的数据要左移次数次值 ,从第一开始。
- II_: MOV 29H,#5 ;左移速度
- III_: LCALL L32_ ;扫描显示1帧
- DJNZ 29H,III_ ;速度没完继续
- INC B ;左移次数+1
- MOV A,#9
- CJNE A,B,II_ ;如果B中的数超过8就完成1个字节的8次左移显示,否则继续循环.
- INC QUSHU ;日期数据+1---5CH→
- RET
- L32_: MOV 2BH,#8 ;扫描的行数,共8行
- JJ_: LCALL L33_ ;扫描显示1行子程序
- INC 2DH
- DJNZ 2BH,JJ_ ;8行没完继续
- MOV 2DH,#0 ;8行完成后再从0行开始扫描
- RET
- L33_: MOV 2EH,B ;显示内容要左移几次数再显示的赋值给2EH单元
- LCALL SEND_YD ;发送串行口子程序
- LCALL XT_H ;选通行子程序
- LCALL MSTR_YD_ ;将显示内容移入内存单元30H→
- EE_: LCALL ZY
- DJNZ 2EH,EE_
- LCALL ZYXZ ;左移速度同步修正
- RET
- MSTR_YD_:SETB RS1 ;R0,R1-数据存放起始地址,2DH行数据,R3-21H,22H临时数据,R4-每屏的字节数, ,20H日期数据起始地址
- SETB RS0
- MOV R0,#30H
- MOV R1,#35H
- MOV R4,#5 ;每幕显示的字节数加1
- BB_YD_: LCALL L_SHUJU
- MOV @R0,A
- MOV @R1,A
- INC QUSHU ;加1,移到下一个字节的对应位置
- INC R0
- INC R1
- DJNZ R4,BB_YD_
- MOV A,QUSHU
- CLR C
- SUBB A,#5
- MOV QUSHU,A
- CLR RS1
- CLR RS0
- RET
- ;;;使用R0,R1,R6,R7,B,2DH
- L_SHUJU: MOV DPTR,#TAB10
- MOV QUSHU1,R0
- MOV QUSHU2,R1
- MOV R6,B
- MOV R0,QUSHU
- L_SHU: MOV A,@R0
- MOV B,#8
- MUL AB
- MOV R7,A
- MOV A,DPH
- ADD A,B
- MOV DPH,A
- MOV A,R7
- MOV B,2DH
- ADD A,B
- MOVC A,@A+DPTR
- MOV R0,QUSHU1
- MOV R1,QUSHU2
- MOV B,R6
- RET
- ;*****************************发送数据到串口子程序*****************************************************/
- SEND_YD: MOV R0,#30H
- MOV R5,#4 ;如每次显示字数不同要作相应改动
- LQ_YD: CLR C ;清C方便每个字节的移动
- MOV R2,#8 ;每个字节有8位
- MOV A,@R0 ;将显存的字节的单元移入A
- CPL A ;取反
- LCALL DD1_YD ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- DJNZ R5,LQ_YD ;8个字节全部移入了没有,未继续
- RET
- DD1_YD: CLR SRCLK ;清串行CP端
- RLC A ;将每个字节移位
- ; MOV SER,C ;将移入C的位移入信号端
- MOV SEG,C
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD1_YD ;每个字节位移8次够了没有?
- RET
- ;*******选通行子程序***2BH行数据*********************************************************************************/
- XT_H: CLR RCLK ;将输出CP变为低电平为上升沿作准备
- SETB EN ;将使能端变为高电平为下降沿作准备
- MOV R5,2BH
- CJNE R5,#7,HSM_1
- MOV ABCD,#11111110B
- JMP XTH_OUT
- HSM_1: CJNE R5,#6,HSM_2
- MOV ABCD,#11111101B
- JMP XTH_OUT
- HSM_2: CJNE R5,#5,HSM_3
- MOV ABCD,#11111011B
- JMP XTH_OUT
- HSM_3: CJNE R5,#4,HSM_4
- MOV ABCD,#11110111B
- JMP XTH_OUT
- HSM_4: CJNE R5,#3,HSM_5
- MOV ABCD,#11101111B
- JMP XTH_OUT
- HSM_5: CJNE R5,#2,HSM_6
- MOV ABCD,#11011111B
- JMP XTH_OUT
- HSM_6: CJNE R5,#1,HSM_7
- MOV ABCD,#10111111B
- JMP XTH_OUT
- HSM_7: CJNE R5,#8,XTH_OUT
- MOV ABCD,#01111111B
- XTH_OUT:
- SETB RCLK ;输出CP为上升沿,显示一个
- CLR EN ;138可显示
- RET
- ;**********左移一位子程序*******************************************************************************/
- ZY: ;30H后存入显示内容,R0为显示未址,R2为移出高位个数 字数*2+1
- SETB RS1
- CLR RS0
- MOV R2,#5
- MOV R0, #34H ;显示单元未址
- CLR C
- CC: MOV A, @R0
- RLC A ;将后一字节的最高位移到C里,再移到前一字节的最低位
- MOV @R0, A
- DEC R0
- DJNZ R2, CC
- CLR C
- CLR RS1
- CLR RS0
- RET
- ;********************移动查模式时速度同步修正子程序*****************************************************/
- ZYXZ: MOV R5,B
- MOV A,#9
- SUBB A,R5
- MOV R4,A
- AA: LCALL DL22US
- NOP
- DJNZ R4 ,AA
- RET
- ;*********************************************************************************/
- ;********************时间数据转换*************************************=====================================================================*/
- XSSJ:
- MOV A,FEN ;分
- MOV B,#10h
- DIV AB ;把41H高低4位分开
- MOV 43H,A ;高4位存入
- MOV A,B
- MOV 44H,A ;低4位存入
- MOV A,MIAO ;秒
- MOV B,#10h
- DIV AB ;把40H高低4位分开
- mov 45H,A ;高4位存入
- mov a,b
- mov 46H,a ;低4位存入
- MOV A,SHI
- MOV B,#16
- DIV AB
- MOV 40H,A
- MOV A,B
- MOV 41H,A
- MOV 42H,#15
- MOV A,40H
- JNZ XSSJ_1
- MOV 40H,#12
- XSSJ_1: RET
- ;*************************时间显示程序****************************
- PLAY1: MOV DPTR,#TABX
- MOV 2DH,#0
- MOV 2FH,#20 ;速度
- GG1: CALL LINE_8 ;扫描显示1帧
- DJNZ 2FH,GG1
- RET
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE_8 : MOV 2BH,#8 ;扫描的行数,共8行
- FF1: CALL LINE_1 ;扫描显示1行子程序
- DJNZ 2BH,FF1 ;扫描下一行
- MOV A,2DH
- SUBB A ,#8 ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
- MOV 2DH,A
- RET
- ;*********扫描显示一行子程序********************
- LINE_1: CALL MSTR_R ;将显示内容移入内存单元
- CALL MSTR_G
- MOV 35H,#0
- MOV 36H,#0
- ; MOV 3BH,#0
- MOV 3AH,#0
- CALL SEND_1 ;发送串行口子程序
- CALL XTH ;选通行子程序
- CALL DL22US
- INC 2DH
- RET
- ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***2EH,2FH缓冲**************
- SEND_1: MOV R0,#30H
- MOV R1,#38H
- MOV R5,#2 ;一行有2个字节;如每次显示字数不同要作相应改动
- LQ_1: MOV R2,#5 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_1 ;2个字节全部移入了没有,未继续
- CALL SEND_2
- CALL SEND_3
- RET ;
- SEND_2: MOV R0,#32H
- MOV R1,#3AH
- MOV R5,#1
- LQ_2: MOV R2,#2 ;每个字节有2位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_2 ;2个字节全部移入了没有,未继续
- RET
- SEND_3: MOV R0,#33H
- MOV R1,#3BH
- MOV R5,#4
- LQ_3: MOV R2,#5 ;每个字节有5位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- CALL DD_1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ_3 ;2个字节全部移入了没有,未继续
- RET
- DD_1: CLR SRCLK ;清串行CP端
- CLR C
- MOV A,R6
- RLC A ;将每个字节移位
- MOV R6,A
- CPL C
- MOV SER,C ;红色
- CLR C
- MOV A,R7
- RLC A
- MOV R7,A
- CPL C
- MOV SEG,C ;绿色
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD_1 ;每个字节位移5次够了没有?
- RET
- ;*************************温度显示程序****************************
- PLAY: MOV DPTR,#TABX
- MOV 2DH,#0
- MOV 2FH,#60 ;速度
- GG: CALL LINE8 ;扫描显示1帧
- DJNZ 2FH,GG
- RET
- ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据 ******************
- LINE8 : MOV 2BH,#8 ;扫描的行数,共8行
- FF: CALL LINE1 ;扫描显示1行子程序
- DJNZ 2BH,FF ;扫描下一行
- MOV A,2DH
- SUBB A ,#8 ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
- MOV 2DH,A
- RET
- ;*********扫描显示一行子程序********************
- LINE1: CALL MSTR_R ;将显示内容移入内存单元
- CALL MSTR_G
- MOV 34H,#0
- MOV 35H,#0
- MOV 3BH,#0
- CALL SEND ;发送串行口子程序
- CALL XTH ;选通行子程序
- CALL DL22US
- INC 2DH
- RET
- ;****************************************************************************
- ;**显示内容移入内存单元子程序*取红色到30H-34H,绿色35H-39H*2DH取字节数据***********************
- MSTR_R: MOV R0,#30H
- MOV R4,#7 ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
- MOV R1,#40H
- BB_R:
- MOV A,@R1
- MOV B,#8
- MUL AB
- ADD A,2DH
- MOVC A, @A+DPTR
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R4,BB_R
- MOV R1,#40H
- RET
- MSTR_G: MOV R0,#38H
- MOV R4,#7 ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
- MOV R1,#40H
- BB_G:
- MOV A,@R1
- MOV B,#8
- MUL AB
- ADD A,2DH
- MOVC A, @A+DPTR
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R4,BB_G
- MOV R1,#40H
- RET
- ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***R6,R7**************
- SEND: MOV R0,#30H
- MOV R1,#38H
- MOV R5,#6 ;一行有4个字节;如每次显示字数不同要作相应改动
- LQ: MOV R2,#5 ;每个字节有8位
- MOV A,@R0 ;将显存的字节的单元移入
- MOV R6,A
- MOV A,@R1 ;将显存的字节的单元移入
- MOV R7,A
- LCALL DD1 ;调用显示一个字节的子程序
- INC R0 ;指向下一个显存的单元
- INC R1 ;指向下一个显存的单元
- DJNZ R5,LQ ;8个字节全部移入了没有,未继续
- CLR SRCLK
- SETB C
- MOV SER,C
- MOV SEG,C
- SETB SRCLK
- RET ;
- DD1: CLR SRCLK ;清串行CP端
- CLR C
- MOV A,R6
- RLC A ;将每个字节移位
- MOV R6,A
- CPL C
- MOV SER,C ;红色
- CLR C
- MOV A,R7
- RLC A
- MOV R7,A
- CPL C
- MOV SEG,C ;绿色
- SETB SRCLK ;触发串行CP端
- DJNZ R2,DD1 ;每个字节位移8次够了没有?
- RET
- ;*******选通行子程序***2BH行数据*********************************************************************************/
- XTH: CLR RCLK ;将输出CP变为低电平为上升沿作准备
- SETB EN ;将使能端变为高电平为下降沿作准备
- MOV R5,2BH
- CJNE R5,#8,HSM1
- MOV ABCD,#11111110B
- JMP XTHOUT
- HSM1: CJNE R5,#7,HSM2
- MOV ABCD,#11111101B
- JMP XTHOUT
- HSM2: CJNE R5,#6,HSM3
- MOV ABCD,#11111011B
- JMP XTHOUT
- HSM3: CJNE R5,#5,HSM4
- MOV ABCD,#11110111B
- JMP XTHOUT
- HSM4: CJNE R5,#4,HSM5
- MOV ABCD,#11101111B
- JMP XTHOUT
- HSM5: CJNE R5,#3,HSM6
- MOV ABCD,#11011111B
- JMP XTHOUT
- HSM6: CJNE R5,#2,HSM7
- MOV ABCD,#10111111B
- JMP XTHOUT
- HSM7: CJNE R5,#1,XTHOUT
- MOV ABCD,#01111111B
- XTHOUT:
- SETB RCLK ;输出CP为上升沿,显示一个
- CLR EN ;138可显示
- RET
- ;******22US延时子程序********
- DL22US: MOV R7,#50
- DJNZ R7,$
- RET ;
- DEL: MOV R7,#0
- DJNZ R7,$
- RET
- BEEP_BZ:; CLR BEEP ;蜂鸣器鸣响
- MOV R6,#40
- BEEP_2: CALL DEL
- CPL BEEP
- DJNZ R6, BEEP_2
- SETB BEEP ;蜂鸣器停止
- RET
- ;***********************************字码表****************************************
- TAB10:
- DB 038H,044H,082H,082H,082H,082H,044H,038H;"0",0
- DB 010H,070H,010H,010H,010H,010H,010H,0FEH;"1",1
- DB 07CH,082H,082H,006H,00CH,070H,0FAH,09EH;"2",2
- DB 07EH,044H,00CH,038H,006H,002H,086H,07CH;"3",3
- DB 004H,00CH,01CH,034H,064H,0FEH,004H,03FH;"4",4
- DB 07EH,042H,040H,07CH,042H,002H,086H,07CH;"5",5
- DB 03CH,062H,0C0H,0FCH,082H,082H,0C2H,07CH;"6",6
- DB 0FEH,084H,088H,018H,010H,030H,020H,020H;"7",7
- DB 07CH,082H,082H,07CH,086H,082H,0C6H,07CH;"8",8
- DB 07CH,086H,082H,082H,07EH,002H,084H,078H;"9",9
- DB 000H, 000H, 000H, 000H, 0FCH, 000H, 000H, 000H ;- 10
- DB 080H, 078H, 084H, 080H, 080H, 080H, 084H, 078H ;"C",11
- DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H ;无显示,12
- DB 000H, 000H, 000H, 000H, 030H, 030H, 000H, 000H ;点,13
- DB 000H, 000H, 030H, 030H, 000H, 030H, 030H, 000H ;: 14
- DB 0FEH,092H,010H,010H,010H,010H,010H,038H;"T",15
- DB 7EH,42H,7EH,7EH,48H,7EH,88H,7EH ;温 16
- DB 57H,0FDH,57H,75H,57H,0FDH,55H,8BH ;度 17
- ;DB 0D6H, 092H, 092H, 092H, 09AH, 06CH, 064H, 044H;"W",16
- ;DB 0EEH, 044H, 048H, 070H, 050H, 048H, 044H, 0EEH;"K",17
- DB 0FCH,042H,042H,07CH,040H,040H,0E0H,000H;"P",18
- DB 0CEH,084H,084H,0FCH,084H,084H,0CEH,000H;"H",19
- DB 000H,000H,078H,084H,0FCH,080H,07CH,000H;"e",20
- DB 000H,000H,0DCH,078H,030H,078H,0ECH,000H;"x",21
- DB 018H,000H,038H,008H,008H,008H,008H,0F0H;"j",22
- DB 000H,000H,0FEH,092H,092H,092H,0DAH,000H;"m",23
- DB 000H,020H,000H,060H,020H,020H,020H,0F8H;"i",24
- DB 000H,000H,000H,0D8H,066H,042H,042H,0E7H;"n",25
- DB 0E7H,042H,044H,024H,02CH,028H,018H,010H;"V",26
- DB 03CH,05AH,0AAH,0AAH,0B4H,042H,03CH,000H;"@",27
- DB 000H,000H,03CH,062H,040H,042H,03CH,000H;"c",28
- DB 000H,000H,03CH,042H,042H,042H,03CH,000H;"o",29
- DB 010H,03EH,048H,0BCH,028H,07EH,008H,008H;年,30
- DB 03CH,024H,03CH,024H,03CH,024H,044H,08CH;月,31
- DB 0FCH,084H,084H,0FCH,084H,084H,084H,0FCH;日,32
- DB 10H,0FEH,92H,20H,34H,68H,0A4H,32H;农,33
- DB 7EH,48H,7EH,4AH,4AH,4AH,4AH,96H;历,34
- DB 000H,0FEH,010H,010H,05CH,050H,050H,0FEH;正,35
- DB 040H,0E0H,03EH,06AH,0CAH,04AH,052H,044H;初,36
- DB 010H,01EH,024H,058H,018H,024H,0DBH,018H;冬,37
- DB 000H,075H,05FH,075H,05FH,075H,057H,0B7H;腊,38
- DB 010H,010H,010H,0FEH,010H,010H,010H,010H;十,39
- DB 000H,044H,0FEH,044H,044H,044H,044H,07CH;二十,40
- DB 054H,054H,054H,0FEH,054H,054H,054H,094H;卅,41
- DB 000H,000H,000H,000H,0FEH,000H,000H,000H;一,42
- DB 000H,000H,07CH,000H,000H,0FEH,000H,000H;二,43
- DB 000H,000H,07CH,000H,038H,000H,0FEH,000H;三,44
- DB 000H,0FEH,0AAH,0AAH,0AAH,0CEH,082H,0FEH;四,45
- DB 07CH,010H,010H,07CH,014H,014H,024H,0FEH;五,46
- DB 000H,010H,000H,0FEH,000H,028H,046H,082H;六,47
- DB 000H,020H,020H,0FEH,020H,020H,022H,01CH;七,48
- DB 000H,028H,028H,028H,044H,044H,082H,000H;八,49
- DB 020H,020H,0FCH,028H,028H,028H,04AH,086H;九,50
- DB 05EH,082H,0BAH,092H,0BAH,092H,0BAH,086H;闰,51
- DB 0BEH,2AH,0FEH,6AH,0BEH,0F6H,0BEH,46H ;调,52
- DB 04H,0FEH,0A4H,0B4H,0ECH,0A4H,0E4H,0CH ;时 53
- DB 28H,44H,82H,7CH,24H,24H,44H,8CH;分 54
- DB 04H,24H,6CH,0F6H,25H,72H,0A4H,28H ;秒 55
- ;********************温度数据转换*************************************=====================================================================*/
- XSWD: CALL RE_TEMP
- MOV XSD,#13
- MOV WDFH,#11
- MOV R0,#20H
- MOV R1,#40H
- MOV R2,#7
- XSWD2: MOV A,@R0
- MOV @R1,A
- INC R0
- INC R1
- DJNZ R2,XSWD2
- RET
- ;;;;;;;;;;;;以下是温度程序;;;;;;;;;==
- ; 程序功能:数字温度计(+125- -55)
- RE_TEMP: ;对DS18B20初始化及读取
- SETB DQ
- CALL RESET_1820 ;调用复位子程序
- JB FLAG, STT ;判断DS1820是否存在?
- RET ;*/
- STT: ; DS18B20存在
- MOV A,#0CCH ;跳过ROM匹配
- CALL WRITE_1820 ;写入数据
- MOV A,#44H ;发出温度转换命令
- CALL WRITE_1820 ;写入数据
- CALL RESET_1820 ;准备读温度前先复位
- MOV A,#0CCH ;跳过ROM匹配
- CALL WRITE_1820 ;写入数据
- MOV A,#0BEH ;发出读温度命令
- CALL WRITE_1820 ;写入数据
- CALL READ_1820 ;读出温度数据
- RET ;*/
- RESET_1820: ;复位(有具体的时序要求)
- SETB DQ
- NOP
- NOP
- CLR DQ
- ;主机发出延时521微秒的复位低脉冲
- MOV R1,#2 ; 3
- DLY: MOV R0,#107
- DJNZ R0,$
- DJNZ R1,DLY
- ;然后拉高数据线
- SETB DQ
- NOP
- NOP
- NOP
- MOV R0,#25H
- T2: JNB DQ ,T3 ;等待DS18B20回应
- DJNZ R0, T2
- JMP T4
- T3: SETB FLAG ;置标志位,表示DS1820存在
- JMP T5
- T4: CLR FLAG ;清标志位,表示DS1820不存在
- JMP T7
- T5: MOV R0,#117
- T6: DJNZ R0,T6 ;时序要求延时一段时间
- T7: SETB DQ
- RET
- ;---------------------------------------------- */
- WRITE_1820: ;写入DS18B20(有具体的时序要求)
- MOV R2,#8 ;一共8位数据
- CLR C
- WR1: CLR DQ ;总线低位,开始写入
- MOV R3,#7
- DJNZ R3,[ DISCUZ_CODE_1 ]nbsp; ;保持16微秒以上
- RRC A ;把字节DATA分成8个BIT环移给C
- MOV DQ, C ;写入一个BIT
- MOV R3,#23
- DJNZ R3,[ DISCUZ_CODE_1 ]nbsp; ;等待
- SETB DQ ;重新释放总线
- NOP
- DJNZ R2,WR1 ;写入下一个BIT
- SETB DQ
- RET
- READ_1820: ;将温度高位和低位从DS18B20中读出
- MOV R4,#2 ; 读出两个字节的数据
- MOV R1,#WDDW ;低位存
- RE0: MOV R2,#8 ;数据一共有8位
- RE1: CLR C
- SETB DQ
- NOP
- NOP
- NOP
- CLR DQ ;读前总线保持为低
- NOP
- NOP
- NOP
- SETB DQ ;开始读总线释放
- MOV R3,#9
- RE2: DJNZ R3,RE2 ;延时18微妙
- MOV C, DQ ; 从总线读到一个BIT
- MOV R3,#23
- RE3: DJNZ R3,RE3 ;等待100μ秒
- RRC A ;把读得的位值环移给A
- DJNZ R2,RE1 ;读下一个BIT
- MOV @R1,A
- DEC R1
- DJNZ R4,RE0
- RET
- ;;;;;;;;;;;;;;;;;;;; */
- TURN: MOV A,WDGW
- JBC ACC.4,TU ;是零下跳到TU
- MOV D_BIT,#0FFH
- DIS: MOV DPTR,#TAB
- MOV A,WDDW ;低位
- ANL A,#0FH ;取小数
- MOVC A,@A+DPTR
- MOV C_BIT,A ;精确到0.1度的小数值
- MOV A,WDDW
- SWAP A ;高低位互换
- ANL A,#0FH
- MOV WDDW,A
- MOV A,WDGW
- ANL A,#0FH
- SWAP A
- ORL A,WDDW;重新组合,为不带小数的温度值
- MOV WDDW,A
- MOV A,D_BIT
- CJNE A,#10,TU_1;百位不是-跳转
- MOV A,WDDW
- DIS_1:
- MOV B,#10
- DIV AB
- MOV A_BIT,B;十位值
- MOV B_BIT,A;个位值
- MOV A,D_BIT
- CJNE A,#0,TU_2;百位不是0跳转
- MOV D_BIT,#12;是0消隐
- DIS_2:MOV A,B_BIT
- CJNE A,#0,TUR;十位不是0转
- MOV B_BIT,#12;是0消隐
- TUR: RET
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- TU: MOV D_BIT,#10;显示-号
- CPL A
- ANL A,#0FH
- mov WDGW,A;取反A存入高位
- MOV A,WDDW
- CPL A
- CLR C
- INC A
- MOV WDDW,A
- MOV A,WDGW
- ADDC A,#0
- MOV WDGW,A
- JMP DIS
- TU_1: MOV A,WDDW
- MOV B,#100
- DIV AB
- MOV D_BIT,A;百位值
- MOV A,B
- JMP DIS_1
- TU_2: CJNE A,#10,TUR;百位不是-跳转
- JMP DIS_2
- TAB:DB 0, 1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
- ;;;;;;;;;;;;以上是温度程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
- TABX:;5*7小字符 用于固定显示时间和温度
- DB 060H, 090H, 090H, 090H, 090H, 090H, 060H, 000H ;0
- DB 020H, 060H, 020H, 020H, 020H, 020H, 070H, 000H ;1
- DB 060H, 090H, 010H, 020H, 040H, 080H, 0F0H, 000H ;2
- DB 060H, 090H, 010H, 060H, 010H, 090H, 060H, 000H ;3
- DB 020H, 060H, 0A0H, 0A0H, 0F0H, 020H, 020H, 000H ;4
- DB 0F0H, 080H, 0E0H, 090H, 010H, 090H, 060H, 000H ;5
- DB 060H, 090H, 080H, 0E0H, 090H, 090H, 060H, 000H ;6
- DB 0F0H, 010H, 010H, 020H, 040H, 040H, 040H, 000H ;7
- DB 060H, 090H, 090H, 060H, 090H, 090H, 060H, 000H ;8
- DB 060H, 090H, 090H, 070H, 010H, 090H, 060H, 000H ;9
- DB 000H, 000H, 000H, 0F0H, 000H, 000H, 000H, 000H ;- 10
- DB 080H, 030H, 040H, 040H, 040H, 040H, 030H, 000H ;C 11
- DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H ; 空格 12
- DB 000H, 000H, 000H, 000H, 060H, 060H, 000H, 000H ;. 13
- DB 000H, 060H, 060H, 000H, 060H, 060H, 000H, 000H ;: 14
- DB 000H, 000H, 080H, 000H, 000H, 080H, 000H, 000H ;: 单冒号15
- /*;程序功能:歌曲演奏
- START1: MOV TMOD,#00000001B; 设T0方式1
- MOV IE,#10000010B;允许T0中断
- MOV DPTR,#TABLE ; 存表首地址
- LOOP: CLR A ; 清零
- MOVC A,@A+DPTR ; 查表
- MOV R1,A ; 定时器高8位存R1
- INC DPTR ; 指针加1
- CLR A ; 清零
- MOVC A,@A+DPTR ; 查表
- MOV R0,A ; 定时器低8位存R0
- ORL A,R1 ; 进行"或"运算
- JZ NEXT0 ; 全0为休止符
- MOV A, R0 ;
- ANL A, R1 ; 进行"与"运算
- CJNE A,#0FFH,NEXT; 全1表示乐曲结束
- RET
- NEXT: MOV TH0,R1 ; 装入高位定时值
- MOV TL0,R0 ; 装入低位定时值
- SETB TR0 ; 启动定时器T0
- setb tf0 ;启动定时器工作
- JMP NEXT1 ; 转移NEXT1处
- NEXT0: CLR TR0 ; 关闭定时器停止发音
- NEXT1: CLR A ; 清零
- INC DPTR ; 指针加1
- MOVC A,@A+DPTR ; 查延时常数
- MOV R2, A ; 延时常数存入R2
- LOOP1: ACALL DDELAY ; 调延时子程序
- DJNZ R2, LOOP1 ; 控制延时次数
- INC DPTR ; 指针加1
- JMP LOOP ; 转移LOOP处
- EXT0: MOV TH0,R1 ; 重装定时值
- MOV TL0,R0 ;
- CPL BEEP ; 反相输出
- RETI ; 中断返回
- DDELAY: MOV R7,#2 ; 延时187ms
- D2: MOV R6,#187 ;
- D3: MOV R5,#248 ;
- DJNZ R5,[ DISCUZ_CODE_1 ]nbsp; ;
- DJNZ R6,D3 ;
- DJNZ R7,D2 ;
- RET ;
- TABLE:
- DB 0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H,0FEH,2AH,04H,0FEH,02H,04H ;
- DB 00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H ;
- DB 0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H ;
- DB 0FEH,0C0H,04H, 0FEH,84H,04H,0FEH,2AH,04H, 0FEH,02H,04H,0FDH,0C6H,04H ;
- DB 0FEH,98H,03H, 0FEH,98H,01H,0FEH,84H,04H, 0FEH,2AH,04H,0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FFH,0FFH */
- ;以下为公历转农历子程序
- CONvert: MOV A,time_year ;将年月日转化为 HEX 格式 16进制
- MOV B,#16
- DIV AB
- MOV CONvert_yeAr,B
- MOV B,#10
- MUL AB
- ADD A,CONvert_yeAr
- MOV CONvert_yeAr,A
- MOV A,time_month
- MOV C,ACC.7
- MOV f0,C ;f0暂存世纪标志,仅用于数据表定位
- CLR ACC.7
- JNB ACC.4,CON_02
- CLR ACC.4 ;ACC.4 为 1 表示大于 10 月
- ADD A,#10
- CON_02: MOV CONvert_mONth,A
- MOV A,time_date;
- SWAP A
- ANL A,#07H
- MOV B,#10
- MUL AB
- MOV CONVERT_DATE,A
- MOV A,TIME_DATE
- ANL A,#0FH
- ADD A,CONvert_dAte
- MOV CONvert_dAte,A
- MOV dptr,#mONth_dAtA ;以下定位本年数据在表格中的位置
- MOV A,CONvert_yeAr
- JB f0,CON_06 ;当前为 19 世纪年跳转
- ; ADD A,#100 ;从 19 世纪起定义表格起始年,20 世纪要加 100 年
- CON_06: CLR C
- SUBB A,#stArt_yeAr
- MOV B,#3 ;表格每年 3 字节
- MUL AB
- ADD A,dpl
- MOV dpl,A
- MOV A,B
- ADDC A,dph
- MOV dph,A
- MOV A,#2
- MOVC A,@A+dptr ;读本年表格最后一字节(春节日期)
- CLR ACC.7 ;ACC.7 是闰年第 13 个月大小,在此不用
- MOV B,#32
- DIV AB
- MOV temp_Byte1,A ;春节月份
- MOV temp_Byte2,B ;春节日
- ;以下计算当前日期距元旦天数
- MOV temp_Byte3,#0 ;设距元旦天数高位为 0
- MOV A,CONvert_mONth
- CJNE A,#10,CON_08
- CON_08: JC CON_09 ;9 月以前日子数小于 256 天,高字节为 0(9 月份过去的整月为 8 个月)
- MOV temp_Byte3,#1
- CON_09: MOV A,CONvert_yeAr
- ANL A,#03h ;ACC 为除 4 的余数
- JNZ CON_10 ;转常年处理
- ;年除 4 余数为 0 是闰年
- MOV A,CONvert_mONth
- LCALL get_ruN_dAys_lOw ;取得闰年过去月的天数的低字节
- SJMP CON_12
- CON_10: MOV A,CONvert_mONth
- LCALL get_dAys_lOw ;取得常年过去月的天数的低字节
- CON_12: MOV B,CONvert_dAte
- DEC B ;因为日期从 1 日起,而不是 0 日起
- ADD A,B ;过去的整月天数加当月天数
- MOV temp_Byte4,A
- JNC CON_14
- INC temp_Byte3 ;temp_Byte3,temp_Byte4 分别为公历年过去的天数的高低字节
- ;以下求春节距元旦天数,因肯定小于 256 天所以只用一字节表示
- CON_14: MOV A,temp_Byte1
- LCALL get_dAys_lOw ;春节不会在 3 月份,不用考虑闰年
- DEC A ;因为日期从 1 日起
- ADD A,temp_Byte2
- MOV temp_Byte5,A ;temp_Byte5,为春节距元旦天数
- MOV A,CONvert_mONth
- CJNE A,temp_Byte1,CON_20 ;转换月与春节月比较
- MOV A,CONvert_dAte
- CJNE A,temp_Byte2,CON_20 ;转换日与春节日比较
- CON_20: JC CON_22
- LJMP CON_60 ;当前日大于等于春节日期,公历年与农历年同年份
- CON_22: MOV A,CONvert_yeAr ;不到春节,农历年比公历年低一年
- JNZ CON_24
- MOV A,#100 ;年有效数 0-99
- CON_24: DEC A
- MOV CONvert_yeAr,A
- MOV A,dpl
- CLR C
- SUBB A,#3
- MOV dpl,A
- JNC CON_26
- DEC dph ;表格指针指向上一年
- CON_26: MOV A,temp_Byte5
- CLR C
- SUBB A,temp_Byte4
- MOV temp_Byte3,A ;temp_Byte3 中为当前日离春节的天数
- MOV CONvert_mONth,#12 ;农历月为 12 月
- CLR f0 ;1901-2099 年没有闰 12 月,清闰月标志
- CLR A
- MOVC A,@A+dptr
- ANL A,#0f0h
- SWAP A;
- MOV temp_Byte4,A ;temp_Byte4 中为闰月
- JZ CON_30 ;没有闰月转移
- MOV A,#2 ;有闰月,取第 13 个月天数
- MOVC A,@A+dptr
- MOV C,ACC.7
- MOV A,#1
- MOVC A,@A+dptr
- RLC A ;ACC 中为最后 6 个月的大小值
- SJMP CON_34
- CON_30: MOV A,#1
- MOVC A,@A+dptr ;ACC 中为最后 6 个月的大小值
- CON_34: MOV temp_Byte5,A
- CON_40: MOV A,temp_Byte5
- RRC A
- MOV temp_Byte5,A
- JC CON_42
- MOV B,#29 ;小月 29 天
- SJMP CON_44
- CON_42: MOV B,#30 ;大月 30 天
- CON_44: MOV A,temp_Byte3
- CLR C
- SUBB A,B
- JZ CON_46 ;正好够减,就是农历日 1 日
- JNC CON_50 ;不够减一月天数,结束农历月调整
- CPL A ;求补取绝对值
- INC A
- CON_46: INC A ;加 1 即为农历日
- MOV B,#10 ;转换并保存农历日,月,年
- DIV AB
- SWAP A
- ORL A,B
- MOV CONvert_dAte,A
- MOV A,CONvert_mONth
- MOV B,#10
- DIV AB
- SWAP A
- ORL A,B
- MOV C,f0
- MOV ACC.7,C
- MOV CONvert_mONth,A
- MOV A,CONvert_yeAr
- MOV B,#10
- DIV AB
- SWAP A
- ORL A,B
- MOV CONvert_yeAr,A
- RET ;结束转换 ==========================
- CON_50: MOV temp_Byte3,A ;temp_Byte3 存减去一月后的天数
- JB f0,CON_52 ;是闰月,前推一月,月份不减
- DEC CONvert_mONth;
- CON_52: MOV A,CONvert_mONth
- CJNE A,temp_Byte4,CON_54
- CPL f0 ;当前月与闰月相同,更改闰月标志
- CON_54: SJMP CON_40
- CON_60: MOV A,temp_Byte4 ;春节日小于当前日,农历年同公历年
- CLR C
- SUBB A,temp_Byte5
- MOV temp_Byte4,A
- JNC CON_62
- DEC temp_Byte3 ;temp_Byte3 temp_Byte4 中为公历日离春节的天数
- CON_62: MOV CONvert_mONth,#1 ;农历月为 1 月
- CLR A
- MOVC A,@A+dptr
- MOV temp_Byte5,A
- ANL A,#0f0h
- SWAP A;
- XCH A,temp_Byte5 ;temp_Byte5 中为闰月,ACC 为当年农历表第一字节
- CLR f0 ;第一个月肯定不是闰月
- ANL A,#0fh
- MOV temp_Byte1,A
- MOV A,#1
- MOVC A,@A+dptr
- MOV temp_Byte2,A
- ANL A,#0f0h
- ORL A,temp_Byte1
- SWAP A
- MOV temp_Byte1,A
- MOV A,#2
- MOVC A,@A+dptr
- MOV C,ACC.7
- MOV A,temp_Byte2
- ANL A,#0fh
- SWAP A
- MOV ACC.3,C;
- MOV temp_Byte2,A ;以上 temp_Byte1,temp_Byte2 各 BIT 存农历年大小
- CON_70: MOV A,temp_Byte2
- RLC A
- MOV temp_Byte2,A
- MOV A,temp_Byte1
- RLC A
- MOV temp_Byte1,A
- JC CON_72
- MOV B,#29 ;小月 29 天处理
- SJMP CON_74
- CON_72: MOV B,#30 ;大月 30 天
- CON_74: MOV A,temp_Byte4
- CLR C
- SUBB A,B
- JNC CON_78 ;低字节够减跳转
- MOV B,A ;低字节不够减, B 暂存减后结果,
- MOV A,temp_Byte3
- JZ CON_76 ;高字节为 0,不够减
- DEC temp_Byte3
- MOV temp_Byte4,B
- SJMP CON_80
- CON_76: MOV A,temp_Byte4 ;不够减结束月调整
- LJMP CON_46 ;转日期加 1 后,处理并保存转换后农历年月日
- CON_78: MOV temp_Byte4,A ;temp_Byte3 temp_Byte4 天数为减去一月后天数
- CON_80: MOV A,CONvert_mONth
- CJNE A,temp_Byte5,CON_82
- CPL f0 ;当前月与闰月相同,更改闰月标志
- JNB f0,CON_82 ;更改标志后是非闰月,月份加 1
- SJMP CON_70
- CON_82: INC CONvert_mONth;
- SJMP CON_70
- get_dAys_lOw:
- MOVC A,@A+PC ;取得常年过去月的天数的低字节
- RET
- DB 0,31,59,90,120,151,181,212,243,17,48,78
- get_ruN_dAys_lOw:
- MOVC A,@A+PC ;取得闰年过去月的天数的低字节
- RET
- DB 0,31,60,91,121,152,182,213,244,18,49,79
- mONth_dAtA:
- ;公历年对应的农历数据,每年三字节,
- ;格式第一字节 BIT7-4 位表示闰月月份,值为 0 为无闰月,BIT3-0 对应农历第 1-4 月的大小
- ;第二字节 BIT7-0 对应农历第 5-12 月大小,第三字节 BIT7 表示农历第 13 个月大小
- ;月份对应的位为 1 表示本农历月大(30 天),为 0 表示小(29 天).
- ;第三字节 BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
- /*DB 004h,0Aeh,053h,00Ah,057h,048h,055h,026h,0Bdh,00dh,026h,050h,00dh,095h,044h; 1905
- DB 046h,0AAh,0B9h,005h,06Ah,04dh,009h,0Adh,042h,024h,0Aeh,0B6h,004h,0Aeh,04Ah; 1910
- DB 06Ah,04dh,0Beh,00Ah,04dh,052h,00dh,025h,046h,05dh,052h,0BAh,00Bh,054h,04eh; 1915
- DB 00dh,06Ah,043h,029h,06dh,037h,009h,05Bh,04Bh,074h,09Bh,0C1h,004h,097h,054h; 1920
- DB 00Ah,04Bh,048h,05Bh,025h,0BCh,006h,0A5h,050h,006h,0d4h,045h,04Ah,0dAh,0B8h; 1925
- DB 002h,0B6h,04dh,009h,057h,042h,024h,097h,0B7h,004h,097h,04Ah,066h,04Bh,03eh; 1930
- DB 00dh,04Ah,051h,00eh,0A5h,046h,056h,0d4h,0BAh,005h,0Adh,04eh,002h,0B6h,044h; 1935
- DB 039h,037h,038h,009h,02eh,04Bh,07Ch,096h,0Bfh,00Ch,095h,053h,00dh,04Ah,048h; 1940
- DB 06dh,0A5h,03Bh,00Bh,055h,04fh,005h,06Ah,045h,04Ah,0Adh,0B9h,002h,05dh,04dh; 1945
- DB 009h,02dh,042h,02Ch,095h,0B6h,00Ah,095h,04Ah,07Bh,04Ah,0Bdh,006h,0CAh,051h; 1950
- DB 00Bh,055h,046h,055h,05Ah,0BBh,004h,0dAh,04eh,00Ah,05Bh,043h,035h,02Bh,0B8h; 1955
- DB 005h,02Bh,04Ch,08Ah,095h,03fh,00eh,095h,052h,006h,0AAh,048h,07Ah,0d5h,03Ch; 1960
- DB 00Ah,0B5h,04fh,004h,0B6h,045h,04Ah,057h,039h,00Ah,057h,04dh,005h,026h,042h; 1965
- DB 03eh,093h,035h,00dh,095h,049h,075h,0AAh,0Beh,005h,06Ah,051h,009h,06dh,046h; 1970
- DB 054h,0Aeh,0BBh,004h,0Adh,04fh,00Ah,04dh,043h,04dh,026h,0B7h,00dh,025h,04Bh; 1975
- DB 08dh,052h,0Bfh,00Bh,054h,052h,00Bh,06Ah,047h,069h,06dh,03Ch,009h,05Bh,050h; 1980
- DB 004h,09Bh,045h,04Ah,04Bh,0B9h,00Ah,04Bh,04dh,0ABh,025h,0C2h,006h,0A5h,054h; 1985
- DB 006h,0d4h,049h,06Ah,0dAh,03dh,00Ah,0B6h,051h,009h,037h,046h,054h,097h,0BBh; 1990
- DB 004h,097h,04fh,006h,04Bh,044h,036h,0A5h,037h,00eh,0A5h,04Ah,086h,0B2h,0Bfh; 1995
- DB 005h,0ACh,053h,00Ah,0B6h,047h,059h,036h,0BCh,009h,02eh,050h,00Ch,096h,045h; 2000 */
- DB 04dh,04Ah,0B8h,00dh,04Ah,04Ch,00dh,0A5h,041h,025h,0AAh,0B6h,005h,06Ah,049h; 2005
- DB 07Ah,0Adh,0Bdh,002h,05dh,052h,009h,02dh,047h,05Ch,095h,0BAh,00Ah,095h,04eh; 2010
- DB 00Bh,04Ah,043h,04Bh,055h,037h,00Ah,0d5h,04Ah,095h,05Ah,0Bfh,004h,0BAh,053h; 2015
- DB 00Ah,05Bh,048h,065h,02Bh,0BCh,005h,02Bh,050h,00Ah,093h,045h,047h,04Ah,0B9h; 2020
- DB 006h,0AAh,04Ch,00Ah,0d5h,041h,024h,0dAh,0B6h,004h,0B6h,04Ah,069h,057h,03dh; 2025
- DB 00Ah,04eh,051h,00dh,026h,046h,05eh,093h,03Ah,00dh,053h,04dh,005h,0AAh,043h; 2030
- DB 036h,0B5h,037h,009h,06dh,04Bh,0B4h,0Aeh,0Bfh,004h,0Adh,053h,00Ah,04dh,048h; 2035
- DB 06dh,025h,0BCh,00dh,025h,04fh,00dh,052h,044h,05dh,0AAh,038h,00Bh,05Ah,04Ch; 2040
- DB 005h,06dh,041h,024h,0Adh,0B6h,004h,09Bh,04Ah,07Ah,04Bh,0Beh,00Ah,04Bh,051h; 2045
- DB 00Ah,0A5h,046h,05Bh,052h,0BAh,006h,0d2h,04eh,00Ah,0dAh,042h,035h,05Bh,037h; 2050
- DB 009h,037h,04Bh,084h,097h,0C1h,004h,097h,053h,006h,04Bh,048h,066h,0A5h,03Ch; 2055
- DB 00eh,0A5h,04fh,006h,0B2h,044h,04Ah,0B6h,038h,00Ah,0Aeh,04Ch,009h,02eh,042h; 2060
- DB 03Ch,097h,035h,00Ch,096h,049h,07dh,04Ah,0Bdh,00dh,04Ah,051h,00dh,0A5h,045h; 2065
- DB 055h,0AAh,0BAh,005h,06Ah,04eh,00Ah,06dh,043h,045h,02eh,0B7h,005h,02dh,04Bh; 2070
- DB 08Ah,095h,0Bfh,00Ah,095h,053h,00Bh,04Ah,047h,06Bh,055h,03Bh,00Ah,0d5h,04fh; 2075
- DB 005h,05Ah,045h,04Ah,05dh,038h,00Ah,05Bh,04Ch,005h,02Bh,042h,03Ah,093h,0B6h; 2080
- DB 006h,093h,049h,077h,029h,0Bdh,006h,0AAh,051h,00Ah,0d5h,046h,054h,0dAh,0BAh; 2085
- DB 004h,0B6h,04eh,00Ah,057h,043h,045h,027h,038h,00dh,026h,04Ah,08eh,093h,03eh; 2090
- DB 00dh,052h,052h,00dh,0AAh,047h,066h,0B5h,03Bh,005h,06dh,04fh,004h,0Aeh,045h; 2095
- DB 04Ah,04eh,0B9h,00Ah,04dh,04Ch,00dh,015h,041h,02dh,092h,0B5h,00dh,053h,049h; 2100
- ;ds1302时钟上升沿输入命令或数据,下降沿输出数据.===========================================================================
- IN_1302:mov MIAO,#00H ;秒赋初值 出厂日期:2010.6.25.12:00:00
- mov FEN,#00H ;分赋初值
- mov SHI,#12H ;时赋初值
- mov RIQI,#025H ;日赋初值h
- mov YUE,#06H ;月赋初值
- mov XQI,#05H ;星期赋初值
- mov NIAN,#10H ;年赋初值
- lcall set1302 ;调用初值设定子程序
- RET
- ;入口参数:初始时间:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)*/
- Set1302:
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B, #8EH ;控制寄存器 10001110b
- LCALL RTInputByte
- MOV B, #00H ;写操作前WP=0
- LCALL RTInputByte
- MOV B, #90H ;控制寄存器 10010000b
- LCALL RTInputByte
- MOV B, #10101001b ;充电
- LCALL RTInputByte
- SETB T_CLK
- CLR T_RST
- MOV R0, #MIAO;
- MOV R7, #7 ;秒 分 时 日 月 星期 年 共7个字节
- MOV R1, #80H ;秒写地址 10000000b
- S13021: CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B, R1 ;写秒 分 时 日 月 星期 年 地址
- LCALL RTInputByte
- MOV A, @R0 ;写秒数据
- MOV B, A
- LCALL RTInputByte
- INC R0
- INC R1
- INC R1
- SETB T_CLK
- CLR T_RST
- DJNZ R7, S13021
- CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B, #8EH ;控制寄存器
- LCALL RTInputByte
- MOV B, #80H ;控制,WP=1,写保护
- LCALL RTInputByte
- SETB T_CLK
- CLR T_RST
- RET
- ;功 能:从DS1302 读时间
- Get1302:
- MOV R0, #MIAO;
- MOV R7, #7
- MOV R1, #81H ;秒地址
- G13021: CLR T_RST
- CLR T_CLK
- SETB T_RST
- MOV B, R1 ;秒 分 时 日 月 星期 年 地址
- LCALL RTInputByte
- LCALL RTOutputByte
- MOV @R0, A ;秒
- INC R0
- INC R1
- INC R1
- SETB T_CLK
- CLR T_RST
- DJNZ R7, G13021
- RET
- ;功 能:写1302一字节 (内部子程序)
- RTInputByte:
- MOV R3, #8 ;一个字节有八个位,移八次.
- Inbit1: MOV A, B
- RRC A ;通过A移入CY.
- MOV B, A
- MOV T_IO, C ;移入芯片内.
- SETB T_CLK
- CLR T_CLK
- DJNZ R3, Inbit1
- RET
- ;功 能:读1302一字节
- RTOutputByte:
- MOV R3, #8 ;一个字节有八个位,移八次.
- Out_1: MOV C, T_IO ;从芯片内移到CY
- RRC A ;通过CY移入A.
- SETB T_CLK
- CLR T_CLK
- DJNZ R3,Out_1
- RET
- ;=================================================
- ;以下子程序用于从当前公历日期,推算星期,
- ;入口:time_yeAr,time_month ,time_date ,定义公历年 月 日,BCD 码,其中月的
- ;BIT7 表示世纪,0表示20 世纪,1表示 19 世纪,出口 time_week, 0-6 表示星期日-星期六,程序不改变入口数据
- ;使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3
- GetWeek: MOV A,NIAN
- MOV B,#16
- DIV AB
- MOV temp_Byte1,B
- MOV B,#10
- MUL AB
- ADD A,temp_Byte1
- MOV temp_Byte1,A ;temp_Byte1=年
- MOV A,YUE
- JB ACC.7,getw02
- MOV A,#100
- ADD A,temp_Byte1
- MOV temp_Byte1,A ;20世纪年+100
- MOV A,YUE
- CLR ACC.7
- getw02: JNB ACC.4,getw04
- ADD A,#10
- CLR ACC.4
- getw04: MOV temp_Byte2,A ;temp_Byte2=月
- MOV A,RIQI
- MOV B,#16
- DIV AB
- MOV temp_Byte3,B
- MOV B,#10
- MUL AB
- ADD A,temp_Byte3
- MOV temp_Byte3,A ;temp_Byte3=日
- MOV A,temp_Byte1;
- ANL A,#03h
- JNZ getw10 ;非闰年转移
- MOV A,temp_Byte2
- CJNE A,#3,getw06
- getw06: JNC getw10 ;月大于 2 转移
- DEC temp_Byte3 ;份小于等于 2,又是闰年,日减 1
- getw10: MOV A,temp_Byte2;
- LCALL get_CorreCt ;取月校正表数据
- ADD A,temp_Byte1
- MOV B,#7
- DIV AB ;B放年加校正日数之和后除7 的余数 不先做这一步;有可能数据溢出
- MOV A,temp_Byte1
- ANL A,#0fCh
- RR A
- RR A ;以上年除 4 即闰年数
- ADD A,B
- ADD A,temp_Byte3
- MOV B,#7
- DIV AB
- MOV XQI,B ; time_week,B
- RET
- get_COrreCt:
- MOVC A,@A+PC
- RET
- DB 0,3,3,6,1,4,6,2,5,0,3,5
- END
-
复制代码 nbsp; ;等待
SETB DQ ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个BIT
SETB DQ
RET
READ_1820: ;将温度高位和低位从DS18B20中读出
MOV R4,#2 ; 读出两个字节的数据
MOV R1,#WDDW ;低位存
RE0: MOV R2,#8 ;数据一共有8位
RE1: CLR C
SETB DQ
NOP
NOP
NOP
CLR DQ ;读前总线保持为低
NOP
NOP
NOP
SETB DQ ;开始读总线释放
MOV R3,#9
RE2: DJNZ R3,RE2 ;延时18微妙
MOV C, DQ ; 从总线读到一个BIT
MOV R3,#23
RE3: DJNZ R3,RE3 ;等待100μ秒
RRC A ;把读得的位值环移给A
DJNZ R2,RE1 ;读下一个BIT
MOV @R1,A
DEC R1
DJNZ R4,RE0
RET
;;;;;;;;;;;;;;;;;;;; */
TURN: MOV A,WDGW
JBC ACC.4,TU ;是零下跳到TU
MOV D_BIT,#0FFH
DIS: MOV DPTR,#TAB
MOV A,WDDW ;低位
ANL A,#0FH ;取小数
MOVC A,@A+DPTR
MOV C_BIT,A ;精确到0.1度的小数值
MOV A,WDDW
SWAP A ;高低位互换
ANL A,#0FH
MOV WDDW,A
MOV A,WDGW
ANL A,#0FH
SWAP A
ORL A,WDDW;重新组合,为不带小数的温度值
MOV WDDW,A
MOV A,D_BIT
CJNE A,#10,TU_1;百位不是-跳转
MOV A,WDDW
DIS_1:
MOV B,#10
DIV AB
MOV A_BIT,B;十位值
MOV B_BIT,A;个位值
MOV A,D_BIT
CJNE A,#0,TU_2;百位不是0跳转
MOV D_BIT,#12;是0消隐
DIS_2:MOV A,B_BIT
CJNE A,#0,TUR;十位不是0转
MOV B_BIT,#12;是0消隐
TUR: RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TU: MOV D_BIT,#10;显示-号
CPL A
ANL A,#0FH
mov WDGW,A;取反A存入高位
MOV A,WDDW
CPL A
CLR C
INC A
MOV WDDW,A
MOV A,WDGW
ADDC A,#0
MOV WDGW,A
JMP DIS
TU_1: MOV A,WDDW
MOV B,#100
DIV AB
MOV D_BIT,A;百位值
MOV A,B
JMP DIS_1
TU_2: CJNE A,#10,TUR;百位不是-跳转
JMP DIS_2
TAB:DB 0, 1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
;;;;;;;;;;;;以上是温度程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
TABX:;5*7小字符 用于固定显示时间和温度
DB 060H, 090H, 090H, 090H, 090H, 090H, 060H, 000H ;0
DB 020H, 060H, 020H, 020H, 020H, 020H, 070H, 000H ;1
DB 060H, 090H, 010H, 020H, 040H, 080H, 0F0H, 000H ;2
DB 060H, 090H, 010H, 060H, 010H, 090H, 060H, 000H ;3
DB 020H, 060H, 0A0H, 0A0H, 0F0H, 020H, 020H, 000H ;4
DB 0F0H, 080H, 0E0H, 090H, 010H, 090H, 060H, 000H ;5
DB 060H, 090H, 080H, 0E0H, 090H, 090H, 060H, 000H ;6
DB 0F0H, 010H, 010H, 020H, 040H, 040H, 040H, 000H ;7
DB 060H, 090H, 090H, 060H, 090H, 090H, 060H, 000H ;8
DB 060H, 090H, 090H, 070H, 010H, 090H, 060H, 000H ;9
DB 000H, 000H, 000H, 0F0H, 000H, 000H, 000H, 000H ;- 10
DB 080H, 030H, 040H, 040H, 040H, 040H, 030H, 000H ;C 11
DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H ; 空格 12
DB 000H, 000H, 000H, 000H, 060H, 060H, 000H, 000H ;. 13
DB 000H, 060H, 060H, 000H, 060H, 060H, 000H, 000H ;: 14
DB 000H, 000H, 080H, 000H, 000H, 080H, 000H, 000H ;: 单冒号15
/*;程序功能:歌曲演奏
START1: MOV TMOD,#00000001B; 设T0方式1
MOV IE,#10000010B;允许T0中断
MOV DPTR,#TABLE ; 存表首地址
LOOP: CLR A ; 清零
MOVC A,@A+DPTR ; 查表
MOV R1,A ; 定时器高8位存R1
INC DPTR ; 指针加1
CLR A ; 清零
MOVC A,@A+DPTR ; 查表
MOV R0,A ; 定时器低8位存R0
ORL A,R1 ; 进行"或"运算
JZ NEXT0 ; 全0为休止符
MOV A, R0 ;
ANL A, R1 ; 进行"与"运算
CJNE A,#0FFH,NEXT; 全1表示乐曲结束
RET
NEXT: MOV TH0,R1 ; 装入高位定时值
MOV TL0,R0 ; 装入低位定时值
SETB TR0 ; 启动定时器T0
setb tf0 ;启动定时器工作
JMP NEXT1 ; 转移NEXT1处
NEXT0: CLR TR0 ; 关闭定时器停止发音
NEXT1: CLR A ; 清零
INC DPTR ; 指针加1
MOVC A,@A+DPTR ; 查延时常数
MOV R2, A ; 延时常数存入R2
LOOP1: ACALL DDELAY ; 调延时子程序
DJNZ R2, LOOP1 ; 控制延时次数
INC DPTR ; 指针加1
JMP LOOP ; 转移LOOP处
EXT0: MOV TH0,R1 ; 重装定时值
MOV TL0,R0 ;
CPL BEEP ; 反相输出
RETI ; 中断返回
DDELAY: MOV R7,#2 ; 延时187ms
D2: MOV R6,#187 ;
D3: MOV R5,#248 ;
DJNZ R5,[ DISCUZ_CODE_1 ]nbsp; ;
DJNZ R6,D3 ;
DJNZ R7,D2 ;
RET ;
TABLE:
DB 0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H,0FEH,2AH,04H,0FEH,02H,04H ;
DB 00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H ;
DB 0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H ;
DB 0FEH,0C0H,04H, 0FEH,84H,04H,0FEH,2AH,04H, 0FEH,02H,04H,0FDH,0C6H,04H ;
DB 0FEH,98H,03H, 0FEH,98H,01H,0FEH,84H,04H, 0FEH,2AH,04H,0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FFH,0FFH */
;以下为公历转农历子程序
CONvert: MOV A,time_year ;将年月日转化为 HEX 格式 16进制
MOV B,#16
DIV AB
MOV CONvert_yeAr,B
MOV B,#10
MUL AB
ADD A,CONvert_yeAr
MOV CONvert_yeAr,A
MOV A,time_month
MOV C,ACC.7
MOV f0,C ;f0暂存世纪标志,仅用于数据表定位
CLR ACC.7
JNB ACC.4,CON_02
CLR ACC.4 ;ACC.4 为 1 表示大于 10 月
ADD A,#10
CON_02: MOV CONvert_mONth,A
MOV A,time_date;
SWAP A
ANL A,#07H
MOV B,#10
MUL AB
MOV CONVERT_DATE,A
MOV A,TIME_DATE
ANL A,#0FH
ADD A,CONvert_dAte
MOV CONvert_dAte,A
MOV dptr,#mONth_dAtA ;以下定位本年数据在表格中的位置
MOV A,CONvert_yeAr
JB f0,CON_06 ;当前为 19 世纪年跳转
; ADD A,#100 ;从 19 世纪起定义表格起始年,20 世纪要加 100 年
CON_06: CLR C
SUBB A,#stArt_yeAr
MOV B,#3 ;表格每年 3 字节
MUL AB
ADD A,dpl
MOV dpl,A
MOV A,B
ADDC A,dph
MOV dph,A
MOV A,#2
MOVC A,@A+dptr ;读本年表格最后一字节(春节日期)
CLR ACC.7 ;ACC.7 是闰年第 13 个月大小,在此不用
MOV B,#32
DIV AB
MOV temp_Byte1,A ;春节月份
MOV temp_Byte2,B ;春节日
;以下计算当前日期距元旦天数
MOV temp_Byte3,#0 ;设距元旦天数高位为 0
MOV A,CONvert_mONth
CJNE A,#10,CON_08
CON_08: JC CON_09 ;9 月以前日子数小于 256 天,高字节为 0(9 月份过去的整月为 8 个月)
MOV temp_Byte3,#1
CON_09: MOV A,CONvert_yeAr
ANL A,#03h ;ACC 为除 4 的余数
JNZ CON_10 ;转常年处理
;年除 4 余数为 0 是闰年
MOV A,CONvert_mONth
LCALL get_ruN_dAys_lOw ;取得闰年过去月的天数的低字节
SJMP CON_12
CON_10: MOV A,CONvert_mONth
LCALL get_dAys_lOw ;取得常年过去月的天数的低字节
CON_12: MOV B,CONvert_dAte
DEC B ;因为日期从 1 日起,而不是 0 日起
ADD A,B ;过去的整月天数加当月天数
MOV temp_Byte4,A
JNC CON_14
INC temp_Byte3 ;temp_Byte3,temp_Byte4 分别为公历年过去的天数的高低字节
;以下求春节距元旦天数,因肯定小于 256 天所以只用一字节表示
CON_14: MOV A,temp_Byte1
LCALL get_dAys_lOw ;春节不会在 3 月份,不用考虑闰年
DEC A ;因为日期从 1 日起
ADD A,temp_Byte2
MOV temp_Byte5,A ;temp_Byte5,为春节距元旦天数
MOV A,CONvert_mONth
CJNE A,temp_Byte1,CON_20 ;转换月与春节月比较
MOV A,CONvert_dAte
CJNE A,temp_Byte2,CON_20 ;转换日与春节日比较
CON_20: JC CON_22
LJMP CON_60 ;当前日大于等于春节日期,公历年与农历年同年份
CON_22: MOV A,CONvert_yeAr ;不到春节,农历年比公历年低一年
JNZ CON_24
MOV A,#100 ;年有效数 0-99
CON_24: DEC A
MOV CONvert_yeAr,A
MOV A,dpl
CLR C
SUBB A,#3
MOV dpl,A
JNC CON_26
DEC dph ;表格指针指向上一年
CON_26: MOV A,temp_Byte5
CLR C
SUBB A,temp_Byte4
MOV temp_Byte3,A ;temp_Byte3 中为当前日离春节的天数
MOV CONvert_mONth,#12 ;农历月为 12 月
CLR f0 ;1901-2099 年没有闰 12 月,清闰月标志
CLR A
MOVC A,@A+dptr
ANL A,#0f0h
SWAP A;
MOV temp_Byte4,A ;temp_Byte4 中为闰月
JZ CON_30 ;没有闰月转移
MOV A,#2 ;有闰月,取第 13 个月天数
MOVC A,@A+dptr
MOV C,ACC.7
MOV A,#1
MOVC A,@A+dptr
RLC A ;ACC 中为最后 6 个月的大小值
SJMP CON_34
CON_30: MOV A,#1
MOVC A,@A+dptr ;ACC 中为最后 6 个月的大小值
CON_34: MOV temp_Byte5,A
CON_40: MOV A,temp_Byte5
RRC A
MOV temp_Byte5,A
JC CON_42
MOV B,#29 ;小月 29 天
SJMP CON_44
CON_42: MOV B,#30 ;大月 30 天
CON_44: MOV A,temp_Byte3
CLR C
SUBB A,B
JZ CON_46 ;正好够减,就是农历日 1 日
JNC CON_50 ;不够减一月天数,结束农历月调整
CPL A ;求补取绝对值
INC A
CON_46: INC A ;加 1 即为农历日
MOV B,#10 ;转换并保存农历日,月,年
DIV AB
SWAP A
ORL A,B
MOV CONvert_dAte,A
MOV A,CONvert_mONth
MOV B,#10
DIV AB
SWAP A
ORL A,B
MOV C,f0
MOV ACC.7,C
MOV CONvert_mONth,A
MOV A,CONvert_yeAr
MOV B,#10
DIV AB
SWAP A
ORL A,B
MOV CONvert_yeAr,A
RET ;结束转换 ==========================
CON_50: MOV temp_Byte3,A ;temp_Byte3 存减去一月后的天数
JB f0,CON_52 ;是闰月,前推一月,月份不减
DEC CONvert_mONth;
CON_52: MOV A,CONvert_mONth
CJNE A,temp_Byte4,CON_54
CPL f0 ;当前月与闰月相同,更改闰月标志
CON_54: SJMP CON_40
CON_60: MOV A,temp_Byte4 ;春节日小于当前日,农历年同公历年
CLR C
SUBB A,temp_Byte5
MOV temp_Byte4,A
JNC CON_62
DEC temp_Byte3 ;temp_Byte3 temp_Byte4 中为公历日离春节的天数
CON_62: MOV CONvert_mONth,#1 ;农历月为 1 月
CLR A
MOVC A,@A+dptr
MOV temp_Byte5,A
ANL A,#0f0h
SWAP A;
XCH A,temp_Byte5 ;temp_Byte5 中为闰月,ACC 为当年农历表第一字节
CLR f0 ;第一个月肯定不是闰月
ANL A,#0fh
MOV temp_Byte1,A
MOV A,#1
MOVC A,@A+dptr
MOV temp_Byte2,A
ANL A,#0f0h
ORL A,temp_Byte1
SWAP A
MOV temp_Byte1,A
MOV A,#2
MOVC A,@A+dptr
MOV C,ACC.7
MOV A,temp_Byte2
ANL A,#0fh
SWAP A
MOV ACC.3,C;
MOV temp_Byte2,A ;以上 temp_Byte1,temp_Byte2 各 BIT 存农历年大小
CON_70: MOV A,temp_Byte2
RLC A
MOV temp_Byte2,A
MOV A,temp_Byte1
RLC A
MOV temp_Byte1,A
JC CON_72
MOV B,#29 ;小月 29 天处理
SJMP CON_74
CON_72: MOV B,#30 ;大月 30 天
CON_74: MOV A,temp_Byte4
CLR C
SUBB A,B
JNC CON_78 ;低字节够减跳转
MOV B,A ;低字节不够减, B 暂存减后结果,
MOV A,temp_Byte3
JZ CON_76 ;高字节为 0,不够减
DEC temp_Byte3
MOV temp_Byte4,B
SJMP CON_80
CON_76: MOV A,temp_Byte4 ;不够减结束月调整
LJMP CON_46 ;转日期加 1 后,处理并保存转换后农历年月日
CON_78: MOV temp_Byte4,A ;temp_Byte3 temp_Byte4 天数为减去一月后天数
CON_80: MOV A,CONvert_mONth
CJNE A,temp_Byte5,CON_82
CPL f0 ;当前月与闰月相同,更改闰月标志
JNB f0,CON_82 ;更改标志后是非闰月,月份加 1
SJMP CON_70
CON_82: INC CONvert_mONth;
SJMP CON_70
get_dAys_lOw:
MOVC A,@A+PC ;取得常年过去月的天数的低字节
RET
DB 0,31,59,90,120,151,181,212,243,17,48,78
get_ruN_dAys_lOw:
MOVC A,@A+PC ;取得闰年过去月的天数的低字节
RET
DB 0,31,60,91,121,152,182,213,244,18,49,79
mONth_dAtA:
;公历年对应的农历数据,每年三字节,
;格式第一字节 BIT7-4 位表示闰月月份,值为 0 为无闰月,BIT3-0 对应农历第 1-4 月的大小
;第二字节 BIT7-0 对应农历第 5-12 月大小,第三字节 BIT7 表示农历第 13 个月大小
;月份对应的位为 1 表示本农历月大(30 天),为 0 表示小(29 天).
;第三字节 BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期
/*DB 004h,0Aeh,053h,00Ah,057h,048h,055h,026h,0Bdh,00dh,026h,050h,00dh,095h,044h; 1905
DB 046h,0AAh,0B9h,005h,06Ah,04dh,009h,0Adh,042h,024h,0Aeh,0B6h,004h,0Aeh,04Ah; 1910
DB 06Ah,04dh,0Beh,00Ah,04dh,052h,00dh,025h,046h,05dh,052h,0BAh,00Bh,054h,04eh; 1915
DB 00dh,06Ah,043h,029h,06dh,037h,009h,05Bh,04Bh,074h,09Bh,0C1h,004h,097h,054h; 1920
DB 00Ah,04Bh,048h,05Bh,025h,0BCh,006h,0A5h,050h,006h,0d4h,045h,04Ah,0dAh,0B8h; 1925
DB 002h,0B6h,04dh,009h,057h,042h,024h,097h,0B7h,004h,097h,04Ah,066h,04Bh,03eh; 1930
DB 00dh,04Ah,051h,00eh,0A5h,046h,056h,0d4h,0BAh,005h,0Adh,04eh,002h,0B6h,044h; 1935
DB 039h,037h,038h,009h,02eh,04Bh,07Ch,096h,0Bfh,00Ch,095h,053h,00dh,04Ah,048h; 1940
DB 06dh,0A5h,03Bh,00Bh,055h,04fh,005h,06Ah,045h,04Ah,0Adh,0B9h,002h,05dh,04dh; 1945
DB 009h,02dh,042h,02Ch,095h,0B6h,00Ah,095h,04Ah,07Bh,04Ah,0Bdh,006h,0CAh,051h; 1950
DB 00Bh,055h,046h,055h,05Ah,0BBh,004h,0dAh,04eh,00Ah,05Bh,043h,035h,02Bh,0B8h; 1955
DB 005h,02Bh,04Ch,08Ah,095h,03fh,00eh,095h,052h,006h,0AAh,048h,07Ah,0d5h,03Ch; 1960
DB 00Ah,0B5h,04fh,004h,0B6h,045h,04Ah,057h,039h,00Ah,057h,04dh,005h,026h,042h; 1965
DB 03eh,093h,035h,00dh,095h,049h,075h,0AAh,0Beh,005h,06Ah,051h,009h,06dh,046h; 1970
DB 054h,0Aeh,0BBh,004h,0Adh,04fh,00Ah,04dh,043h,04dh,026h,0B7h,00dh,025h,04Bh; 1975
DB 08dh,052h,0Bfh,00Bh,054h,052h,00Bh,06Ah,047h,069h,06dh,03Ch,009h,05Bh,050h; 1980
DB 004h,09Bh,045h,04Ah,04Bh,0B9h,00Ah,04Bh,04dh,0ABh,025h,0C2h,006h,0A5h,054h; 1985
DB 006h,0d4h,049h,06Ah,0dAh,03dh,00Ah,0B6h,051h,009h,037h,046h,054h,097h,0BBh; 1990
DB 004h,097h,04fh,006h,04Bh,044h,036h,0A5h,037h,00eh,0A5h,04Ah,086h,0B2h,0Bfh; 1995
DB 005h,0ACh,053h,00Ah,0B6h,047h,059h,036h,0BCh,009h,02eh,050h,00Ch,096h,045h; 2000 */
DB 04dh,04Ah,0B8h,00dh,04Ah,04Ch,00dh,0A5h,041h,025h,0AAh,0B6h,005h,06Ah,049h; 2005
DB 07Ah,0Adh,0Bdh,002h,05dh,052h,009h,02dh,047h,05Ch,095h,0BAh,00Ah,095h,04eh; 2010
DB 00Bh,04Ah,043h,04Bh,055h,037h,00Ah,0d5h,04Ah,095h,05Ah,0Bfh,004h,0BAh,053h; 2015
DB 00Ah,05Bh,048h,065h,02Bh,0BCh,005h,02Bh,050h,00Ah,093h,045h,047h,04Ah,0B9h; 2020
DB 006h,0AAh,04Ch,00Ah,0d5h,041h,024h,0dAh,0B6h,004h,0B6h,04Ah,069h,057h,03dh; 2025
DB 00Ah,04eh,051h,00dh,026h,046h,05eh,093h,03Ah,00dh,053h,04dh,005h,0AAh,043h; 2030
DB 036h,0B5h,037h,009h,06dh,04Bh,0B4h,0Aeh,0Bfh,004h,0Adh,053h,00Ah,04dh,048h; 2035
DB 06dh,025h,0BCh,00dh,025h,04fh,00dh,052h,044h,05dh,0AAh,038h,00Bh,05Ah,04Ch; 2040
DB 005h,06dh,041h,024h,0Adh,0B6h,004h,09Bh,04Ah,07Ah,04Bh,0Beh,00Ah,04Bh,051h; 2045
DB 00Ah,0A5h,046h,05Bh,052h,0BAh,006h,0d2h,04eh,00Ah,0dAh,042h,035h,05Bh,037h; 2050
DB 009h,037h,04Bh,084h,097h,0C1h,004h,097h,053h,006h,04Bh,048h,066h,0A5h,03Ch; 2055
DB 00eh,0A5h,04fh,006h,0B2h,044h,04Ah,0B6h,038h,00Ah,0Aeh,04Ch,009h,02eh,042h; 2060
DB 03Ch,097h,035h,00Ch,096h,049h,07dh,04Ah,0Bdh,00dh,04Ah,051h,00dh,0A5h,045h; 2065
DB 055h,0AAh,0BAh,005h,06Ah,04eh,00Ah,06dh,043h,045h,02eh,0B7h,005h,02dh,04Bh; 2070
DB 08Ah,095h,0Bfh,00Ah,095h,053h,00Bh,04Ah,047h,06Bh,055h,03Bh,00Ah,0d5h,04fh; 2075
DB 005h,05Ah,045h,04Ah,05dh,038h,00Ah,05Bh,04Ch,005h,02Bh,042h,03Ah,093h,0B6h; 2080
DB 006h,093h,049h,077h,029h,0Bdh,006h,0AAh,051h,00Ah,0d5h,046h,054h,0dAh,0BAh; 2085
DB 004h,0B6h,04eh,00Ah,057h,043h,045h,027h,038h,00dh,026h,04Ah,08eh,093h,03eh; 2090
DB 00dh,052h,052h,00dh,0AAh,047h,066h,0B5h,03Bh,005h,06dh,04fh,004h,0Aeh,045h; 2095
DB 04Ah,04eh,0B9h,00Ah,04dh,04Ch,00dh,015h,041h,02dh,092h,0B5h,00dh,053h,049h; 2100
;ds1302时钟上升沿输入命令或数据,下降沿输出数据.===========================================================================
IN_1302:mov MIAO,#00H ;秒赋初值 出厂日期:2010.6.25.12:00:00
mov FEN,#00H ;分赋初值
mov SHI,#12H ;时赋初值
mov RIQI,#025H ;日赋初值h
mov YUE,#06H ;月赋初值
mov XQI,#05H ;星期赋初值
mov NIAN,#10H ;年赋初值
lcall set1302 ;调用初值设定子程序
RET
;入口参数:初始时间:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)*/
Set1302:
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #8EH ;控制寄存器 10001110b
LCALL RTInputByte
MOV B, #00H ;写操作前WP=0
LCALL RTInputByte
MOV B, #90H ;控制寄存器 10010000b
LCALL RTInputByte
MOV B, #10101001b ;充电
LCALL RTInputByte
SETB T_CLK
CLR T_RST
MOV R0, #MIAO;
MOV R7, #7 ;秒 分 时 日 月 星期 年 共7个字节
MOV R1, #80H ;秒写地址 10000000b
S13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, R1 ;写秒 分 时 日 月 星期 年 地址
LCALL RTInputByte
MOV A, @R0 ;写秒数据
MOV B, A
LCALL RTInputByte
INC R0
INC R1
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7, S13021
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #8EH ;控制寄存器
LCALL RTInputByte
MOV B, #80H ;控制,WP=1,写保护
LCALL RTInputByte
SETB T_CLK
CLR T_RST
RET
;功 能:从DS1302 读时间
Get1302:
MOV R0, #MIAO;
MOV R7, #7
MOV R1, #81H ;秒地址
G13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, R1 ;秒 分 时 日 月 星期 年 地址
LCALL RTInputByte
LCALL RTOutputByte
MOV @R0, A ;秒
INC R0
INC R1
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7, G13021
RET
;功 能:写1302一字节 (内部子程序)
RTInputByte:
MOV R3, #8 ;一个字节有八个位,移八次.
Inbit1: MOV A, B
RRC A ;通过A移入CY.
MOV B, A
MOV T_IO, C ;移入芯片内.
SETB T_CLK
CLR T_CLK
DJNZ R3, Inbit1
RET
;功 能:读1302一字节
RTOutputByte:
MOV R3, #8 ;一个字节有八个位,移八次.
Out_1: MOV C, T_IO ;从芯片内移到CY
RRC A ;通过CY移入A.
SETB T_CLK
CLR T_CLK
DJNZ R3,Out_1
RET
;=================================================
;以下子程序用于从当前公历日期,推算星期,
;入口:time_yeAr,time_month ,time_date ,定义公历年 月 日,BCD 码,其中月的
;BIT7 表示世纪,0表示20 世纪,1表示 19 世纪,出口 time_week, 0-6 表示星期日-星期六,程序不改变入口数据
;使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3
GetWeek: MOV A,NIAN
MOV B,#16
DIV AB
MOV temp_Byte1,B
MOV B,#10
MUL AB
ADD A,temp_Byte1
MOV temp_Byte1,A ;temp_Byte1=年
MOV A,YUE
JB ACC.7,getw02
MOV A,#100
ADD A,temp_Byte1
MOV temp_Byte1,A ;20世纪年+100
MOV A,YUE
CLR ACC.7
getw02: JNB ACC.4,getw04
ADD A,#10
CLR ACC.4
getw04: MOV temp_Byte2,A ;temp_Byte2=月
MOV A,RIQI
MOV B,#16
DIV AB
MOV temp_Byte3,B
MOV B,#10
MUL AB
ADD A,temp_Byte3
MOV temp_Byte3,A ;temp_Byte3=日
MOV A,temp_Byte1;
ANL A,#03h
JNZ getw10 ;非闰年转移
MOV A,temp_Byte2
CJNE A,#3,getw06
getw06: JNC getw10 ;月大于 2 转移
DEC temp_Byte3 ;份小于等于 2,又是闰年,日减 1
getw10: MOV A,temp_Byte2;
LCALL get_CorreCt ;取月校正表数据
ADD A,temp_Byte1
MOV B,#7
DIV AB ;B放年加校正日数之和后除7 的余数 不先做这一步;有可能数据溢出
MOV A,temp_Byte1
ANL A,#0fCh
RR A
RR A ;以上年除 4 即闰年数
ADD A,B
ADD A,temp_Byte3
MOV B,#7
DIV AB
MOV XQI,B ; time_week,B
RET
get_COrreCt:
MOVC A,@A+PC
RET
DB 0,3,3,6,1,4,6,2,5,0,3,5
END
[/code]
|