找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8038|回复: 4
打印 上一主题 下一主题
收起左侧

1.9mm点阵做的3208时钟,上传源程序

[复制链接]
跳转到指定楼层
楼主
昨天晚上刚弄完工的,相机不在,用手机拍的,不清晰。日历,星期,温度,农历滚动显示:高手看了别笑话。





  1. ;***************引脚定义,根据使用不同的管脚而改动*************
  2. ;农历,星期,1302程序由网上下载
  3. ABCD    EQU    P2      ;行扫描0-7
  4. SEG     EQU    P1.1    ; 红
  5. SER     EQU    P1.0    ;内容发送绿
  6. SRCLK   EQU    P1.2    ;串行CP端
  7. RCLK    EQU    P1.3    ;输出CP端
  8. EN      EQU    P1.4    ;EN为138使能端.高电平关闭显示;低电平显示
  9. DQ      EQU    P3.6    ;温度18b20
  10. BEEP    EQU    P3.7           ;蜂鸣器
  11. AN      EQU    P0.1           ;中间按键
  12. ANS     EQU    P0.0           ;上按键
  13. ANX     EQU    P0.4           ;下按键
  14. ANZ     EQU    P0.2           ;左按键
  15. ANY     EQU    P0.3           ;右按键
  16. T_CLK   EQU    P0.7    ;实时时钟时钟线引脚
  17. T_IO    EQU    P0.6    ;实时时钟数据线引脚
  18. T_RST   EQU    P0.5    ;实时时钟复位线引脚
  19. ;温度存放地址
  20. A_BIT   EQU  22H     ;存放个位数变量
  21. B_BIT   EQU  21H     ;存放十位数变量
  22. C_BIT   EQU  24H     ;存放 小数变量
  23. D_BIT   EQU  20H     ;存放 百 位数变量
  24. FLAG    EQU  26H     ;DS18B20是否存在标志
  25. XSD     EQU  23H     ;点
  26. WDFH    EQU  25H     ;℃
  27. WDGW    EQU  27H        ;温度高位值
  28. WDDW    EQU  28H        ;温度低位值
  29. QUSHU   EQU  28H
  30. QUSHU1  EQU  08H
  31. QUSHU2  EQU  09H
  32. LSTZSJ1 EQU  0AH
  33. LSTZSJ  EQU  0BH
  34. MIAO            EQU         20H                                ;秒
  35. FEN            EQU         21H                                ;分
  36. SHI            EQU         22H                                ;时
  37. RIQI            EQU         23H                                ;日
  38. YUE            EQU         24H                                ;月  ACC.7=0为2000年
  39. XQI            EQU         25H                                ;星期
  40. NIAN            EQU         26H                                ;年   
  41. start_year     EQU     01;    定义查询表起始年份,01--199 表示 1901-2099 年
  42. ;以下三单元为需转换的公历日期          是子程序的入口数据
  43. time_year      EQU    NIAN
  44. time_month     EQU    YUE    ;BIT7 表示世纪,为  1 表示 19 世纪,为 0 表示 20 世纪
  45. time_date      EQU    RIQI
  46. ;以下三单元存转换后农历日期         与入口单元重叠,如要保留入口信息,请重定义出口地址
  47. CONvert_yeAr   DATA   3Fh
  48. CONvert_mONth   DATA   3Eh    ;BIT7 为 1 表示闰月
  49. CONvert_dAte   DATA    3Dh
  50. temp_Byte4     DATA    3Bh
  51. temp_Byte5     DATA    3Ch
  52. temp_Byte1  EQU  20H
  53. temp_Byte2  EQU  21H
  54. temp_Byte3  EQU  22H
  55. ;*************************************************************        
  56. ;*********************中断入口程序****************************
  57.         ORG     0000H
  58.         LJMP    MAIN
  59.     ;    ORG     0003H
  60.    ;     RETI
  61.     ;    ORG     000BH   ; 定时器 T0中断入口
  62.      ;   JMP     EXT0    ; 跳至T0中断子程序   
  63.      ;   ORG     0013H
  64.      ;   RETI
  65.      ;;   ORG     001BH
  66.      ;   RETI
  67.     ;    ORG     0023H
  68.     ;    RETI
  69. ;***************主程序****************************************/
  70. MAIN: MOV    SP,#69H          ;堆栈首址
  71.       LCALL BEEP_BZ
  72.       LCALL AN_DEL
  73.       LCALL BEEP_BZ           ;开机鸣响2声
  74.       LCALL RE_TEMP        ;对DS18B20初始化及读取
  75.                 LCALL GET1302 ;读时间
  76.                 MOV A,MIAO
  77.                 JNB ACC.7,STRAT   ;如果秒最高位是1初始化时钟
  78.           LCALL IN_1302         ;时钟芯片初始化
  79. STRAT: ; MOV    SP,#69H          ;堆栈首址
  80.        ; MOV    R0,#30H          ;初使化寄存显示单元
  81.        ; MOV    R1,#74           ;30H-单元清零
  82.        ; MOV    A,#0
  83. ST:    ; MOV    @R0,A
  84.        ; INC    R0
  85.        ; DJNZ   R1,ST

  86. ST1:
  87.                 LCALL  Get1302                   ;读取时间
  88.       LCALL  XSSJ           ;时间数据转换
  89.                 LCALL  PLAY1                          ;显示时间
  90.                 MOV A,MIAO          ;如果秒=30显示滚动日期
  91.                 CJNE A,#30H,ST2
  92.                 LCALL GDRQ
  93. ST2:  JNB ANZ,WD                 ;按下左键调用温度显示
  94.   ;    JNB ANY,YYUE         ;按下右键调用音乐
  95.       JNB ANX,G_DRQ          ;按下下键调用滚动显示日历
  96.                 JNB AN,TZSJ   ;按下中间按键调用调时
  97.                 JMP    ST1
  98. ;*****************************
  99. G_DRQ:LCALL GDRQ
  100.       JMP ST1
  101. ;*****************************************************
  102. WD:   LCALL AN_DEL
  103.       JB ANZ,WD_OUT
  104.       LCALL BEEP_BZ
  105. WD_1: LCALL  RE_TEMP        ;读取温度
  106.       LCALL   TURN          ;转化温度子程序        
  107.       LCALL  XSWD           ;温度数据转换
  108.                 LCALL  PLAY                          ;显示
  109.                 JB ANZ,WD_1
  110.                 LCALL AN_DEL
  111.                 LCALL BEEP_BZ
  112.             JNB ANZ,WDOUT
  113. WD_OUT:RET
  114. GDRQ: LCALL  Get1302                   ;读取时间
  115.       LCALL   RQFL    ;调用日期分离程序
  116.       LCALL   L30_
  117.       RET
  118. WDOUT:LJMP ST1
  119. ;*******************************************调整时间程序*************
  120. TZSJ:
  121.          LCALL AN_DEL
  122.                JNB AN,$
  123.               LCALL BEEP_BZ
  124. TZSJ_1:  LCALL S_NIAN  ;显示调年
  125.          JNB ANS, N_J1          ;年+1
  126.                JNB ANX,N_1            ;年-1
  127.         JNB ANY,TZ_YUE  ;调月
  128.         JNB AN,TZSJOUT;确认
  129.              JNB ANZ, TZ_NOUT
  130.          JMP TZSJ_1
  131. TZSJOUT:;LCALL GetWeek
  132. LCALL Set1302
  133.             LCALL BEEP_BZ
  134. TZ_NOUT:        LJMP ST1
  135. N_J1:  LCALL AN_DEL  ;年+1
  136.        LCALL BEEP_BZ
  137.       LCALL NIAN_J1
  138.       LJMP TZSJ_1
  139. N_1:  LCALL AN_DEL ;年-1
  140.               LCALL BEEP_BZ
  141.       LCALL NIAN_1
  142.       LJMP TZSJ_1
  143. ;***************************************
  144. Y_J1:  LCALL AN_DEL;月+1
  145.               LCALL BEEP_BZ
  146.       LCALL YUE_J1
  147.       LJMP TZ_YUE1
  148. Y_1:  LCALL AN_DEL ;月-1
  149.               LCALL BEEP_BZ
  150.       LCALL YUE_1
  151.       LJMP TZ_YUE1
  152. ;*********
  153. TZ_YUE: LCALL AN_DEL
  154.       JNB ANY,$
  155.    LCALL BEEP_BZ
  156. TZ_YUE1: LCALL S_YUE;显示调月
  157.          JNB ANS,Y_J1;月+1
  158.          JNB ANX,Y_1;月-1
  159.          JNB ANY,TZ_RIQI;调日期
  160.          JNB AN,TZ_YUEOUT
  161.            JNB ANZ, TZ_YOUT
  162.        JMP TZ_YUE1
  163. TZ_YUEOUT:LCALL GetWeek
  164. LCALL SET1302
  165.   LCALL BEEP_BZ
  166. TZ_YOUT:LJMP ST1
  167. ;***************************************
  168. R_J1:  LCALL AN_DEL;月+1
  169.               LCALL BEEP_BZ
  170.       LCALL RIQI_J1
  171.       LJMP TZ_RIQI1
  172. R_1:  LCALL AN_DEL ;月-1
  173.               LCALL BEEP_BZ
  174.       LCALL RIQI_1
  175.       LJMP TZ_RIQI1
  176. ;*********
  177. TZ_RIQI: LCALL AN_DEL
  178.       JNB ANY,$
  179.    LCALL BEEP_BZ
  180. TZ_RIQI1: LCALL S_RIQI;显示调日期
  181.          JNB ANS,R_J1;日期+1
  182.          JNB ANX,R_1;日期-1
  183.          JNB ANY,TZ_SHI;
  184.          JNB AN,TZ_RIQIOUT
  185.               JNB ANZ, TZ_ROUT
  186.         JMP TZ_RIQI1
  187. TZ_RIQIOUT:;LCALL GetWeek
  188. LCALL SET1302
  189.   LCALL BEEP_BZ
  190. TZ_ROUT:LJMP ST1
  191. ;***************************************
  192. S_J1:  LCALL AN_DEL;时+1
  193.               LCALL BEEP_BZ
  194.       LCALL SHI_J1
  195.       LJMP TZ_SHI1
  196. S_1:  LCALL AN_DEL ;时-1
  197.               LCALL BEEP_BZ
  198.       LCALL SHI_1
  199.       LJMP TZ_SHI1
  200. ;*********
  201. TZ_SHI: LCALL AN_DEL
  202.       JNB ANY,$
  203.    LCALL BEEP_BZ
  204. TZ_SHI1: LCALL S_SHI;显示调时
  205.          JNB ANS,S_J1;时+1
  206.           JNB ANX,S_1;时-1
  207. TZ_SHI4:JNB ANY,TZ_FEN
  208.         JNB AN,TZ_SHIOUT
  209.           JNB ANZ, TZ_SOUT
  210.         JMP TZ_SHI1
  211. TZ_SHIOUT:;LCALL GetWeek
  212. LCALL SET1302
  213.   LCALL BEEP_BZ
  214. TZ_SOUT: LJMP ST1
  215. ;*********
  216. TZ_FEN: LCALL AN_DEL
  217.       JNB ANY,$
  218.    LCALL BEEP_BZ
  219. TZ_FEN1: LCALL S_FEN;显示调分
  220.          JNB ANS,F_J1;分+1
  221.           JNB ANX,F_1;分-1
  222. ;TZ_RIQI4:JNB ANY,TZ_FEN;
  223.         JNB AN,TZ_FENOUT
  224.         JNB ANZ, TZ_FOUT
  225.         JMP TZ_FEN1
  226. TZ_FENOUT:MOV MIAO,#0
  227. ;LCALL GetWeek
  228.   LCALL SET1302
  229.   LCALL BEEP_BZ
  230. TZ_FOUT:LJMP ST1
  231. ;***************************************
  232. F_J1:  LCALL AN_DEL;时+1
  233.               LCALL BEEP_BZ
  234.       LCALL FEN_J1
  235.       LJMP TZ_FEN1
  236. F_1:  LCALL AN_DEL ;时-1
  237.               LCALL BEEP_BZ
  238.       LCALL FEN_1
  239.       LJMP TZ_FEN1
  240. ;***************************************************
  241. ;YYUE:   LCALL START1  ;调用音乐
  242. ;        RET
  243. SHIJ:   LCALL IN_1302 ;调用时间初始化
  244.         RET
  245. AN_DEL: MOV R6,#0
  246. AN_DEL1:LCALL DEL
  247.         DJNZ R6,AN_DEL1
  248.                   RET
  249. ;********************调整年月日程序*********************************/=======================================================================
  250. S_NIAN:  MOV 40H,#52    ;显示调年
  251.                   MOV 41H,#30
  252.                   MOV A,NIAN
  253.                   ANL A,#0FH
  254.                   MOV 43H,A
  255.                   MOV A,NIAN
  256.                   SWAP A
  257.                   ANL A,#0FH
  258.                   MOV 42H,A
  259.                   MOV 2DH,#0
  260.                   MOV QUSHU,#40H
  261.               LCALL  LINE_88
  262.         RET               
  263. S_YUE:  MOV 40H,#52    ;显示调月
  264.                   MOV 41H,#31
  265.                   MOV A,YUE
  266.                   ANL A,#0FH
  267.                   MOV 43H,A
  268.                   MOV A,YUE
  269.                   SWAP A
  270.                   ANL A,#0FH
  271.                   MOV 42H,A
  272.                   MOV 2DH,#0
  273.                   MOV QUSHU,#40H
  274.               LCALL  LINE_88
  275.         RET               
  276. S_RIQI:  MOV 40H,#52    ;显示调日期
  277.                   MOV 41H,#32
  278.                   MOV A,RIQI
  279.                   ANL A,#0FH
  280.                   MOV 43H,A
  281.                   MOV A,RIQI
  282.                   SWAP A
  283.                   ANL A,#0FH
  284.                   MOV 42H,A
  285.                   MOV 2DH,#0
  286.                   MOV QUSHU,#40H
  287.               LCALL  LINE_88
  288.         RET               
  289. S_SHI:  MOV 40H,#52    ;显示调时
  290.                   MOV 41H,#53
  291.                   MOV A,SHI
  292.                   ANL A,#0FH
  293.                   MOV 43H,A
  294.                   MOV A,SHI
  295.                   SWAP A
  296.                   ANL A,#0FH
  297.                   MOV 42H,A
  298.                   MOV 2DH,#0
  299.                   MOV QUSHU,#40H
  300.               LCALL  LINE_88
  301.         RET               
  302. S_FEN:  MOV 40H,#52    ;显示调分
  303.                   MOV 41H,#54
  304.                   MOV A,FEN
  305.                   ANL A,#0FH
  306.                   MOV 43H,A
  307.                   MOV A,FEN
  308.                   SWAP A
  309.                   ANL A,#0FH
  310.                   MOV 42H,A
  311.                   MOV 2DH,#0
  312.                   MOV QUSHU,#40H
  313.               LCALL  LINE_88
  314.         RET               
  315. ;;;;;;;;;;;;;;;;;;;;
  316. FEN_J1:MOV LSTZSJ1,FEN;分+1程序
  317. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  318. INC LSTZSJ;月+1
  319. MOV A,LSTZSJ
  320. CJNE A,#60,FEN_J12;小时60清0
  321. MOV LSTZSJ,#0
  322. FEN_J12:
  323. LCALL TSSJTZ1;数据调整,16到10进制
  324. MOV FEN,LSTZSJ1
  325. RET
  326. FEN_1: MOV LSTZSJ1,FEN;分-1程序
  327. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  328. MOV A,LSTZSJ
  329. CJNE A,#0,FEN_12  ;分是0加60
  330. MOV LSTZSJ,#60
  331. FEN_12:DEC LSTZSJ
  332. LCALL TSSJTZ1;数据调整,16到10进制
  333. MOV FEN,LSTZSJ1
  334. RET
  335. ;;;;
  336. SHI_J1:MOV LSTZSJ1,SHI;小时+1程序
  337. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  338. INC LSTZSJ;月+1
  339. MOV A,LSTZSJ
  340. CJNE A,#24,SHI_J12;小时24清0
  341. MOV LSTZSJ,#0
  342. SHI_J12:
  343. LCALL TSSJTZ1;数据调整,16到10进制
  344. MOV SHI,LSTZSJ1
  345. RET
  346. SHI_1: MOV LSTZSJ1,SHI;小时-1程序
  347. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  348. MOV A,LSTZSJ
  349. CJNE A,#0,SHI_12  ;小时是0加24
  350. MOV LSTZSJ,#24
  351. SHI_12:DEC LSTZSJ
  352. LCALL TSSJTZ1;数据调整,16到10进制
  353. MOV SHI,LSTZSJ1
  354. RET
  355. ;;;;  
  356. RIQI_J1:MOV LSTZSJ1,RIQI;日+1程序
  357. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  358. INC LSTZSJ;月+1
  359. MOV A,LSTZSJ
  360. CJNE A,#32,RIQI_J12;日是32清0
  361. MOV LSTZSJ,#1
  362. RIQI_J12:
  363. LCALL TSSJTZ1;数据调整,16到10进制
  364. MOV RIQI,LSTZSJ1
  365. RET
  366. RIQI_1: MOV LSTZSJ1,RIQI;日-1程序
  367. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  368. MOV A,LSTZSJ
  369. CJNE A,#1,RIQI_12  ;日是1加32
  370. MOV LSTZSJ,#32
  371. RIQI_12:DEC LSTZSJ
  372. LCALL TSSJTZ1;数据调整,16到10进制
  373. MOV RIQI,LSTZSJ1
  374. RET
  375. ;;;;
  376. YUE_J1:MOV LSTZSJ1,YUE;月+1程序
  377. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  378. INC LSTZSJ;月+1
  379. MOV A,LSTZSJ
  380. CJNE A,#13,YUE_J12;月是13清0
  381. MOV LSTZSJ,#1
  382. YUE_J12:
  383. LCALL TSSJTZ1;数据调整,16到10进制
  384. MOV YUE,LSTZSJ1
  385. RET
  386. YUE_1: MOV LSTZSJ1,YUE;月-1程序
  387. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  388. MOV A,LSTZSJ
  389. CJNE A,#1,YUE_12
  390. MOV LSTZSJ,#13
  391. YUE_12:DEC LSTZSJ
  392. LCALL TSSJTZ1;数据调整,16到10进制
  393. MOV YUE,LSTZSJ1
  394. RET

  395. NIAN_J1:MOV LSTZSJ1,NIAN;年+1程序
  396. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  397. INC LSTZSJ;年+1
  398. MOV A,LSTZSJ
  399. CJNE A,#100,NIAN_J12;年是100清0
  400. MOV LSTZSJ,#01
  401. NIAN_J12:
  402. LCALL TSSJTZ1;数据调整,16到10进制
  403. MOV NIAN,LSTZSJ1
  404. RET
  405. NIAN_1: ;CJNE A,#13H,SMAJ_QR  
  406. MOV LSTZSJ1,NIAN;年-1程序
  407. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  408. MOV A,LSTZSJ
  409. CJNE A,#1,NIAN_12
  410. MOV LSTZSJ,#100
  411. NIAN_12:DEC LSTZSJ
  412. LCALL TSSJTZ1;数据调整,16到10进制
  413. MOV NIAN,LSTZSJ1
  414. RET
  415. ;;;;;;;;;;;;;
  416. TSSJTZ:MOV A,LSTZSJ1;数据调整,10到16进制如21:00100001转为 21:00010101
  417. ANL A,#0FH
  418. MOV LSTZSJ,A
  419. MOV A,LSTZSJ1
  420. SWAP A
  421. ANL A,#0FH
  422. MOV B,#10
  423. MUL AB
  424. ADD A,LSTZSJ
  425. MOV LSTZSJ,A
  426. RET
  427. TSSJTZ1:MOV A,LSTZSJ ;数据调整,16到10进制
  428. MOV B,#10
  429. DIV AB
  430. SWAP A
  431. MOV LSTZSJ,A
  432. MOV A,B
  433. ORL A,LSTZSJ
  434. MOV LSTZSJ1,A
  435. RET                                          ;*/
  436. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  437. LINE_88 :  MOV    2BH,#8      ;扫描的行数,共8行
  438. FF2:      LCALL  LINE_11       ;扫描显示1行子程序
  439.          DJNZ   2BH,FF2            ;扫描下一行
  440.          MOV   2DH,#0
  441.          RET
  442. ;*********扫描显示一行子程序********************
  443. LINE_11: LCALL MSTR_YD_
  444.                    MOV 30H,#0
  445.                    MOV 31H,#0
  446.              LCALL  SEND_11        ;发送串行口子程序
  447.         LCALL  XTH         ;选通行子程序
  448.                    LCALL  DL22US
  449.                    INC 2DH
  450.         RET

  451. SEND_11: MOV  R0,#30H
  452.         MOV  R1,#35H
  453.         MOV  R5,#4                ;一行有2个字节;如每次显示字数不同要作相应改动
  454. LQ_11:   MOV  R2,#8                ;每个字节有5位
  455.         MOV  A,@R0                ;将显存的字节的单元移入
  456.                 MOV  R6,A
  457.         MOV  A,@R1                ;将显存的字节的单元移入
  458.                 MOV  R7,A
  459.         LCALL  DD_1                ;调用显示一个字节的子程序
  460.         INC  R0                        ;指向下一个显存的单元
  461.         INC  R1                        ;指向下一个显存的单元
  462.         DJNZ R5,LQ_11                ;2个字节全部移入了没有,未继续
  463.         RET                                                        ;
  464. ;*************************************** 日期分离程序====================================
  465. RQFL:    MOV 40H,#12
  466.          MOV 41H,#12
  467.                         MOV 42H,#12
  468.                         MOV 43H,#12
  469.          MOV A,YUE
  470.          JB ACC.7,RQFL1
  471.          MOV 44H,#2
  472.          MOV 45H,#0
  473.          JMP RQFL3
  474. RQFL1:  MOV 44H,#1
  475.         MOV 45H,#9
  476. RQFL3:
  477.       MOV A,NIAN
  478.       ANL A,#0FH
  479.       MOV 47H,A
  480.       MOV A,NIAN
  481.       SWAP A
  482.       ANL A,#0FH
  483.       MOV 46H,A
  484.                 MOV 48H,#30  ;显示年
  485.       MOV A,YUE
  486.       ANL A,#0FH
  487.       MOV 4AH,A
  488.       MOV A,YUE
  489.       SWAP A
  490.       ANL A,#03H
  491.                 JZ  YUE_S_1
  492. YUE_S_2:MOV 49H,A
  493. YUE_S_3:        MOV 4BH,#31  ;显示 月
  494.       MOV A,RIQI
  495.       ANL A,#0FH
  496.       MOV 4DH,A
  497.       MOV A,RIQI
  498.       SWAP A
  499.       ANL A,#03H
  500.                 JZ RIQI_S_1
  501. RIQI_S_2:MOV 4CH,A
  502. RIQI_S_3:MOV 4EH,#32  ;显示 日
  503.                 MOV 4FH,#12
  504.                 MOV 50H,#16         ;显示星期
  505.                 MOV 51H,#17
  506.                 MOV 52H,#12
  507.                 LCALL GetWeek
  508.       MOV A,XQI
  509.                 ANL A,#07H
  510.             CJNE A,#0,XQ_1
  511.                  MOV  53H,#32
  512.                  JMP  XQ_OUT
  513. RIQI_S_1:MOV 4CH,#12
  514.          JMP RIQI_S_3
  515. YUE_S_1: MOV 49H,#12
  516.          JMP YUE_S_3
  517. XQ_1:  ADD A,#41
  518.        MOV 53H,A
  519. XQ_OUT:
  520.                 MOV 54H,#12  ;空格
  521.                 LCALL  RE_TEMP        ;读取温度
  522.       LCALL   TURN          ;转化温度子程序
  523.       MOV 55H,#15    ;T
  524.              MOV 56H,#14     ;:
  525.                 MOV 57H,20H            ;温度百位
  526.                 MOV 58H,21H             ;温度十位
  527.                 MOV 59H,22H                  ;温度个位
  528.                 MOV 5AH,#13                  ;小数点
  529.                 MOV 5BH,24H                  ;温度小数位
  530.                 MOV 5CH,#11                  ;℃符号
  531.                 MOV 5DH,#12
  532.                 MOV 5EH,#33      ;农
  533.                 MOV 5FH,#34                  ;历
  534.                 LCALL  Get1302
  535.                 LCALL   CONvert  ;调用公历转农历程序
  536.                 MOV A,CONvert_mONth
  537.                 JNB ACC.7,RQFL4
  538.                 MOV 60H,#51
  539.                 JMP RQFL5
  540. RQFL4:MOV 60H,#12
  541. RQFL5:LCALL  NL_YUE    ;调用农历月份
  542.                 MOV 62H,#31 ;显示月
  543.                 LCALL NL_RIQI
  544.                 MOV 65H,#12
  545.                 MOV 66H,#12
  546.                 MOV 67H,#12
  547.                 MOV 68H,#12
  548.         ;        MOV 69H,#12
  549. RQFLB:  RET
  550. ;***********************
  551. NL_YUE:  MOV  A,        CONvert_mONth        ;农历月
  552.        ANL A,#1FH
  553.                 JNB ACC.4,NL_RIQI0
  554.                 ANL A,#0FH
  555.                 ADD A,#10                                                         
  556. NL_RIQI0: CJNE A,#1,NL_YUE1
  557.                  MOV  61H,#35
  558.                  JMP  NL_YOUT
  559. NL_YUE1:    CJNE A,#10,NL_YUE2
  560.          MOV  61H,#39
  561.                  JMP  NL_YOUT
  562. NL_YUE2:         CJNE A,#11,NL_YUE3
  563.          MOV  61H,#37
  564.                  JMP  NL_YOUT
  565. NL_YUE3:         CJNE A,#12,NL_YUE4
  566.          MOV 61H,#38
  567.                  JMP NL_YOUT
  568. NL_YUE4:        ADD A,#41
  569.          MOV 61H,A
  570. NL_YOUT: RET
  571. ;***************
  572. NL_RIQI:MOV A, CONvert_dAte  ;农历日
  573.                   SWAP A
  574.                   ANL A,#0FH
  575.                   CJNE A,#0,NL_RIQI1
  576.                   MOV 63H,#36  ;显示 初
  577.                   JMP NL_ROUT
  578. NL_RIQI1:CJNE A,#1,NL_RIQI2
  579.          MOV 63H,#39  ;显示 十
  580.                         JMP NL_ROUT
  581. NL_RIQI2:CJNE A,#2,NL_RIQI3
  582.          MOV 63H,#40  ;显示 二十
  583.                         JMP NL_ROUT
  584. NL_RIQI3:CJNE A,#3,NL_ROUT
  585.          MOV 63H,#41  ;显示 三十
  586.                         JMP NL_ROUT
  587. NL_ROUT:MOV A, CONvert_dAte  ;农历日
  588.         ANL A,#0FH
  589.                   CJNE A,#0,NL_RIQI4
  590.                   MOV 64H,#39  ;显示 十
  591.                   JMP NL_RIQI5
  592. NL_RIQI4:ADD A,#41
  593.          MOV 64H,A
  594. NL_RIQI5:        RET
  595.         
  596. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
  597. ;;;;;;;;;;;;;;;;;;;;;;;
  598. L30_:    MOV  2DH,#0
  599.          MOV  QUSHU,#40H
  600.          MOV    2FH,#37       ;共有多少个半角字符,一个汉字等于两个字符,个数值为实际字数*2+屏长度数
  601. HHH_:    LCALL  L31_           ;. 扫描一个字节
  602.          DJNZ   2FH,HHH_           ;字数没完继续
  603.          RET
  604. L31_:     MOV   B, #1     ;每次移入内存单元的数据要左移次数次值         ,从第一开始。
  605. II_:      MOV   29H,#5    ;左移速度
  606. III_:   LCALL L32_     ;扫描显示1帧
  607.          DJNZ  29H,III_        ;速度没完继续
  608.          INC   B                        ;左移次数+1
  609.          MOV   A,#9
  610.          CJNE  A,B,II_ ;如果B中的数超过8就完成1个字节的8次左移显示,否则继续循环.
  611.               INC QUSHU       ;日期数据+1---5CH→
  612.          RET

  613. L32_:     MOV  2BH,#8      ;扫描的行数,共8行
  614. JJ_:      LCALL  L33_     ;扫描显示1行子程序
  615.          INC 2DH
  616.           DJNZ   2BH,JJ_        ;8行没完继续
  617.               MOV  2DH,#0 ;8行完成后再从0行开始扫描
  618.          RET
  619. L33_:     MOV    2EH,B         ;显示内容要左移几次数再显示的赋值给2EH单元
  620.          LCALL  SEND_YD        ;发送串行口子程序
  621.          LCALL  XT_H          ;选通行子程序
  622.          LCALL  MSTR_YD_        ;将显示内容移入内存单元30H→
  623. EE_:      LCALL  ZY
  624.          DJNZ   2EH,EE_
  625.          LCALL  ZYXZ        ;左移速度同步修正
  626.          RET
  627. MSTR_YD_:SETB RS1 ;R0,R1-数据存放起始地址,2DH行数据,R3-21H,22H临时数据,R4-每屏的字节数, ,20H日期数据起始地址
  628.         SETB RS0                  
  629.         MOV    R0,#30H
  630.              MOV    R1,#35H
  631.         MOV    R4,#5            ;每幕显示的字节数加1
  632. BB_YD_: LCALL L_SHUJU
  633.         MOV     @R0,A
  634.         MOV     @R1,A
  635.         INC    QUSHU           ;加1,移到下一个字节的对应位置
  636.              INC    R0
  637.              INC    R1
  638.         DJNZ   R4,BB_YD_
  639.                   MOV A,QUSHU
  640.                   CLR C
  641.                   SUBB A,#5
  642.                   MOV QUSHU,A
  643.              CLR RS1
  644.              CLR RS0
  645.         RET
  646. ;;;使用R0,R1,R6,R7,B,2DH
  647. L_SHUJU: MOV DPTR,#TAB10
  648.         MOV QUSHU1,R0
  649.         MOV QUSHU2,R1
  650.         MOV R6,B
  651.         MOV R0,QUSHU
  652. L_SHU:   MOV A,@R0
  653.         MOV B,#8
  654.         MUL AB
  655.         MOV R7,A
  656.         MOV A,DPH
  657.         ADD A,B
  658.         MOV DPH,A
  659.         MOV A,R7
  660.         MOV B,2DH
  661.         ADD A,B
  662.         MOVC A,@A+DPTR
  663.         MOV R0,QUSHU1
  664.         MOV R1,QUSHU2
  665.         MOV B,R6
  666.         RET
  667. ;*****************************发送数据到串口子程序*****************************************************/
  668. SEND_YD:   MOV   R0,#30H
  669.         MOV   R5,#4        ;如每次显示字数不同要作相应改动
  670. LQ_YD:     CLR   C                        ;清C方便每个字节的移动
  671.             MOV   R2,#8                ;每个字节有8位
  672.         MOV   A,@R0                ;将显存的字节的单元移入A
  673.             CPL   A                ;取反
  674.         LCALL  DD1_YD                ;调用显示一个字节的子程序
  675.         INC  R0                        ;指向下一个显存的单元
  676.         DJNZ R5,LQ_YD                ;8个字节全部移入了没有,未继续
  677.         RET
  678. DD1_YD:    CLR  SRCLK                ;清串行CP端
  679.         RLC  A                        ;将每个字节移位
  680.    ;     MOV  SER,C                ;将移入C的位移入信号端
  681.                    MOV  SEG,C
  682.         SETB SRCLK                ;触发串行CP端
  683.         DJNZ R2,DD1_YD                ;每个字节位移8次够了没有?
  684.         RET
  685. ;*******选通行子程序***2BH行数据*********************************************************************************/
  686. XT_H:     CLR   RCLK                ;将输出CP变为低电平为上升沿作准备
  687.              SETB  EN               ;将使能端变为高电平为下降沿作准备
  688.                  MOV  R5,2BH
  689.                  CJNE R5,#7,HSM_1
  690.                  MOV  ABCD,#11111110B
  691.                  JMP  XTH_OUT
  692. HSM_1:    CJNE R5,#6,HSM_2
  693.          MOV  ABCD,#11111101B
  694.                  JMP  XTH_OUT
  695. HSM_2:         CJNE R5,#5,HSM_3
  696.          MOV  ABCD,#11111011B
  697.                  JMP  XTH_OUT
  698. HSM_3:         CJNE R5,#4,HSM_4
  699.          MOV ABCD,#11110111B
  700.                  JMP XTH_OUT
  701. HSM_4:         CJNE R5,#3,HSM_5
  702.          MOV ABCD,#11101111B
  703.                  JMP XTH_OUT
  704. HSM_5:    CJNE R5,#2,HSM_6
  705.          MOV ABCD,#11011111B
  706.                  JMP XTH_OUT
  707. HSM_6:         CJNE R5,#1,HSM_7
  708.          MOV ABCD,#10111111B
  709.                  JMP XTH_OUT
  710. HSM_7:         CJNE R5,#8,XTH_OUT
  711.          MOV ABCD,#01111111B
  712. XTH_OUT:
  713.          SETB  RCLK                ;输出CP为上升沿,显示一个
  714.          CLR   EN               ;138可显示
  715.          RET

  716. ;**********左移一位子程序*******************************************************************************/
  717. ZY:           ;30H后存入显示内容,R0为显示未址,R2为移出高位个数   字数*2+1
  718.          SETB RS1
  719.                         CLR  RS0
  720.                    MOV R2,#5
  721.          MOV  R0, #34H    ;显示单元未址        
  722.          CLR  C
  723. CC:      MOV  A,   @R0
  724.          RLC  A            ;将后一字节的最高位移到C里,再移到前一字节的最低位
  725.          MOV  @R0, A
  726.          DEC  R0
  727.          DJNZ R2,  CC
  728.          CLR  C
  729.                         CLR RS1
  730.                         CLR RS0
  731.          RET
  732. ;********************移动查模式时速度同步修正子程序*****************************************************/
  733. ZYXZ:    MOV   R5,B
  734.          MOV   A,#9
  735.          SUBB  A,R5
  736.          MOV   R4,A
  737. AA:      LCALL DL22US
  738.          NOP
  739.          DJNZ  R4 ,AA
  740.          RET
  741. ;*********************************************************************************/

  742. ;********************时间数据转换*************************************=====================================================================*/
  743. XSSJ:  
  744.       MOV        A,FEN    ;分
  745.           MOV        B,#10h
  746.           DIV        AB                                                ;把41H高低4位分开
  747.           MOV        43H,A                                        ;高4位存入
  748.           MOV        A,B
  749.           MOV        44H,A                                        ;低4位存入
  750.           MOV        A,MIAO    ;秒
  751.           MOV        B,#10h               
  752.           DIV        AB                                                ;把40H高低4位分开
  753.           mov        45H,A                                        ;高4位存入
  754.           mov        a,b
  755.           mov        46H,a                                        ;低4位存入
  756.       MOV A,SHI
  757.       MOV B,#16
  758.       DIV AB
  759.       MOV 40H,A
  760.       MOV A,B
  761.       MOV 41H,A
  762.           MOV 42H,#15
  763.           MOV A,40H
  764.           JNZ XSSJ_1
  765.           MOV 40H,#12
  766. XSSJ_1:  RET
  767. ;*************************时间显示程序****************************
  768. PLAY1:         MOV  DPTR,#TABX
  769.           MOV   2DH,#0
  770.          MOV   2FH,#20     ;速度
  771. GG1:      CALL LINE_8      ;扫描显示1帧
  772.          DJNZ  2FH,GG1
  773.          RET
  774. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  775. LINE_8 :  MOV    2BH,#8      ;扫描的行数,共8行
  776. FF1:      CALL  LINE_1       ;扫描显示1行子程序
  777.          DJNZ   2BH,FF1            ;扫描下一行
  778.          MOV    A,2DH
  779.          SUBB A ,#8    ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
  780.          MOV    2DH,A
  781.          RET
  782. ;*********扫描显示一行子程序********************
  783. LINE_1:  CALL  MSTR_R      ;将显示内容移入内存单元
  784.         CALL  MSTR_G
  785.                 MOV 35H,#0
  786.                 MOV 36H,#0
  787. ;                MOV 3BH,#0
  788.                 MOV 3AH,#0
  789.             CALL  SEND_1        ;发送串行口子程序
  790.         CALL  XTH         ;选通行子程序
  791.                 CALL  DL22US
  792.                 INC 2DH
  793.         RET
  794. ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***2EH,2FH缓冲**************
  795. SEND_1: MOV  R0,#30H
  796.         MOV  R1,#38H
  797.         MOV  R5,#2                ;一行有2个字节;如每次显示字数不同要作相应改动
  798. LQ_1:   MOV  R2,#5                ;每个字节有5位
  799.         MOV  A,@R0                ;将显存的字节的单元移入
  800.                 MOV  R6,A
  801.         MOV  A,@R1                ;将显存的字节的单元移入
  802.                 MOV  R7,A
  803.         CALL  DD_1                ;调用显示一个字节的子程序
  804.         INC  R0                        ;指向下一个显存的单元
  805.         INC  R1                        ;指向下一个显存的单元
  806.         DJNZ R5,LQ_1                ;2个字节全部移入了没有,未继续
  807.                 CALL SEND_2
  808.                 CALL SEND_3
  809.         RET                                                        ;
  810. SEND_2: MOV R0,#32H
  811.         MOV R1,#3AH
  812.                 MOV R5,#1
  813. LQ_2:   MOV  R2,#2                ;每个字节有2位
  814.         MOV  A,@R0                ;将显存的字节的单元移入
  815.                 MOV  R6,A
  816.         MOV  A,@R1                ;将显存的字节的单元移入
  817.                 MOV  R7,A
  818.         CALL  DD_1                ;调用显示一个字节的子程序
  819.         INC  R0                        ;指向下一个显存的单元
  820.         INC  R1                        ;指向下一个显存的单元
  821.         DJNZ R5,LQ_2                ;2个字节全部移入了没有,未继续
  822.                 RET
  823. SEND_3: MOV R0,#33H
  824.         MOV R1,#3BH
  825.                 MOV R5,#4
  826. LQ_3:   MOV  R2,#5                ;每个字节有5位
  827.         MOV  A,@R0                ;将显存的字节的单元移入
  828.                 MOV  R6,A
  829.         MOV  A,@R1                ;将显存的字节的单元移入
  830.                 MOV  R7,A
  831.         CALL  DD_1                ;调用显示一个字节的子程序
  832.         INC  R0                        ;指向下一个显存的单元
  833.         INC  R1                        ;指向下一个显存的单元
  834.         DJNZ R5,LQ_3                ;2个字节全部移入了没有,未继续
  835.                 RET
  836. DD_1:   CLR  SRCLK                ;清串行CP端
  837.         CLR  C
  838.         MOV  A,R6
  839.         RLC  A                        ;将每个字节移位
  840.                 MOV  R6,A
  841.                 CPL  C
  842.         MOV  SER,C                ;红色
  843.                 CLR  C
  844.                 MOV  A,R7
  845.                 RLC  A
  846.                 MOV  R7,A
  847.                 CPL C
  848.                 MOV  SEG,C            ;绿色
  849.         SETB SRCLK                ;触发串行CP端
  850.         DJNZ R2,DD_1                ;每个字节位移5次够了没有?
  851.         RET
  852. ;*************************温度显示程序****************************
  853. PLAY:         MOV  DPTR,#TABX
  854.          MOV   2DH,#0
  855.          MOV   2FH,#60     ;速度
  856. GG:      CALL LINE8      ;扫描显示1帧
  857.          DJNZ  2FH,GG
  858.          RET
  859. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  860. LINE8 :  MOV    2BH,#8      ;扫描的行数,共8行
  861. FF:      CALL  LINE1       ;扫描显示1行子程序
  862.          DJNZ   2BH,FF            ;扫描下一行
  863.          MOV    A,2DH
  864.          SUBB A ,#8    ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
  865.          MOV    2DH,A
  866.          RET
  867. ;*********扫描显示一行子程序********************
  868. LINE1:  CALL  MSTR_R      ;将显示内容移入内存单元
  869.         CALL  MSTR_G
  870.                 MOV 34H,#0
  871.                 MOV 35H,#0
  872.                 MOV 3BH,#0
  873.             CALL  SEND        ;发送串行口子程序
  874.         CALL  XTH         ;选通行子程序
  875.                 CALL  DL22US
  876.                 INC 2DH
  877.         RET

  878. ;****************************************************************************
  879. ;**显示内容移入内存单元子程序*取红色到30H-34H,绿色35H-39H*2DH取字节数据***********************
  880. MSTR_R: MOV    R0,#30H
  881.         MOV    R4,#7            ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
  882.                 MOV    R1,#40H
  883. BB_R:   
  884.         MOV   A,@R1
  885.                 MOV   B,#8
  886.                 MUL   AB
  887.                 ADD    A,2DH
  888.                 MOVC   A, @A+DPTR
  889.         MOV    @R0,A         
  890.             INC    R0
  891.                 INC    R1        
  892.             DJNZ   R4,BB_R
  893.                 MOV   R1,#40H
  894.             RET
  895. MSTR_G: MOV    R0,#38H
  896.         MOV    R4,#7            ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
  897.                 MOV    R1,#40H
  898. BB_G:   
  899.         MOV   A,@R1
  900.                 MOV   B,#8
  901.                 MUL   AB
  902.                 ADD    A,2DH
  903.                 MOVC   A, @A+DPTR
  904.         MOV    @R0,A         
  905.             INC    R0
  906.                 INC    R1        
  907.             DJNZ   R4,BB_G
  908.                 MOV   R1,#40H
  909.             RET
  910. ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***R6,R7**************
  911. SEND:   MOV  R0,#30H
  912.         MOV  R1,#38H
  913.         MOV  R5,#6                ;一行有4个字节;如每次显示字数不同要作相应改动
  914. LQ:     MOV  R2,#5                ;每个字节有8位
  915.         MOV  A,@R0                ;将显存的字节的单元移入
  916.                 MOV  R6,A
  917.         MOV  A,@R1                ;将显存的字节的单元移入
  918.                 MOV  R7,A
  919.         LCALL  DD1                ;调用显示一个字节的子程序
  920.         INC  R0                        ;指向下一个显存的单元
  921.         INC  R1                        ;指向下一个显存的单元
  922.         DJNZ R5,LQ                ;8个字节全部移入了没有,未继续
  923.                 CLR SRCLK
  924.                 SETB C
  925.                 MOV SER,C
  926.                 MOV SEG,C
  927.                 SETB SRCLK
  928.         RET                                                        ;

  929. DD1:    CLR  SRCLK                ;清串行CP端
  930.         CLR  C
  931.         MOV  A,R6
  932.         RLC  A                        ;将每个字节移位
  933.                 MOV  R6,A
  934.                 CPL  C
  935.         MOV  SER,C                ;红色
  936.                 CLR  C
  937.                 MOV  A,R7
  938.                 RLC  A
  939.                 MOV  R7,A
  940.                 CPL C
  941.                 MOV  SEG,C            ;绿色
  942.         SETB SRCLK                ;触发串行CP端
  943.         DJNZ R2,DD1                ;每个字节位移8次够了没有?
  944.         RET
  945. ;*******选通行子程序***2BH行数据*********************************************************************************/
  946. XTH:     CLR   RCLK                ;将输出CP变为低电平为上升沿作准备
  947.              SETB  EN               ;将使能端变为高电平为下降沿作准备
  948.                  MOV  R5,2BH
  949.                  CJNE R5,#8,HSM1
  950.                  MOV  ABCD,#11111110B
  951.                  JMP  XTHOUT
  952. HSM1:    CJNE R5,#7,HSM2
  953.          MOV  ABCD,#11111101B
  954.                  JMP  XTHOUT
  955. HSM2:         CJNE R5,#6,HSM3
  956.          MOV  ABCD,#11111011B
  957.                  JMP  XTHOUT
  958. HSM3:         CJNE R5,#5,HSM4
  959.          MOV ABCD,#11110111B
  960.                  JMP XTHOUT
  961. HSM4:         CJNE R5,#4,HSM5
  962.          MOV ABCD,#11101111B
  963.                  JMP XTHOUT
  964. HSM5:    CJNE R5,#3,HSM6
  965.          MOV ABCD,#11011111B
  966.                  JMP XTHOUT
  967. HSM6:         CJNE R5,#2,HSM7
  968.          MOV ABCD,#10111111B
  969.                  JMP XTHOUT
  970. HSM7:         CJNE R5,#1,XTHOUT
  971.          MOV ABCD,#01111111B
  972. XTHOUT:
  973.          SETB  RCLK                ;输出CP为上升沿,显示一个
  974.          CLR   EN               ;138可显示
  975.          RET

  976. ;******22US延时子程序********
  977. DL22US:  MOV   R7,#50
  978.          DJNZ  R7,$
  979.          RET                 ;
  980. DEL:    MOV R7,#0
  981.          DJNZ  R7,$
  982.           RET
  983. BEEP_BZ:; CLR     BEEP         ;蜂鸣器鸣响
  984.          MOV R6,#40
  985. BEEP_2:  CALL DEL
  986.          CPL BEEP
  987.                         DJNZ R6, BEEP_2
  988.          SETB   BEEP          ;蜂鸣器停止
  989.                         RET
  990. ;***********************************字码表****************************************
  991. TAB10:
  992. DB 038H,044H,082H,082H,082H,082H,044H,038H;"0",0
  993. DB 010H,070H,010H,010H,010H,010H,010H,0FEH;"1",1
  994. DB 07CH,082H,082H,006H,00CH,070H,0FAH,09EH;"2",2
  995. DB 07EH,044H,00CH,038H,006H,002H,086H,07CH;"3",3
  996. DB 004H,00CH,01CH,034H,064H,0FEH,004H,03FH;"4",4
  997. DB 07EH,042H,040H,07CH,042H,002H,086H,07CH;"5",5
  998. DB 03CH,062H,0C0H,0FCH,082H,082H,0C2H,07CH;"6",6
  999. DB 0FEH,084H,088H,018H,010H,030H,020H,020H;"7",7
  1000. DB 07CH,082H,082H,07CH,086H,082H,0C6H,07CH;"8",8
  1001. DB 07CH,086H,082H,082H,07EH,002H,084H,078H;"9",9
  1002. DB 000H, 000H, 000H, 000H, 0FCH, 000H, 000H, 000H   ;-        10
  1003. DB 080H, 078H, 084H, 080H, 080H, 080H, 084H, 078H  ;"C",11
  1004. DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H  ;无显示,12
  1005. DB 000H, 000H, 000H, 000H, 030H, 030H, 000H, 000H  ;点,13
  1006. DB 000H, 000H, 030H, 030H, 000H, 030H, 030H, 000H   ;:   14
  1007. DB 0FEH,092H,010H,010H,010H,010H,010H,038H;"T",15
  1008. DB 7EH,42H,7EH,7EH,48H,7EH,88H,7EH    ;温   16
  1009. DB    57H,0FDH,57H,75H,57H,0FDH,55H,8BH ;度 17
  1010. ;DB 0D6H, 092H, 092H, 092H, 09AH, 06CH, 064H, 044H;"W",16
  1011. ;DB 0EEH, 044H, 048H, 070H, 050H, 048H, 044H, 0EEH;"K",17
  1012. DB 0FCH,042H,042H,07CH,040H,040H,0E0H,000H;"P",18
  1013. DB 0CEH,084H,084H,0FCH,084H,084H,0CEH,000H;"H",19
  1014. DB 000H,000H,078H,084H,0FCH,080H,07CH,000H;"e",20
  1015. DB 000H,000H,0DCH,078H,030H,078H,0ECH,000H;"x",21
  1016. DB 018H,000H,038H,008H,008H,008H,008H,0F0H;"j",22
  1017. DB 000H,000H,0FEH,092H,092H,092H,0DAH,000H;"m",23
  1018. DB 000H,020H,000H,060H,020H,020H,020H,0F8H;"i",24
  1019. DB 000H,000H,000H,0D8H,066H,042H,042H,0E7H;"n",25
  1020. DB 0E7H,042H,044H,024H,02CH,028H,018H,010H;"V",26
  1021. DB 03CH,05AH,0AAH,0AAH,0B4H,042H,03CH,000H;"@",27
  1022. DB 000H,000H,03CH,062H,040H,042H,03CH,000H;"c",28
  1023. DB 000H,000H,03CH,042H,042H,042H,03CH,000H;"o",29
  1024. DB 010H,03EH,048H,0BCH,028H,07EH,008H,008H;年,30
  1025. DB 03CH,024H,03CH,024H,03CH,024H,044H,08CH;月,31
  1026. DB 0FCH,084H,084H,0FCH,084H,084H,084H,0FCH;日,32
  1027. DB 10H,0FEH,92H,20H,34H,68H,0A4H,32H;农,33
  1028. DB 7EH,48H,7EH,4AH,4AH,4AH,4AH,96H;历,34
  1029. DB 000H,0FEH,010H,010H,05CH,050H,050H,0FEH;正,35
  1030. DB 040H,0E0H,03EH,06AH,0CAH,04AH,052H,044H;初,36
  1031. DB 010H,01EH,024H,058H,018H,024H,0DBH,018H;冬,37
  1032. DB 000H,075H,05FH,075H,05FH,075H,057H,0B7H;腊,38
  1033. DB 010H,010H,010H,0FEH,010H,010H,010H,010H;十,39
  1034. DB 000H,044H,0FEH,044H,044H,044H,044H,07CH;二十,40
  1035. DB 054H,054H,054H,0FEH,054H,054H,054H,094H;卅,41
  1036. DB 000H,000H,000H,000H,0FEH,000H,000H,000H;一,42
  1037. DB 000H,000H,07CH,000H,000H,0FEH,000H,000H;二,43
  1038. DB 000H,000H,07CH,000H,038H,000H,0FEH,000H;三,44
  1039. DB 000H,0FEH,0AAH,0AAH,0AAH,0CEH,082H,0FEH;四,45
  1040. DB 07CH,010H,010H,07CH,014H,014H,024H,0FEH;五,46
  1041. DB 000H,010H,000H,0FEH,000H,028H,046H,082H;六,47
  1042. DB 000H,020H,020H,0FEH,020H,020H,022H,01CH;七,48
  1043. DB 000H,028H,028H,028H,044H,044H,082H,000H;八,49
  1044. DB 020H,020H,0FCH,028H,028H,028H,04AH,086H;九,50
  1045. DB 05EH,082H,0BAH,092H,0BAH,092H,0BAH,086H;闰,51
  1046. DB 0BEH,2AH,0FEH,6AH,0BEH,0F6H,0BEH,46H ;调,52
  1047. DB 04H,0FEH,0A4H,0B4H,0ECH,0A4H,0E4H,0CH ;时 53
  1048. DB 28H,44H,82H,7CH,24H,24H,44H,8CH;分 54
  1049. DB 04H,24H,6CH,0F6H,25H,72H,0A4H,28H ;秒 55

  1050. ;********************温度数据转换*************************************=====================================================================*/
  1051. XSWD:   CALL  RE_TEMP
  1052.         MOV    XSD,#13
  1053.                 MOV    WDFH,#11
  1054.                 MOV  R0,#20H
  1055.             MOV  R1,#40H
  1056.                 MOV  R2,#7
  1057. XSWD2:  MOV  A,@R0
  1058.                 MOV  @R1,A
  1059.                 INC  R0
  1060.                 INC  R1
  1061.                 DJNZ  R2,XSWD2
  1062.                 RET
  1063. ;;;;;;;;;;;;以下是温度程序;;;;;;;;;==
  1064. ; 程序功能:数字温度计(+125- -55)
  1065. RE_TEMP:         ;对DS18B20初始化及读取
  1066.        SETB   DQ           
  1067.        CALL  RESET_1820    ;调用复位子程序
  1068.        JB     FLAG, STT        ;判断DS1820是否存在?
  1069.        RET                              ;*/            
  1070. STT:                       ; DS18B20存在
  1071.        MOV    A,#0CCH        ;跳过ROM匹配
  1072.        CALL   WRITE_1820     ;写入数据
  1073.        MOV    A,#44H          ;发出温度转换命令
  1074.        CALL   WRITE_1820     ;写入数据
  1075.        CALL   RESET_1820    ;准备读温度前先复位
  1076.        MOV    A,#0CCH         ;跳过ROM匹配
  1077.        CALL   WRITE_1820     ;写入数据
  1078.        MOV    A,#0BEH         ;发出读温度命令
  1079.        CALL   WRITE_1820     ;写入数据
  1080.        CALL   READ_1820      ;读出温度数据         
  1081.        RET                                  ;*/      
  1082. RESET_1820:  ;复位(有具体的时序要求)                       
  1083.        SETB  DQ
  1084.            NOP
  1085.            NOP
  1086.        CLR   DQ      
  1087. ;主机发出延时521微秒的复位低脉冲
  1088.        MOV  R1,#2            ;  3
  1089. DLY:   MOV  R0,#107
  1090.        DJNZ R0,$
  1091.        DJNZ R1,DLY
  1092. ;然后拉高数据线
  1093.        SETB  DQ
  1094.            NOP
  1095.            NOP
  1096.            NOP        
  1097.        MOV   R0,#25H      
  1098. T2:    JNB   DQ ,T3       ;等待DS18B20回应
  1099.        DJNZ  R0, T2
  1100.        JMP  T4         
  1101. T3:    SETB  FLAG      ;置标志位,表示DS1820存在
  1102.        JMP  T5
  1103. T4:    CLR   FLAG     ;清标志位,表示DS1820不存在     
  1104.        JMP  T7
  1105. T5:    MOV  R0,#117
  1106. T6:    DJNZ R0,T6           ;时序要求延时一段时间
  1107. T7:    SETB   DQ        
  1108.        RET  
  1109.        ;---------------------------------------------- */                                 
  1110. WRITE_1820: ;写入DS18B20(有具体的时序要求)
  1111.        MOV  R2,#8           ;一共8位数据
  1112.        CLR  C
  1113. WR1:   CLR  DQ            ;总线低位,开始写入  
  1114.        MOV  R3,#7
  1115.        DJNZ R3,[code];***************引脚定义,根据使用不同的管脚而改动*************
  1116. ;农历,星期,1302程序由网上下载
  1117. ABCD    EQU    P2      ;行扫描0-7
  1118. SEG     EQU    P1.1    ; 红
  1119. SER     EQU    P1.0    ;内容发送绿
  1120. SRCLK   EQU    P1.2    ;串行CP端
  1121. RCLK    EQU    P1.3    ;输出CP端
  1122. EN      EQU    P1.4    ;EN为138使能端.高电平关闭显示;低电平显示
  1123. DQ      EQU    P3.6    ;温度18b20
  1124. BEEP    EQU    P3.7           ;蜂鸣器
  1125. AN      EQU    P0.1           ;中间按键
  1126. ANS     EQU    P0.0           ;上按键
  1127. ANX     EQU    P0.4           ;下按键
  1128. ANZ     EQU    P0.2           ;左按键
  1129. ANY     EQU    P0.3           ;右按键
  1130. T_CLK   EQU    P0.7    ;实时时钟时钟线引脚
  1131. T_IO    EQU    P0.6    ;实时时钟数据线引脚
  1132. T_RST   EQU    P0.5    ;实时时钟复位线引脚
  1133. ;温度存放地址
  1134. A_BIT   EQU  22H     ;存放个位数变量
  1135. B_BIT   EQU  21H     ;存放十位数变量
  1136. C_BIT   EQU  24H     ;存放 小数变量
  1137. D_BIT   EQU  20H     ;存放 百 位数变量
  1138. FLAG    EQU  26H     ;DS18B20是否存在标志
  1139. XSD     EQU  23H     ;点
  1140. WDFH    EQU  25H     ;℃
  1141. WDGW    EQU  27H        ;温度高位值
  1142. WDDW    EQU  28H        ;温度低位值
  1143. QUSHU   EQU  28H
  1144. QUSHU1  EQU  08H
  1145. QUSHU2  EQU  09H
  1146. LSTZSJ1 EQU  0AH
  1147. LSTZSJ  EQU  0BH
  1148. MIAO            EQU         20H                                ;秒
  1149. FEN            EQU         21H                                ;分
  1150. SHI            EQU         22H                                ;时
  1151. RIQI            EQU         23H                                ;日
  1152. YUE            EQU         24H                                ;月  ACC.7=0为2000年
  1153. XQI            EQU         25H                                ;星期
  1154. NIAN            EQU         26H                                ;年   
  1155. start_year     EQU     01;    定义查询表起始年份,01--199 表示 1901-2099 年
  1156. ;以下三单元为需转换的公历日期          是子程序的入口数据
  1157. time_year      EQU    NIAN
  1158. time_month     EQU    YUE    ;BIT7 表示世纪,为  1 表示 19 世纪,为 0 表示 20 世纪
  1159. time_date      EQU    RIQI
  1160. ;以下三单元存转换后农历日期         与入口单元重叠,如要保留入口信息,请重定义出口地址
  1161. CONvert_yeAr   DATA   3Fh
  1162. CONvert_mONth   DATA   3Eh    ;BIT7 为 1 表示闰月
  1163. CONvert_dAte   DATA    3Dh
  1164. temp_Byte4     DATA    3Bh
  1165. temp_Byte5     DATA    3Ch
  1166. temp_Byte1  EQU  20H
  1167. temp_Byte2  EQU  21H
  1168. temp_Byte3  EQU  22H
  1169. ;*************************************************************        
  1170. ;*********************中断入口程序****************************
  1171.         ORG     0000H
  1172.         LJMP    MAIN
  1173.     ;    ORG     0003H
  1174.    ;     RETI
  1175.     ;    ORG     000BH   ; 定时器 T0中断入口
  1176.      ;   JMP     EXT0    ; 跳至T0中断子程序   
  1177.      ;   ORG     0013H
  1178.      ;   RETI
  1179.      ;;   ORG     001BH
  1180.      ;   RETI
  1181.     ;    ORG     0023H
  1182.     ;    RETI
  1183. ;***************主程序****************************************/
  1184. MAIN: MOV    SP,#69H          ;堆栈首址
  1185.       LCALL BEEP_BZ
  1186.       LCALL AN_DEL
  1187.       LCALL BEEP_BZ           ;开机鸣响2声
  1188.       LCALL RE_TEMP        ;对DS18B20初始化及读取
  1189.                 LCALL GET1302 ;读时间
  1190.                 MOV A,MIAO
  1191.                 JNB ACC.7,STRAT   ;如果秒最高位是1初始化时钟
  1192.           LCALL IN_1302         ;时钟芯片初始化
  1193. STRAT: ; MOV    SP,#69H          ;堆栈首址
  1194.        ; MOV    R0,#30H          ;初使化寄存显示单元
  1195.        ; MOV    R1,#74           ;30H-单元清零
  1196.        ; MOV    A,#0
  1197. ST:    ; MOV    @R0,A
  1198.        ; INC    R0
  1199.        ; DJNZ   R1,ST

  1200. ST1:
  1201.                 LCALL  Get1302                   ;读取时间
  1202.       LCALL  XSSJ           ;时间数据转换
  1203.                 LCALL  PLAY1                          ;显示时间
  1204.                 MOV A,MIAO          ;如果秒=30显示滚动日期
  1205.                 CJNE A,#30H,ST2
  1206.                 LCALL GDRQ
  1207. ST2:  JNB ANZ,WD                 ;按下左键调用温度显示
  1208.   ;    JNB ANY,YYUE         ;按下右键调用音乐
  1209.       JNB ANX,G_DRQ          ;按下下键调用滚动显示日历
  1210.                 JNB AN,TZSJ   ;按下中间按键调用调时
  1211.                 JMP    ST1
  1212. ;*****************************
  1213. G_DRQ:LCALL GDRQ
  1214.       JMP ST1
  1215. ;*****************************************************
  1216. WD:   LCALL AN_DEL
  1217.       JB ANZ,WD_OUT
  1218.       LCALL BEEP_BZ
  1219. WD_1: LCALL  RE_TEMP        ;读取温度
  1220.       LCALL   TURN          ;转化温度子程序        
  1221.       LCALL  XSWD           ;温度数据转换
  1222.                 LCALL  PLAY                          ;显示
  1223.                 JB ANZ,WD_1
  1224.                 LCALL AN_DEL
  1225.                 LCALL BEEP_BZ
  1226.             JNB ANZ,WDOUT
  1227. WD_OUT:RET
  1228. GDRQ: LCALL  Get1302                   ;读取时间
  1229.       LCALL   RQFL    ;调用日期分离程序
  1230.       LCALL   L30_
  1231.       RET
  1232. WDOUT:LJMP ST1
  1233. ;*******************************************调整时间程序*************
  1234. TZSJ:
  1235.          LCALL AN_DEL
  1236.                JNB AN,$
  1237.               LCALL BEEP_BZ
  1238. TZSJ_1:  LCALL S_NIAN  ;显示调年
  1239.          JNB ANS, N_J1          ;年+1
  1240.                JNB ANX,N_1            ;年-1
  1241.         JNB ANY,TZ_YUE  ;调月
  1242.         JNB AN,TZSJOUT;确认
  1243.              JNB ANZ, TZ_NOUT
  1244.          JMP TZSJ_1
  1245. TZSJOUT:;LCALL GetWeek
  1246. LCALL Set1302
  1247.             LCALL BEEP_BZ
  1248. TZ_NOUT:        LJMP ST1
  1249. N_J1:  LCALL AN_DEL  ;年+1
  1250.        LCALL BEEP_BZ
  1251.       LCALL NIAN_J1
  1252.       LJMP TZSJ_1
  1253. N_1:  LCALL AN_DEL ;年-1
  1254.               LCALL BEEP_BZ
  1255.       LCALL NIAN_1
  1256.       LJMP TZSJ_1
  1257. ;***************************************
  1258. Y_J1:  LCALL AN_DEL;月+1
  1259.               LCALL BEEP_BZ
  1260.       LCALL YUE_J1
  1261.       LJMP TZ_YUE1
  1262. Y_1:  LCALL AN_DEL ;月-1
  1263.               LCALL BEEP_BZ
  1264.       LCALL YUE_1
  1265.       LJMP TZ_YUE1
  1266. ;*********
  1267. TZ_YUE: LCALL AN_DEL
  1268.       JNB ANY,$
  1269.    LCALL BEEP_BZ
  1270. TZ_YUE1: LCALL S_YUE;显示调月
  1271.          JNB ANS,Y_J1;月+1
  1272.          JNB ANX,Y_1;月-1
  1273.          JNB ANY,TZ_RIQI;调日期
  1274.          JNB AN,TZ_YUEOUT
  1275.            JNB ANZ, TZ_YOUT
  1276.        JMP TZ_YUE1
  1277. TZ_YUEOUT:LCALL GetWeek
  1278. LCALL SET1302
  1279.   LCALL BEEP_BZ
  1280. TZ_YOUT:LJMP ST1
  1281. ;***************************************
  1282. R_J1:  LCALL AN_DEL;月+1
  1283.               LCALL BEEP_BZ
  1284.       LCALL RIQI_J1
  1285.       LJMP TZ_RIQI1
  1286. R_1:  LCALL AN_DEL ;月-1
  1287.               LCALL BEEP_BZ
  1288.       LCALL RIQI_1
  1289.       LJMP TZ_RIQI1
  1290. ;*********
  1291. TZ_RIQI: LCALL AN_DEL
  1292.       JNB ANY,$
  1293.    LCALL BEEP_BZ
  1294. TZ_RIQI1: LCALL S_RIQI;显示调日期
  1295.          JNB ANS,R_J1;日期+1
  1296.          JNB ANX,R_1;日期-1
  1297.          JNB ANY,TZ_SHI;
  1298.          JNB AN,TZ_RIQIOUT
  1299.               JNB ANZ, TZ_ROUT
  1300.         JMP TZ_RIQI1
  1301. TZ_RIQIOUT:;LCALL GetWeek
  1302. LCALL SET1302
  1303.   LCALL BEEP_BZ
  1304. TZ_ROUT:LJMP ST1
  1305. ;***************************************
  1306. S_J1:  LCALL AN_DEL;时+1
  1307.               LCALL BEEP_BZ
  1308.       LCALL SHI_J1
  1309.       LJMP TZ_SHI1
  1310. S_1:  LCALL AN_DEL ;时-1
  1311.               LCALL BEEP_BZ
  1312.       LCALL SHI_1
  1313.       LJMP TZ_SHI1
  1314. ;*********
  1315. TZ_SHI: LCALL AN_DEL
  1316.       JNB ANY,$
  1317.    LCALL BEEP_BZ
  1318. TZ_SHI1: LCALL S_SHI;显示调时
  1319.          JNB ANS,S_J1;时+1
  1320.           JNB ANX,S_1;时-1
  1321. TZ_SHI4:JNB ANY,TZ_FEN
  1322.         JNB AN,TZ_SHIOUT
  1323.           JNB ANZ, TZ_SOUT
  1324.         JMP TZ_SHI1
  1325. TZ_SHIOUT:;LCALL GetWeek
  1326. LCALL SET1302
  1327.   LCALL BEEP_BZ
  1328. TZ_SOUT: LJMP ST1
  1329. ;*********
  1330. TZ_FEN: LCALL AN_DEL
  1331.       JNB ANY,$
  1332.    LCALL BEEP_BZ
  1333. TZ_FEN1: LCALL S_FEN;显示调分
  1334.          JNB ANS,F_J1;分+1
  1335.           JNB ANX,F_1;分-1
  1336. ;TZ_RIQI4:JNB ANY,TZ_FEN;
  1337.         JNB AN,TZ_FENOUT
  1338.         JNB ANZ, TZ_FOUT
  1339.         JMP TZ_FEN1
  1340. TZ_FENOUT:MOV MIAO,#0
  1341. ;LCALL GetWeek
  1342.   LCALL SET1302
  1343.   LCALL BEEP_BZ
  1344. TZ_FOUT:LJMP ST1
  1345. ;***************************************
  1346. F_J1:  LCALL AN_DEL;时+1
  1347.               LCALL BEEP_BZ
  1348.       LCALL FEN_J1
  1349.       LJMP TZ_FEN1
  1350. F_1:  LCALL AN_DEL ;时-1
  1351.               LCALL BEEP_BZ
  1352.       LCALL FEN_1
  1353.       LJMP TZ_FEN1
  1354. ;***************************************************
  1355. ;YYUE:   LCALL START1  ;调用音乐
  1356. ;        RET
  1357. SHIJ:   LCALL IN_1302 ;调用时间初始化
  1358.         RET
  1359. AN_DEL: MOV R6,#0
  1360. AN_DEL1:LCALL DEL
  1361.         DJNZ R6,AN_DEL1
  1362.                   RET
  1363. ;********************调整年月日程序*********************************/=======================================================================
  1364. S_NIAN:  MOV 40H,#52    ;显示调年
  1365.                   MOV 41H,#30
  1366.                   MOV A,NIAN
  1367.                   ANL A,#0FH
  1368.                   MOV 43H,A
  1369.                   MOV A,NIAN
  1370.                   SWAP A
  1371.                   ANL A,#0FH
  1372.                   MOV 42H,A
  1373.                   MOV 2DH,#0
  1374.                   MOV QUSHU,#40H
  1375.               LCALL  LINE_88
  1376.         RET               
  1377. S_YUE:  MOV 40H,#52    ;显示调月
  1378.                   MOV 41H,#31
  1379.                   MOV A,YUE
  1380.                   ANL A,#0FH
  1381.                   MOV 43H,A
  1382.                   MOV A,YUE
  1383.                   SWAP A
  1384.                   ANL A,#0FH
  1385.                   MOV 42H,A
  1386.                   MOV 2DH,#0
  1387.                   MOV QUSHU,#40H
  1388.               LCALL  LINE_88
  1389.         RET               
  1390. S_RIQI:  MOV 40H,#52    ;显示调日期
  1391.                   MOV 41H,#32
  1392.                   MOV A,RIQI
  1393.                   ANL A,#0FH
  1394.                   MOV 43H,A
  1395.                   MOV A,RIQI
  1396.                   SWAP A
  1397.                   ANL A,#0FH
  1398.                   MOV 42H,A
  1399.                   MOV 2DH,#0
  1400.                   MOV QUSHU,#40H
  1401.               LCALL  LINE_88
  1402.         RET               
  1403. S_SHI:  MOV 40H,#52    ;显示调时
  1404.                   MOV 41H,#53
  1405.                   MOV A,SHI
  1406.                   ANL A,#0FH
  1407.                   MOV 43H,A
  1408.                   MOV A,SHI
  1409.                   SWAP A
  1410.                   ANL A,#0FH
  1411.                   MOV 42H,A
  1412.                   MOV 2DH,#0
  1413.                   MOV QUSHU,#40H
  1414.               LCALL  LINE_88
  1415.         RET               
  1416. S_FEN:  MOV 40H,#52    ;显示调分
  1417.                   MOV 41H,#54
  1418.                   MOV A,FEN
  1419.                   ANL A,#0FH
  1420.                   MOV 43H,A
  1421.                   MOV A,FEN
  1422.                   SWAP A
  1423.                   ANL A,#0FH
  1424.                   MOV 42H,A
  1425.                   MOV 2DH,#0
  1426.                   MOV QUSHU,#40H
  1427.               LCALL  LINE_88
  1428.         RET               
  1429. ;;;;;;;;;;;;;;;;;;;;
  1430. FEN_J1:MOV LSTZSJ1,FEN;分+1程序
  1431. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1432. INC LSTZSJ;月+1
  1433. MOV A,LSTZSJ
  1434. CJNE A,#60,FEN_J12;小时60清0
  1435. MOV LSTZSJ,#0
  1436. FEN_J12:
  1437. LCALL TSSJTZ1;数据调整,16到10进制
  1438. MOV FEN,LSTZSJ1
  1439. RET
  1440. FEN_1: MOV LSTZSJ1,FEN;分-1程序
  1441. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1442. MOV A,LSTZSJ
  1443. CJNE A,#0,FEN_12  ;分是0加60
  1444. MOV LSTZSJ,#60
  1445. FEN_12:DEC LSTZSJ
  1446. LCALL TSSJTZ1;数据调整,16到10进制
  1447. MOV FEN,LSTZSJ1
  1448. RET
  1449. ;;;;
  1450. SHI_J1:MOV LSTZSJ1,SHI;小时+1程序
  1451. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1452. INC LSTZSJ;月+1
  1453. MOV A,LSTZSJ
  1454. CJNE A,#24,SHI_J12;小时24清0
  1455. MOV LSTZSJ,#0
  1456. SHI_J12:
  1457. LCALL TSSJTZ1;数据调整,16到10进制
  1458. MOV SHI,LSTZSJ1
  1459. RET
  1460. SHI_1: MOV LSTZSJ1,SHI;小时-1程序
  1461. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1462. MOV A,LSTZSJ
  1463. CJNE A,#0,SHI_12  ;小时是0加24
  1464. MOV LSTZSJ,#24
  1465. SHI_12:DEC LSTZSJ
  1466. LCALL TSSJTZ1;数据调整,16到10进制
  1467. MOV SHI,LSTZSJ1
  1468. RET
  1469. ;;;;  
  1470. RIQI_J1:MOV LSTZSJ1,RIQI;日+1程序
  1471. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1472. INC LSTZSJ;月+1
  1473. MOV A,LSTZSJ
  1474. CJNE A,#32,RIQI_J12;日是32清0
  1475. MOV LSTZSJ,#1
  1476. RIQI_J12:
  1477. LCALL TSSJTZ1;数据调整,16到10进制
  1478. MOV RIQI,LSTZSJ1
  1479. RET
  1480. RIQI_1: MOV LSTZSJ1,RIQI;日-1程序
  1481. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1482. MOV A,LSTZSJ
  1483. CJNE A,#1,RIQI_12  ;日是1加32
  1484. MOV LSTZSJ,#32
  1485. RIQI_12:DEC LSTZSJ
  1486. LCALL TSSJTZ1;数据调整,16到10进制
  1487. MOV RIQI,LSTZSJ1
  1488. RET
  1489. ;;;;
  1490. YUE_J1:MOV LSTZSJ1,YUE;月+1程序
  1491. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1492. INC LSTZSJ;月+1
  1493. MOV A,LSTZSJ
  1494. CJNE A,#13,YUE_J12;月是13清0
  1495. MOV LSTZSJ,#1
  1496. YUE_J12:
  1497. LCALL TSSJTZ1;数据调整,16到10进制
  1498. MOV YUE,LSTZSJ1
  1499. RET
  1500. YUE_1: MOV LSTZSJ1,YUE;月-1程序
  1501. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1502. MOV A,LSTZSJ
  1503. CJNE A,#1,YUE_12
  1504. MOV LSTZSJ,#13
  1505. YUE_12:DEC LSTZSJ
  1506. LCALL TSSJTZ1;数据调整,16到10进制
  1507. MOV YUE,LSTZSJ1
  1508. RET

  1509. NIAN_J1:MOV LSTZSJ1,NIAN;年+1程序
  1510. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1511. INC LSTZSJ;年+1
  1512. MOV A,LSTZSJ
  1513. CJNE A,#100,NIAN_J12;年是100清0
  1514. MOV LSTZSJ,#01
  1515. NIAN_J12:
  1516. LCALL TSSJTZ1;数据调整,16到10进制
  1517. MOV NIAN,LSTZSJ1
  1518. RET
  1519. NIAN_1: ;CJNE A,#13H,SMAJ_QR  
  1520. MOV LSTZSJ1,NIAN;年-1程序
  1521. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  1522. MOV A,LSTZSJ
  1523. CJNE A,#1,NIAN_12
  1524. MOV LSTZSJ,#100
  1525. NIAN_12:DEC LSTZSJ
  1526. LCALL TSSJTZ1;数据调整,16到10进制
  1527. MOV NIAN,LSTZSJ1
  1528. RET
  1529. ;;;;;;;;;;;;;
  1530. TSSJTZ:MOV A,LSTZSJ1;数据调整,10到16进制如21:00100001转为 21:00010101
  1531. ANL A,#0FH
  1532. MOV LSTZSJ,A
  1533. MOV A,LSTZSJ1
  1534. SWAP A
  1535. ANL A,#0FH
  1536. MOV B,#10
  1537. MUL AB
  1538. ADD A,LSTZSJ
  1539. MOV LSTZSJ,A
  1540. RET
  1541. TSSJTZ1:MOV A,LSTZSJ ;数据调整,16到10进制
  1542. MOV B,#10
  1543. DIV AB
  1544. SWAP A
  1545. MOV LSTZSJ,A
  1546. MOV A,B
  1547. ORL A,LSTZSJ
  1548. MOV LSTZSJ1,A
  1549. RET                                          ;*/
  1550. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  1551. LINE_88 :  MOV    2BH,#8      ;扫描的行数,共8行
  1552. FF2:      LCALL  LINE_11       ;扫描显示1行子程序
  1553.          DJNZ   2BH,FF2            ;扫描下一行
  1554.          MOV   2DH,#0
  1555.          RET
  1556. ;*********扫描显示一行子程序********************
  1557. LINE_11: LCALL MSTR_YD_
  1558.                    MOV 30H,#0
  1559.                    MOV 31H,#0
  1560.              LCALL  SEND_11        ;发送串行口子程序
  1561.         LCALL  XTH         ;选通行子程序
  1562.                    LCALL  DL22US
  1563.                    INC 2DH
  1564.         RET

  1565. SEND_11: MOV  R0,#30H
  1566.         MOV  R1,#35H
  1567.         MOV  R5,#4                ;一行有2个字节;如每次显示字数不同要作相应改动
  1568. LQ_11:   MOV  R2,#8                ;每个字节有5位
  1569.         MOV  A,@R0                ;将显存的字节的单元移入
  1570.                 MOV  R6,A
  1571.         MOV  A,@R1                ;将显存的字节的单元移入
  1572.                 MOV  R7,A
  1573.         LCALL  DD_1                ;调用显示一个字节的子程序
  1574.         INC  R0                        ;指向下一个显存的单元
  1575.         INC  R1                        ;指向下一个显存的单元
  1576.         DJNZ R5,LQ_11                ;2个字节全部移入了没有,未继续
  1577.         RET                                                        ;
  1578. ;*************************************** 日期分离程序====================================
  1579. RQFL:    MOV 40H,#12
  1580.          MOV 41H,#12
  1581.                         MOV 42H,#12
  1582.                         MOV 43H,#12
  1583.          MOV A,YUE
  1584.          JB ACC.7,RQFL1
  1585.          MOV 44H,#2
  1586.          MOV 45H,#0
  1587.          JMP RQFL3
  1588. RQFL1:  MOV 44H,#1
  1589.         MOV 45H,#9
  1590. RQFL3:
  1591.       MOV A,NIAN
  1592.       ANL A,#0FH
  1593.       MOV 47H,A
  1594.       MOV A,NIAN
  1595.       SWAP A
  1596.       ANL A,#0FH
  1597.       MOV 46H,A
  1598.                 MOV 48H,#30  ;显示年
  1599.       MOV A,YUE
  1600.       ANL A,#0FH
  1601.       MOV 4AH,A
  1602.       MOV A,YUE
  1603.       SWAP A
  1604.       ANL A,#03H
  1605.                 JZ  YUE_S_1
  1606. YUE_S_2:MOV 49H,A
  1607. YUE_S_3:        MOV 4BH,#31  ;显示 月
  1608.       MOV A,RIQI
  1609.       ANL A,#0FH
  1610.       MOV 4DH,A
  1611.       MOV A,RIQI
  1612.       SWAP A
  1613.       ANL A,#03H
  1614.                 JZ RIQI_S_1
  1615. RIQI_S_2:MOV 4CH,A
  1616. RIQI_S_3:MOV 4EH,#32  ;显示 日
  1617.                 MOV 4FH,#12
  1618.                 MOV 50H,#16         ;显示星期
  1619.                 MOV 51H,#17
  1620.                 MOV 52H,#12
  1621.                 LCALL GetWeek
  1622.       MOV A,XQI
  1623.                 ANL A,#07H
  1624.             CJNE A,#0,XQ_1
  1625.                  MOV  53H,#32
  1626.                  JMP  XQ_OUT
  1627. RIQI_S_1:MOV 4CH,#12
  1628.          JMP RIQI_S_3
  1629. YUE_S_1: MOV 49H,#12
  1630.          JMP YUE_S_3
  1631. XQ_1:  ADD A,#41
  1632.        MOV 53H,A
  1633. XQ_OUT:
  1634.                 MOV 54H,#12  ;空格
  1635.                 LCALL  RE_TEMP        ;读取温度
  1636.       LCALL   TURN          ;转化温度子程序
  1637.       MOV 55H,#15    ;T
  1638.              MOV 56H,#14     ;:
  1639.                 MOV 57H,20H            ;温度百位
  1640.                 MOV 58H,21H             ;温度十位
  1641.                 MOV 59H,22H                  ;温度个位
  1642.                 MOV 5AH,#13                  ;小数点
  1643.                 MOV 5BH,24H                  ;温度小数位
  1644.                 MOV 5CH,#11                  ;℃符号
  1645.                 MOV 5DH,#12
  1646.                 MOV 5EH,#33      ;农
  1647.                 MOV 5FH,#34                  ;历
  1648.                 LCALL  Get1302
  1649.                 LCALL   CONvert  ;调用公历转农历程序
  1650.                 MOV A,CONvert_mONth
  1651.                 JNB ACC.7,RQFL4
  1652.                 MOV 60H,#51
  1653.                 JMP RQFL5
  1654. RQFL4:MOV 60H,#12
  1655. RQFL5:LCALL  NL_YUE    ;调用农历月份
  1656.                 MOV 62H,#31 ;显示月
  1657.                 LCALL NL_RIQI
  1658.                 MOV 65H,#12
  1659.                 MOV 66H,#12
  1660.                 MOV 67H,#12
  1661.                 MOV 68H,#12
  1662.         ;        MOV 69H,#12
  1663. RQFLB:  RET
  1664. ;***********************
  1665. NL_YUE:  MOV  A,        CONvert_mONth        ;农历月
  1666.        ANL A,#1FH
  1667.                 JNB ACC.4,NL_RIQI0
  1668.                 ANL A,#0FH
  1669.                 ADD A,#10                                                         
  1670. NL_RIQI0: CJNE A,#1,NL_YUE1
  1671.                  MOV  61H,#35
  1672.                  JMP  NL_YOUT
  1673. NL_YUE1:    CJNE A,#10,NL_YUE2
  1674.          MOV  61H,#39
  1675.                  JMP  NL_YOUT
  1676. NL_YUE2:         CJNE A,#11,NL_YUE3
  1677.          MOV  61H,#37
  1678.                  JMP  NL_YOUT
  1679. NL_YUE3:         CJNE A,#12,NL_YUE4
  1680.          MOV 61H,#38
  1681.                  JMP NL_YOUT
  1682. NL_YUE4:        ADD A,#41
  1683.          MOV 61H,A
  1684. NL_YOUT: RET
  1685. ;***************
  1686. NL_RIQI:MOV A, CONvert_dAte  ;农历日
  1687.                   SWAP A
  1688.                   ANL A,#0FH
  1689.                   CJNE A,#0,NL_RIQI1
  1690.                   MOV 63H,#36  ;显示 初
  1691.                   JMP NL_ROUT
  1692. NL_RIQI1:CJNE A,#1,NL_RIQI2
  1693.          MOV 63H,#39  ;显示 十
  1694.                         JMP NL_ROUT
  1695. NL_RIQI2:CJNE A,#2,NL_RIQI3
  1696.          MOV 63H,#40  ;显示 二十
  1697.                         JMP NL_ROUT
  1698. NL_RIQI3:CJNE A,#3,NL_ROUT
  1699.          MOV 63H,#41  ;显示 三十
  1700.                         JMP NL_ROUT
  1701. NL_ROUT:MOV A, CONvert_dAte  ;农历日
  1702.         ANL A,#0FH
  1703.                   CJNE A,#0,NL_RIQI4
  1704.                   MOV 64H,#39  ;显示 十
  1705.                   JMP NL_RIQI5
  1706. NL_RIQI4:ADD A,#41
  1707.          MOV 64H,A
  1708. NL_RIQI5:        RET
  1709.         
  1710. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
  1711. ;;;;;;;;;;;;;;;;;;;;;;;
  1712. L30_:    MOV  2DH,#0
  1713.          MOV  QUSHU,#40H
  1714.          MOV    2FH,#37       ;共有多少个半角字符,一个汉字等于两个字符,个数值为实际字数*2+屏长度数
  1715. HHH_:    LCALL  L31_           ;. 扫描一个字节
  1716.          DJNZ   2FH,HHH_           ;字数没完继续
  1717.          RET
  1718. L31_:     MOV   B, #1     ;每次移入内存单元的数据要左移次数次值         ,从第一开始。
  1719. II_:      MOV   29H,#5    ;左移速度
  1720. III_:   LCALL L32_     ;扫描显示1帧
  1721.          DJNZ  29H,III_        ;速度没完继续
  1722.          INC   B                        ;左移次数+1
  1723.          MOV   A,#9
  1724.          CJNE  A,B,II_ ;如果B中的数超过8就完成1个字节的8次左移显示,否则继续循环.
  1725.               INC QUSHU       ;日期数据+1---5CH→
  1726.          RET

  1727. L32_:     MOV  2BH,#8      ;扫描的行数,共8行
  1728. JJ_:      LCALL  L33_     ;扫描显示1行子程序
  1729.          INC 2DH
  1730.           DJNZ   2BH,JJ_        ;8行没完继续
  1731.               MOV  2DH,#0 ;8行完成后再从0行开始扫描
  1732.          RET
  1733. L33_:     MOV    2EH,B         ;显示内容要左移几次数再显示的赋值给2EH单元
  1734.          LCALL  SEND_YD        ;发送串行口子程序
  1735.          LCALL  XT_H          ;选通行子程序
  1736.          LCALL  MSTR_YD_        ;将显示内容移入内存单元30H→
  1737. EE_:      LCALL  ZY
  1738.          DJNZ   2EH,EE_
  1739.          LCALL  ZYXZ        ;左移速度同步修正
  1740.          RET
  1741. MSTR_YD_:SETB RS1 ;R0,R1-数据存放起始地址,2DH行数据,R3-21H,22H临时数据,R4-每屏的字节数, ,20H日期数据起始地址
  1742.         SETB RS0                  
  1743.         MOV    R0,#30H
  1744.              MOV    R1,#35H
  1745.         MOV    R4,#5            ;每幕显示的字节数加1
  1746. BB_YD_: LCALL L_SHUJU
  1747.         MOV     @R0,A
  1748.         MOV     @R1,A
  1749.         INC    QUSHU           ;加1,移到下一个字节的对应位置
  1750.              INC    R0
  1751.              INC    R1
  1752.         DJNZ   R4,BB_YD_
  1753.                   MOV A,QUSHU
  1754.                   CLR C
  1755.                   SUBB A,#5
  1756.                   MOV QUSHU,A
  1757.              CLR RS1
  1758.              CLR RS0
  1759.         RET
  1760. ;;;使用R0,R1,R6,R7,B,2DH
  1761. L_SHUJU: MOV DPTR,#TAB10
  1762.         MOV QUSHU1,R0
  1763.         MOV QUSHU2,R1
  1764.         MOV R6,B
  1765.         MOV R0,QUSHU
  1766. L_SHU:   MOV A,@R0
  1767.         MOV B,#8
  1768.         MUL AB
  1769.         MOV R7,A
  1770.         MOV A,DPH
  1771.         ADD A,B
  1772.         MOV DPH,A
  1773.         MOV A,R7
  1774.         MOV B,2DH
  1775.         ADD A,B
  1776.         MOVC A,@A+DPTR
  1777.         MOV R0,QUSHU1
  1778.         MOV R1,QUSHU2
  1779.         MOV B,R6
  1780.         RET
  1781. ;*****************************发送数据到串口子程序*****************************************************/
  1782. SEND_YD:   MOV   R0,#30H
  1783.         MOV   R5,#4        ;如每次显示字数不同要作相应改动
  1784. LQ_YD:     CLR   C                        ;清C方便每个字节的移动
  1785.             MOV   R2,#8                ;每个字节有8位
  1786.         MOV   A,@R0                ;将显存的字节的单元移入A
  1787.             CPL   A                ;取反
  1788.         LCALL  DD1_YD                ;调用显示一个字节的子程序
  1789.         INC  R0                        ;指向下一个显存的单元
  1790.         DJNZ R5,LQ_YD                ;8个字节全部移入了没有,未继续
  1791.         RET
  1792. DD1_YD:    CLR  SRCLK                ;清串行CP端
  1793.         RLC  A                        ;将每个字节移位
  1794.    ;     MOV  SER,C                ;将移入C的位移入信号端
  1795.                    MOV  SEG,C
  1796.         SETB SRCLK                ;触发串行CP端
  1797.         DJNZ R2,DD1_YD                ;每个字节位移8次够了没有?
  1798.         RET
  1799. ;*******选通行子程序***2BH行数据*********************************************************************************/
  1800. XT_H:     CLR   RCLK                ;将输出CP变为低电平为上升沿作准备
  1801.              SETB  EN               ;将使能端变为高电平为下降沿作准备
  1802.                  MOV  R5,2BH
  1803.                  CJNE R5,#7,HSM_1
  1804.                  MOV  ABCD,#11111110B
  1805.                  JMP  XTH_OUT
  1806. HSM_1:    CJNE R5,#6,HSM_2
  1807.          MOV  ABCD,#11111101B
  1808.                  JMP  XTH_OUT
  1809. HSM_2:         CJNE R5,#5,HSM_3
  1810.          MOV  ABCD,#11111011B
  1811.                  JMP  XTH_OUT
  1812. HSM_3:         CJNE R5,#4,HSM_4
  1813.          MOV ABCD,#11110111B
  1814.                  JMP XTH_OUT
  1815. HSM_4:         CJNE R5,#3,HSM_5
  1816.          MOV ABCD,#11101111B
  1817.                  JMP XTH_OUT
  1818. HSM_5:    CJNE R5,#2,HSM_6
  1819.          MOV ABCD,#11011111B
  1820.                  JMP XTH_OUT
  1821. HSM_6:         CJNE R5,#1,HSM_7
  1822.          MOV ABCD,#10111111B
  1823.                  JMP XTH_OUT
  1824. HSM_7:         CJNE R5,#8,XTH_OUT
  1825.          MOV ABCD,#01111111B
  1826. XTH_OUT:
  1827.          SETB  RCLK                ;输出CP为上升沿,显示一个
  1828.          CLR   EN               ;138可显示
  1829.          RET

  1830. ;**********左移一位子程序*******************************************************************************/
  1831. ZY:           ;30H后存入显示内容,R0为显示未址,R2为移出高位个数   字数*2+1
  1832.          SETB RS1
  1833.                         CLR  RS0
  1834.                    MOV R2,#5
  1835.          MOV  R0, #34H    ;显示单元未址        
  1836.          CLR  C
  1837. CC:      MOV  A,   @R0
  1838.          RLC  A            ;将后一字节的最高位移到C里,再移到前一字节的最低位
  1839.          MOV  @R0, A
  1840.          DEC  R0
  1841.          DJNZ R2,  CC
  1842.          CLR  C
  1843.                         CLR RS1
  1844.                         CLR RS0
  1845.          RET
  1846. ;********************移动查模式时速度同步修正子程序*****************************************************/
  1847. ZYXZ:    MOV   R5,B
  1848.          MOV   A,#9
  1849.          SUBB  A,R5
  1850.          MOV   R4,A
  1851. AA:      LCALL DL22US
  1852.          NOP
  1853.          DJNZ  R4 ,AA
  1854.          RET
  1855. ;*********************************************************************************/

  1856. ;********************时间数据转换*************************************=====================================================================*/
  1857. XSSJ:  
  1858.       MOV        A,FEN    ;分
  1859.           MOV        B,#10h
  1860.           DIV        AB                                                ;把41H高低4位分开
  1861.           MOV        43H,A                                        ;高4位存入
  1862.           MOV        A,B
  1863.           MOV        44H,A                                        ;低4位存入
  1864.           MOV        A,MIAO    ;秒
  1865.           MOV        B,#10h               
  1866.           DIV        AB                                                ;把40H高低4位分开
  1867.           mov        45H,A                                        ;高4位存入
  1868.           mov        a,b
  1869.           mov        46H,a                                        ;低4位存入
  1870.       MOV A,SHI
  1871.       MOV B,#16
  1872.       DIV AB
  1873.       MOV 40H,A
  1874.       MOV A,B
  1875.       MOV 41H,A
  1876.           MOV 42H,#15
  1877.           MOV A,40H
  1878.           JNZ XSSJ_1
  1879.           MOV 40H,#12
  1880. XSSJ_1:  RET
  1881. ;*************************时间显示程序****************************
  1882. PLAY1:         MOV  DPTR,#TABX
  1883.           MOV   2DH,#0
  1884.          MOV   2FH,#20     ;速度
  1885. GG1:      CALL LINE_8      ;扫描显示1帧
  1886.          DJNZ  2FH,GG1
  1887.          RET
  1888. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  1889. LINE_8 :  MOV    2BH,#8      ;扫描的行数,共8行
  1890. FF1:      CALL  LINE_1       ;扫描显示1行子程序
  1891.          DJNZ   2BH,FF1            ;扫描下一行
  1892.          MOV    A,2DH
  1893.          SUBB A ,#8    ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
  1894.          MOV    2DH,A
  1895.          RET
  1896. ;*********扫描显示一行子程序********************
  1897. LINE_1:  CALL  MSTR_R      ;将显示内容移入内存单元
  1898.         CALL  MSTR_G
  1899.                 MOV 35H,#0
  1900.                 MOV 36H,#0
  1901. ;                MOV 3BH,#0
  1902.                 MOV 3AH,#0
  1903.             CALL  SEND_1        ;发送串行口子程序
  1904.         CALL  XTH         ;选通行子程序
  1905.                 CALL  DL22US
  1906.                 INC 2DH
  1907.         RET
  1908. ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***2EH,2FH缓冲**************
  1909. SEND_1: MOV  R0,#30H
  1910.         MOV  R1,#38H
  1911.         MOV  R5,#2                ;一行有2个字节;如每次显示字数不同要作相应改动
  1912. LQ_1:   MOV  R2,#5                ;每个字节有5位
  1913.         MOV  A,@R0                ;将显存的字节的单元移入
  1914.                 MOV  R6,A
  1915.         MOV  A,@R1                ;将显存的字节的单元移入
  1916.                 MOV  R7,A
  1917.         CALL  DD_1                ;调用显示一个字节的子程序
  1918.         INC  R0                        ;指向下一个显存的单元
  1919.         INC  R1                        ;指向下一个显存的单元
  1920.         DJNZ R5,LQ_1                ;2个字节全部移入了没有,未继续
  1921.                 CALL SEND_2
  1922.                 CALL SEND_3
  1923.         RET                                                        ;
  1924. SEND_2: MOV R0,#32H
  1925.         MOV R1,#3AH
  1926.                 MOV R5,#1
  1927. LQ_2:   MOV  R2,#2                ;每个字节有2位
  1928.         MOV  A,@R0                ;将显存的字节的单元移入
  1929.                 MOV  R6,A
  1930.         MOV  A,@R1                ;将显存的字节的单元移入
  1931.                 MOV  R7,A
  1932.         CALL  DD_1                ;调用显示一个字节的子程序
  1933.         INC  R0                        ;指向下一个显存的单元
  1934.         INC  R1                        ;指向下一个显存的单元
  1935.         DJNZ R5,LQ_2                ;2个字节全部移入了没有,未继续
  1936.                 RET
  1937. SEND_3: MOV R0,#33H
  1938.         MOV R1,#3BH
  1939.                 MOV R5,#4
  1940. LQ_3:   MOV  R2,#5                ;每个字节有5位
  1941.         MOV  A,@R0                ;将显存的字节的单元移入
  1942.                 MOV  R6,A
  1943.         MOV  A,@R1                ;将显存的字节的单元移入
  1944.                 MOV  R7,A
  1945.         CALL  DD_1                ;调用显示一个字节的子程序
  1946.         INC  R0                        ;指向下一个显存的单元
  1947.         INC  R1                        ;指向下一个显存的单元
  1948.         DJNZ R5,LQ_3                ;2个字节全部移入了没有,未继续
  1949.                 RET
  1950. DD_1:   CLR  SRCLK                ;清串行CP端
  1951.         CLR  C
  1952.         MOV  A,R6
  1953.         RLC  A                        ;将每个字节移位
  1954.                 MOV  R6,A
  1955.                 CPL  C
  1956.         MOV  SER,C                ;红色
  1957.                 CLR  C
  1958.                 MOV  A,R7
  1959.                 RLC  A
  1960.                 MOV  R7,A
  1961.                 CPL C
  1962.                 MOV  SEG,C            ;绿色
  1963.         SETB SRCLK                ;触发串行CP端
  1964.         DJNZ R2,DD_1                ;每个字节位移5次够了没有?
  1965.         RET
  1966. ;*************************温度显示程序****************************
  1967. PLAY:         MOV  DPTR,#TABX
  1968.          MOV   2DH,#0
  1969.          MOV   2FH,#60     ;速度
  1970. GG:      CALL LINE8      ;扫描显示1帧
  1971.          DJNZ  2FH,GG
  1972.          RET
  1973. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  1974. LINE8 :  MOV    2BH,#8      ;扫描的行数,共8行
  1975. FF:      CALL  LINE1       ;扫描显示1行子程序
  1976.          DJNZ   2BH,FF            ;扫描下一行
  1977.          MOV    A,2DH
  1978.          SUBB A ,#8    ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
  1979.          MOV    2DH,A
  1980.          RET
  1981. ;*********扫描显示一行子程序********************
  1982. LINE1:  CALL  MSTR_R      ;将显示内容移入内存单元
  1983.         CALL  MSTR_G
  1984.                 MOV 34H,#0
  1985.                 MOV 35H,#0
  1986.                 MOV 3BH,#0
  1987.             CALL  SEND        ;发送串行口子程序
  1988.         CALL  XTH         ;选通行子程序
  1989.                 CALL  DL22US
  1990.                 INC 2DH
  1991.         RET

  1992. ;****************************************************************************
  1993. ;**显示内容移入内存单元子程序*取红色到30H-34H,绿色35H-39H*2DH取字节数据***********************
  1994. MSTR_R: MOV    R0,#30H
  1995.         MOV    R4,#7            ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
  1996.                 MOV    R1,#40H
  1997. BB_R:   
  1998.         MOV   A,@R1
  1999.                 MOV   B,#8
  2000.                 MUL   AB
  2001.                 ADD    A,2DH
  2002.                 MOVC   A, @A+DPTR
  2003.         MOV    @R0,A         
  2004.             INC    R0
  2005.                 INC    R1        
  2006.             DJNZ   R4,BB_R
  2007.                 MOV   R1,#40H
  2008.             RET
  2009. MSTR_G: MOV    R0,#38H
  2010.         MOV    R4,#7            ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
  2011.                 MOV    R1,#40H
  2012. BB_G:   
  2013.         MOV   A,@R1
  2014.                 MOV   B,#8
  2015.                 MUL   AB
  2016.                 ADD    A,2DH
  2017.                 MOVC   A, @A+DPTR
  2018.         MOV    @R0,A         
  2019.             INC    R0
  2020.                 INC    R1        
  2021.             DJNZ   R4,BB_G
  2022.                 MOV   R1,#40H
  2023.             RET
  2024. ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***R6,R7**************
  2025. SEND:   MOV  R0,#30H
  2026.         MOV  R1,#38H
  2027.         MOV  R5,#6                ;一行有4个字节;如每次显示字数不同要作相应改动
  2028. LQ:     MOV  R2,#5                ;每个字节有8位
  2029.         MOV  A,@R0                ;将显存的字节的单元移入
  2030.                 MOV  R6,A
  2031.         MOV  A,@R1                ;将显存的字节的单元移入
  2032.                 MOV  R7,A
  2033.         LCALL  DD1                ;调用显示一个字节的子程序
  2034.         INC  R0                        ;指向下一个显存的单元
  2035.         INC  R1                        ;指向下一个显存的单元
  2036.         DJNZ R5,LQ                ;8个字节全部移入了没有,未继续
  2037.                 CLR SRCLK
  2038.                 SETB C
  2039.                 MOV SER,C
  2040.                 MOV SEG,C
  2041.                 SETB SRCLK
  2042.         RET                                                        ;

  2043. DD1:    CLR  SRCLK                ;清串行CP端
  2044.         CLR  C
  2045.         MOV  A,R6
  2046.         RLC  A                        ;将每个字节移位
  2047.                 MOV  R6,A
  2048.                 CPL  C
  2049.         MOV  SER,C                ;红色
  2050.                 CLR  C
  2051.                 MOV  A,R7
  2052.                 RLC  A
  2053.                 MOV  R7,A
  2054.                 CPL C
  2055.                 MOV  SEG,C            ;绿色
  2056.         SETB SRCLK                ;触发串行CP端
  2057.         DJNZ R2,DD1                ;每个字节位移8次够了没有?
  2058.         RET
  2059. ;*******选通行子程序***2BH行数据*********************************************************************************/
  2060. XTH:     CLR   RCLK                ;将输出CP变为低电平为上升沿作准备
  2061.              SETB  EN               ;将使能端变为高电平为下降沿作准备
  2062.                  MOV  R5,2BH
  2063.                  CJNE R5,#8,HSM1
  2064.                  MOV  ABCD,#11111110B
  2065.                  JMP  XTHOUT
  2066. HSM1:    CJNE R5,#7,HSM2
  2067.          MOV  ABCD,#11111101B
  2068.                  JMP  XTHOUT
  2069. HSM2:         CJNE R5,#6,HSM3
  2070.          MOV  ABCD,#11111011B
  2071.                  JMP  XTHOUT
  2072. HSM3:         CJNE R5,#5,HSM4
  2073.          MOV ABCD,#11110111B
  2074.                  JMP XTHOUT
  2075. HSM4:         CJNE R5,#4,HSM5
  2076.          MOV ABCD,#11101111B
  2077.                  JMP XTHOUT
  2078. HSM5:    CJNE R5,#3,HSM6
  2079.          MOV ABCD,#11011111B
  2080.                  JMP XTHOUT
  2081. HSM6:         CJNE R5,#2,HSM7
  2082.          MOV ABCD,#10111111B
  2083.                  JMP XTHOUT
  2084. HSM7:         CJNE R5,#1,XTHOUT
  2085.          MOV ABCD,#01111111B
  2086. XTHOUT:
  2087.          SETB  RCLK                ;输出CP为上升沿,显示一个
  2088.          CLR   EN               ;138可显示
  2089.          RET

  2090. ;******22US延时子程序********
  2091. DL22US:  MOV   R7,#50
  2092.          DJNZ  R7,$
  2093.          RET                 ;
  2094. DEL:    MOV R7,#0
  2095.          DJNZ  R7,$
  2096.           RET
  2097. BEEP_BZ:; CLR     BEEP         ;蜂鸣器鸣响
  2098.          MOV R6,#40
  2099. BEEP_2:  CALL DEL
  2100.          CPL BEEP
  2101.                         DJNZ R6, BEEP_2
  2102.          SETB   BEEP          ;蜂鸣器停止
  2103.                         RET
  2104. ;***********************************字码表****************************************
  2105. TAB10:
  2106. DB 038H,044H,082H,082H,082H,082H,044H,038H;"0",0
  2107. DB 010H,070H,010H,010H,010H,010H,010H,0FEH;"1",1
  2108. DB 07CH,082H,082H,006H,00CH,070H,0FAH,09EH;"2",2
  2109. DB 07EH,044H,00CH,038H,006H,002H,086H,07CH;"3",3
  2110. DB 004H,00CH,01CH,034H,064H,0FEH,004H,03FH;"4",4
  2111. DB 07EH,042H,040H,07CH,042H,002H,086H,07CH;"5",5
  2112. DB 03CH,062H,0C0H,0FCH,082H,082H,0C2H,07CH;"6",6
  2113. DB 0FEH,084H,088H,018H,010H,030H,020H,020H;"7",7
  2114. DB 07CH,082H,082H,07CH,086H,082H,0C6H,07CH;"8",8
  2115. DB 07CH,086H,082H,082H,07EH,002H,084H,078H;"9",9
  2116. DB 000H, 000H, 000H, 000H, 0FCH, 000H, 000H, 000H   ;-        10
  2117. DB 080H, 078H, 084H, 080H, 080H, 080H, 084H, 078H  ;"C",11
  2118. DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H  ;无显示,12
  2119. DB 000H, 000H, 000H, 000H, 030H, 030H, 000H, 000H  ;点,13
  2120. DB 000H, 000H, 030H, 030H, 000H, 030H, 030H, 000H   ;:   14
  2121. DB 0FEH,092H,010H,010H,010H,010H,010H,038H;"T",15
  2122. DB 7EH,42H,7EH,7EH,48H,7EH,88H,7EH    ;温   16
  2123. DB    57H,0FDH,57H,75H,57H,0FDH,55H,8BH ;度 17
  2124. ;DB 0D6H, 092H, 092H, 092H, 09AH, 06CH, 064H, 044H;"W",16
  2125. ;DB 0EEH, 044H, 048H, 070H, 050H, 048H, 044H, 0EEH;"K",17
  2126. DB 0FCH,042H,042H,07CH,040H,040H,0E0H,000H;"P",18
  2127. DB 0CEH,084H,084H,0FCH,084H,084H,0CEH,000H;"H",19
  2128. DB 000H,000H,078H,084H,0FCH,080H,07CH,000H;"e",20
  2129. DB 000H,000H,0DCH,078H,030H,078H,0ECH,000H;"x",21
  2130. DB 018H,000H,038H,008H,008H,008H,008H,0F0H;"j",22
  2131. DB 000H,000H,0FEH,092H,092H,092H,0DAH,000H;"m",23
  2132. DB 000H,020H,000H,060H,020H,020H,020H,0F8H;"i",24
  2133. DB 000H,000H,000H,0D8H,066H,042H,042H,0E7H;"n",25
  2134. DB 0E7H,042H,044H,024H,02CH,028H,018H,010H;"V",26
  2135. DB 03CH,05AH,0AAH,0AAH,0B4H,042H,03CH,000H;"@",27
  2136. DB 000H,000H,03CH,062H,040H,042H,03CH,000H;"c",28
  2137. DB 000H,000H,03CH,042H,042H,042H,03CH,000H;"o",29
  2138. DB 010H,03EH,048H,0BCH,028H,07EH,008H,008H;年,30
  2139. DB 03CH,024H,03CH,024H,03CH,024H,044H,08CH;月,31
  2140. DB 0FCH,084H,084H,0FCH,084H,084H,084H,0FCH;日,32
  2141. DB 10H,0FEH,92H,20H,34H,68H,0A4H,32H;农,33
  2142. DB 7EH,48H,7EH,4AH,4AH,4AH,4AH,96H;历,34
  2143. DB 000H,0FEH,010H,010H,05CH,050H,050H,0FEH;正,35
  2144. DB 040H,0E0H,03EH,06AH,0CAH,04AH,052H,044H;初,36
  2145. DB 010H,01EH,024H,058H,018H,024H,0DBH,018H;冬,37
  2146. DB 000H,075H,05FH,075H,05FH,075H,057H,0B7H;腊,38
  2147. DB 010H,010H,010H,0FEH,010H,010H,010H,010H;十,39
  2148. DB 000H,044H,0FEH,044H,044H,044H,044H,07CH;二十,40
  2149. DB 054H,054H,054H,0FEH,054H,054H,054H,094H;卅,41
  2150. DB 000H,000H,000H,000H,0FEH,000H,000H,000H;一,42
  2151. DB 000H,000H,07CH,000H,000H,0FEH,000H,000H;二,43
  2152. DB 000H,000H,07CH,000H,038H,000H,0FEH,000H;三,44
  2153. DB 000H,0FEH,0AAH,0AAH,0AAH,0CEH,082H,0FEH;四,45
  2154. DB 07CH,010H,010H,07CH,014H,014H,024H,0FEH;五,46
  2155. DB 000H,010H,000H,0FEH,000H,028H,046H,082H;六,47
  2156. DB 000H,020H,020H,0FEH,020H,020H,022H,01CH;七,48
  2157. DB 000H,028H,028H,028H,044H,044H,082H,000H;八,49
  2158. DB 020H,020H,0FCH,028H,028H,028H,04AH,086H;九,50
  2159. DB 05EH,082H,0BAH,092H,0BAH,092H,0BAH,086H;闰,51
  2160. DB 0BEH,2AH,0FEH,6AH,0BEH,0F6H,0BEH,46H ;调,52
  2161. DB 04H,0FEH,0A4H,0B4H,0ECH,0A4H,0E4H,0CH ;时 53
  2162. DB 28H,44H,82H,7CH,24H,24H,44H,8CH;分 54
  2163. DB 04H,24H,6CH,0F6H,25H,72H,0A4H,28H ;秒 55

  2164. ;********************温度数据转换*************************************=====================================================================*/
  2165. XSWD:   CALL  RE_TEMP
  2166.         MOV    XSD,#13
  2167.                 MOV    WDFH,#11
  2168.                 MOV  R0,#20H
  2169.             MOV  R1,#40H
  2170.                 MOV  R2,#7
  2171. XSWD2:  MOV  A,@R0
  2172.                 MOV  @R1,A
  2173.                 INC  R0
  2174.                 INC  R1
  2175.                 DJNZ  R2,XSWD2
  2176.                 RET
  2177. ;;;;;;;;;;;;以下是温度程序;;;;;;;;;==
  2178. ; 程序功能:数字温度计(+125- -55)
  2179. RE_TEMP:         ;对DS18B20初始化及读取
  2180.        SETB   DQ           
  2181.        CALL  RESET_1820    ;调用复位子程序
  2182.        JB     FLAG, STT        ;判断DS1820是否存在?
  2183.        RET                              ;*/            
  2184. STT:                       ; DS18B20存在
  2185.        MOV    A,#0CCH        ;跳过ROM匹配
  2186.        CALL   WRITE_1820     ;写入数据
  2187.        MOV    A,#44H          ;发出温度转换命令
  2188.        CALL   WRITE_1820     ;写入数据
  2189.        CALL   RESET_1820    ;准备读温度前先复位
  2190.        MOV    A,#0CCH         ;跳过ROM匹配
  2191.        CALL   WRITE_1820     ;写入数据
  2192.        MOV    A,#0BEH         ;发出读温度命令
  2193.        CALL   WRITE_1820     ;写入数据
  2194.        CALL   READ_1820      ;读出温度数据         
  2195.        RET                                  ;*/      
  2196. RESET_1820:  ;复位(有具体的时序要求)                       
  2197.        SETB  DQ
  2198.            NOP
  2199.            NOP
  2200.        CLR   DQ      
  2201. ;主机发出延时521微秒的复位低脉冲
  2202.        MOV  R1,#2            ;  3
  2203. DLY:   MOV  R0,#107
  2204.        DJNZ R0,$
  2205.        DJNZ R1,DLY
  2206. ;然后拉高数据线
  2207.        SETB  DQ
  2208.            NOP
  2209.            NOP
  2210.            NOP        
  2211.        MOV   R0,#25H      
  2212. T2:    JNB   DQ ,T3       ;等待DS18B20回应
  2213.        DJNZ  R0, T2
  2214.        JMP  T4         
  2215. T3:    SETB  FLAG      ;置标志位,表示DS1820存在
  2216.        JMP  T5
  2217. T4:    CLR   FLAG     ;清标志位,表示DS1820不存在     
  2218.        JMP  T7
  2219. T5:    MOV  R0,#117
  2220. T6:    DJNZ R0,T6           ;时序要求延时一段时间
  2221. T7:    SETB   DQ        
  2222.        RET  
  2223.        ;---------------------------------------------- */                                 
  2224. WRITE_1820: ;写入DS18B20(有具体的时序要求)
  2225.        MOV  R2,#8           ;一共8位数据
  2226.        CLR  C
  2227. WR1:   CLR  DQ            ;总线低位,开始写入  
  2228.        MOV  R3,#7
  2229.        DJNZ R3,[        DISCUZ_CODE_1        ]nbsp;           ;保持16微秒以上
  2230.        RRC  A  ;把字节DATA分成8个BIT环移给C
  2231.        MOV  DQ,  C        ;写入一个BIT
  2232.        MOV  R3,#23
  2233.        DJNZ R3,[        DISCUZ_CODE_1        ]nbsp;           ;等待
  2234.        SETB  DQ           ;重新释放总线
  2235.        NOP
  2236.        DJNZ R2,WR1          ;写入下一个BIT
  2237.        SETB  DQ         
  2238.        RET                                            
  2239. READ_1820: ;将温度高位和低位从DS18B20中读出
  2240.        MOV   R4,#2           ; 读出两个字节的数据
  2241.        MOV   R1,#WDDW        ;低位存
  2242. RE0:   MOV   R2,#8           ;数据一共有8位
  2243. RE1:   CLR   C
  2244.        SETB  DQ
  2245.            NOP
  2246.            NOP
  2247.            NOP         
  2248.        CLR   DQ          ;读前总线保持为低   
  2249.            NOP
  2250.            NOP
  2251.            NOP            
  2252.        SETB  DQ          ;开始读总线释放                 
  2253.        MOV   R3,#9
  2254. RE2:   DJNZ  R3,RE2        ;延时18微妙
  2255.        MOV   C, DQ         ; 从总线读到一个BIT                  
  2256.        MOV   R3,#23
  2257. RE3:   DJNZ  R3,RE3         ;等待100μ秒
  2258.        RRC   A              ;把读得的位值环移给A
  2259.        DJNZ  R2,RE1        ;读下一个BIT
  2260.        MOV   @R1,A
  2261.        DEC   R1
  2262.        DJNZ  R4,RE0
  2263.        RET         
  2264. ;;;;;;;;;;;;;;;;;;;; */                              
  2265. TURN:  MOV   A,WDGW   
  2266.        JBC   ACC.4,TU  ;是零下跳到TU
  2267.        MOV   D_BIT,#0FFH
  2268. DIS:   MOV   DPTR,#TAB
  2269.            MOV   A,WDDW           ;低位
  2270.        ANL   A,#0FH              ;取小数
  2271.        MOVC  A,@A+DPTR
  2272.            MOV   C_BIT,A        ;精确到0.1度的小数值
  2273.        MOV   A,WDDW
  2274.        SWAP  A       ;高低位互换
  2275.                 ANL  A,#0FH
  2276.                 MOV  WDDW,A
  2277.                 MOV  A,WDGW
  2278.                 ANL  A,#0FH
  2279.                 SWAP A
  2280.                 ORL  A,WDDW;重新组合,为不带小数的温度值
  2281.                 MOV  WDDW,A
  2282.                 MOV  A,D_BIT
  2283.                 CJNE A,#10,TU_1;百位不是-跳转
  2284.                 MOV A,WDDW
  2285. DIS_1:
  2286.           MOV B,#10
  2287.           DIV AB
  2288.           MOV A_BIT,B;十位值
  2289.           MOV B_BIT,A;个位值
  2290.           MOV A,D_BIT
  2291.           CJNE A,#0,TU_2;百位不是0跳转
  2292.           MOV D_BIT,#12;是0消隐
  2293. DIS_2:MOV A,B_BIT
  2294.           CJNE A,#0,TUR;十位不是0转
  2295.           MOV B_BIT,#12;是0消隐
  2296. TUR:    RET   

  2297. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                              
  2298. TU:   MOV D_BIT,#10;显示-号
  2299.       CPL A
  2300.       ANL A,#0FH
  2301.       mov WDGW,A;取反A存入高位
  2302.       MOV A,WDDW
  2303.       CPL A
  2304.       CLR C
  2305.                 INC A
  2306.                 MOV WDDW,A
  2307.                 MOV A,WDGW
  2308.       ADDC A,#0
  2309.       MOV WDGW,A
  2310.       JMP DIS
  2311. TU_1: MOV A,WDDW
  2312.       MOV B,#100
  2313.           DIV AB
  2314.           MOV D_BIT,A;百位值
  2315.       MOV A,B
  2316.           JMP DIS_1
  2317. TU_2: CJNE A,#10,TUR;百位不是-跳转
  2318.       JMP DIS_2
  2319. TAB:DB 0, 1,1,2,3,3,4,4,5,6,6,7,8,8,9,9  
  2320. ;;;;;;;;;;;;以上是温度程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
  2321. TABX:;5*7小字符  用于固定显示时间和温度
  2322. DB 060H, 090H, 090H, 090H, 090H, 090H, 060H, 000H   ;0
  2323. DB 020H, 060H, 020H, 020H, 020H, 020H, 070H, 000H   ;1
  2324. DB 060H, 090H, 010H, 020H, 040H, 080H, 0F0H, 000H   ;2
  2325. DB 060H, 090H, 010H, 060H, 010H, 090H, 060H, 000H   ;3
  2326. DB 020H, 060H, 0A0H, 0A0H, 0F0H, 020H, 020H, 000H   ;4
  2327. DB 0F0H, 080H, 0E0H, 090H, 010H, 090H, 060H, 000H   ;5
  2328. DB 060H, 090H, 080H, 0E0H, 090H, 090H, 060H, 000H   ;6
  2329. DB 0F0H, 010H, 010H, 020H, 040H, 040H, 040H, 000H   ;7
  2330. DB 060H, 090H, 090H, 060H, 090H, 090H, 060H, 000H   ;8
  2331. DB 060H, 090H, 090H, 070H, 010H, 090H, 060H, 000H   ;9
  2332. DB 000H, 000H, 000H, 0F0H, 000H, 000H, 000H, 000H   ;-  10
  2333. DB 080H, 030H, 040H, 040H, 040H, 040H, 030H, 000H   ;C  11
  2334. DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H   ;  空格 12
  2335. DB 000H, 000H, 000H, 000H, 060H, 060H, 000H, 000H   ;.   13
  2336. DB 000H, 060H, 060H, 000H, 060H, 060H, 000H, 000H   ;:   14
  2337. DB 000H, 000H, 080H, 000H, 000H, 080H, 000H, 000H   ;:  单冒号15
  2338. /*;程序功能:歌曲演奏        
  2339.   START1: MOV   TMOD,#00000001B; 设T0方式1
  2340.          MOV   IE,#10000010B;允许T0中断         
  2341.          MOV   DPTR,#TABLE ; 存表首地址           
  2342.   LOOP:  CLR   A           ; 清零
  2343.          MOVC  A,@A+DPTR   ; 查表               
  2344.          MOV   R1,A        ; 定时器高8位存R1     
  2345.          INC   DPTR        ; 指针加1
  2346.          CLR   A           ; 清零
  2347.          MOVC  A,@A+DPTR   ; 查表               
  2348.          MOV   R0,A        ; 定时器低8位存R0            
  2349.          ORL   A,R1        ; 进行"或"运算
  2350.          JZ    NEXT0       ; 全0为休止符
  2351.          MOV   A, R0       ;
  2352.          ANL   A, R1       ; 进行"与"运算
  2353.          CJNE  A,#0FFH,NEXT; 全1表示乐曲结束
  2354.          RET     
  2355.   NEXT:  MOV   TH0,R1      ; 装入高位定时值
  2356.          MOV   TL0,R0      ; 装入低位定时值      
  2357.          SETB  TR0         ; 启动定时器T0
  2358.          setb  tf0         ;启动定时器工作
  2359.          JMP  NEXT1        ; 转移NEXT1处
  2360.   NEXT0: CLR   TR0         ; 关闭定时器停止发音   
  2361.   NEXT1: CLR   A           ; 清零
  2362.          INC   DPTR        ; 指针加1
  2363.          MOVC  A,@A+DPTR   ; 查延时常数
  2364.          MOV   R2, A       ; 延时常数存入R2      
  2365.   LOOP1: ACALL   DDELAY     ; 调延时子程序
  2366.          DJNZ  R2, LOOP1   ; 控制延时次数         
  2367.          INC   DPTR        ; 指针加1
  2368.          JMP  LOOP         ; 转移LOOP处         
  2369.   EXT0:  MOV   TH0,R1      ; 重装定时值
  2370.          MOV   TL0,R0      ;
  2371.          CPL   BEEP        ; 反相输出
  2372.          RETI              ; 中断返回              
  2373.   DDELAY: MOV   R7,#2      ; 延时187ms
  2374.   D2:    MOV   R6,#187     ;
  2375.   D3:    MOV   R5,#248     ;
  2376.          DJNZ  R5,[        DISCUZ_CODE_1        ]nbsp;       ;
  2377.          DJNZ  R6,D3       ;
  2378.          DJNZ  R7,D2       ;
  2379.          RET               ;
  2380. TABLE:
  2381. DB  0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H,0FEH,2AH,04H,0FEH,02H,04H ;
  2382. DB  00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H ;
  2383. DB  0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H ;
  2384. DB  0FEH,0C0H,04H, 0FEH,84H,04H,0FEH,2AH,04H, 0FEH,02H,04H,0FDH,0C6H,04H               ;
  2385. DB  0FEH,98H,03H, 0FEH,98H,01H,0FEH,84H,04H, 0FEH,2AH,04H,0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FFH,0FFH   */
  2386. ;以下为公历转农历子程序
  2387. CONvert: MOV     A,time_year    ;将年月日转化为   HEX 格式  16进制
  2388.        MOV      B,#16
  2389.        DIV      AB
  2390.        MOV      CONvert_yeAr,B
  2391.        MOV      B,#10
  2392.        MUL      AB
  2393.        ADD      A,CONvert_yeAr
  2394.        MOV      CONvert_yeAr,A
  2395.        MOV      A,time_month
  2396.        MOV      C,ACC.7
  2397.        MOV    f0,C             ;f0暂存世纪标志,仅用于数据表定位
  2398.        CLR      ACC.7
  2399.        JNB      ACC.4,CON_02
  2400.       CLR      ACC.4          ;ACC.4 为 1 表示大于   10 月
  2401.        ADD      A,#10
  2402. CON_02: MOV     CONvert_mONth,A
  2403.        MOV      A,time_date;
  2404.       SWAP A
  2405.                 ANL A,#07H
  2406.                 MOV B,#10
  2407.                 MUL AB
  2408.                 MOV CONVERT_DATE,A
  2409.                 MOV A,TIME_DATE
  2410.                 ANL A,#0FH
  2411.       ADD      A,CONvert_dAte
  2412.        MOV      CONvert_dAte,A
  2413.        MOV      dptr,#mONth_dAtA  ;以下定位本年数据在表格中的位置
  2414.        MOV      A,CONvert_yeAr
  2415.        JB       f0,CON_06      ;当前为  19 世纪年跳转
  2416. ;      ADD      A,#100         ;从 19 世纪起定义表格起始年,20    世纪要加  100 年
  2417. CON_06: CLR     C
  2418.        SUBB     A,#stArt_yeAr
  2419.        MOV      B,#3           ;表格每年  3 字节
  2420.        MUL      AB
  2421.        ADD      A,dpl
  2422.        MOV      dpl,A
  2423.        MOV      A,B
  2424.        ADDC     A,dph
  2425.        MOV      dph,A
  2426.        MOV      A,#2
  2427.        MOVC     A,@A+dptr      ;读本年表格最后一字节(春节日期)
  2428.        CLR      ACC.7          ;ACC.7 是闰年第   13 个月大小,在此不用
  2429.        MOV      B,#32
  2430.        DIV      AB
  2431.        MOV      temp_Byte1,A   ;春节月份
  2432.        MOV      temp_Byte2,B   ;春节日
  2433.       ;以下计算当前日期距元旦天数
  2434.        MOV      temp_Byte3,#0  ;设距元旦天数高位为     0
  2435.        MOV      A,CONvert_mONth
  2436.        CJNE     A,#10,CON_08
  2437. CON_08: JC      CON_09         ;9 月以前日子数小于    256 天,高字节为  0(9 月份过去的整月为     8 个月)
  2438.        MOV      temp_Byte3,#1
  2439. CON_09: MOV     A,CONvert_yeAr
  2440.        ANL      A,#03h         ;ACC 为除  4 的余数
  2441.        JNZ      CON_10         ;转常年处理
  2442.        ;年除 4 余数为  0 是闰年
  2443.        MOV      A,CONvert_mONth
  2444.        LCALL   get_ruN_dAys_lOw  ;取得闰年过去月的天数的低字节
  2445.        SJMP    CON_12
  2446. CON_10: MOV    A,CONvert_mONth
  2447.        LCALL   get_dAys_lOw      ;取得常年过去月的天数的低字节
  2448. CON_12: MOV    B,CONvert_dAte
  2449.        DEC     B                 ;因为日期从  1 日起,而不是  0 日起
  2450.        ADD     A,B                ;过去的整月天数加当月天数
  2451.        MOV     temp_Byte4,A
  2452.        JNC     CON_14
  2453.        INC     temp_Byte3        ;temp_Byte3,temp_Byte4 分别为公历年过去的天数的高低字节
  2454. ;以下求春节距元旦天数,因肯定小于       256 天所以只用一字节表示
  2455. CON_14: MOV    A,temp_Byte1
  2456.        LCALL   get_dAys_lOw      ;春节不会在  3 月份,不用考虑闰年
  2457.        DEC     A                 ;因为日期从  1 日起
  2458.        ADD     A,temp_Byte2
  2459.        MOV     temp_Byte5,A      ;temp_Byte5,为春节距元旦天数
  2460.        MOV     A,CONvert_mONth
  2461.        CJNE    A,temp_Byte1,CON_20 ;转换月与春节月比较
  2462.        MOV     A,CONvert_dAte
  2463.        CJNE    A,temp_Byte2,CON_20 ;转换日与春节日比较
  2464. CON_20: JC     CON_22
  2465.        LJMP    CON_60            ;当前日大于等于春节日期,公历年与农历年同年份
  2466. CON_22: MOV    A,CONvert_yeAr    ;不到春节,农历年比公历年低一年
  2467.        JNZ     CON_24
  2468.        MOV     A,#100            ;年有效数  0-99
  2469. CON_24: DEC    A
  2470.        MOV     CONvert_yeAr,A
  2471.        MOV     A,dpl
  2472.        CLR     C
  2473.        SUBB    A,#3
  2474.        MOV     dpl,A
  2475.        JNC     CON_26
  2476.        DEC     dph               ;表格指针指向上一年
  2477. CON_26: MOV    A,temp_Byte5
  2478.        CLR     C
  2479.        SUBB    A,temp_Byte4
  2480.        MOV     temp_Byte3,A      ;temp_Byte3 中为当前日离春节的天数
  2481.        MOV     CONvert_mONth,#12 ;农历月为  12 月
  2482.        CLR     f0                ;1901-2099 年没有闰  12 月,清闰月标志
  2483.        CLR     A
  2484.        MOVC    A,@A+dptr
  2485.        ANL     A,#0f0h
  2486.        SWAP    A;
  2487.        MOV     temp_Byte4,A      ;temp_Byte4 中为闰月
  2488.        JZ      CON_30            ;没有闰月转移
  2489.        MOV    A,#2               ;有闰月,取第 13 个月天数
  2490.        MOVC    A,@A+dptr
  2491.        MOV     C,ACC.7
  2492.        MOV     A,#1
  2493.        MOVC    A,@A+dptr
  2494.        RLC     A                 ;ACC 中为最后  6 个月的大小值
  2495.        SJMP    CON_34
  2496. CON_30: MOV    A,#1
  2497.        MOVC    A,@A+dptr         ;ACC 中为最后  6 个月的大小值
  2498. CON_34: MOV    temp_Byte5,A
  2499. CON_40: MOV    A,temp_Byte5
  2500.        RRC     A
  2501.        MOV     temp_Byte5,A
  2502.        JC      CON_42
  2503.        MOV     B,#29             ;小月 29 天
  2504.        SJMP    CON_44
  2505. CON_42: MOV    B,#30             ;大月 30 天
  2506. CON_44: MOV    A,temp_Byte3
  2507.        CLR     C
  2508.        SUBB    A,B
  2509.        JZ      CON_46            ;正好够减,就是农历日   1 日
  2510.        JNC     CON_50            ;不够减一月天数,结束农历月调整
  2511.        CPL     A                 ;求补取绝对值
  2512.        INC     A
  2513. CON_46: INC    A                 ;加 1 即为农历日
  2514.        MOV     B,#10             ;转换并保存农历日,月,年
  2515.        DIV     AB
  2516.        SWAP    A
  2517.        ORL     A,B
  2518.        MOV     CONvert_dAte,A
  2519.        MOV     A,CONvert_mONth
  2520.        MOV     B,#10
  2521.        DIV     AB
  2522.        SWAP    A
  2523.        ORL     A,B
  2524.        MOV     C,f0
  2525.        MOV     ACC.7,C
  2526.        MOV     CONvert_mONth,A
  2527.       MOV      A,CONvert_yeAr
  2528.        MOV      B,#10
  2529.        DIV      AB
  2530.        SWAP     A
  2531.        ORL      A,B
  2532.        MOV      CONvert_yeAr,A
  2533.        RET                                ;结束转换 ==========================
  2534. CON_50: MOV     temp_Byte3,A            ;temp_Byte3 存减去一月后的天数
  2535.        JB       f0,CON_52               ;是闰月,前推一月,月份不减
  2536.        DEC      CONvert_mONth;
  2537. CON_52: MOV     A,CONvert_mONth
  2538.        CJNE     A,temp_Byte4,CON_54
  2539.        CPL      f0                      ;当前月与闰月相同,更改闰月标志
  2540. CON_54: SJMP    CON_40
  2541. CON_60: MOV     A,temp_Byte4            ;春节日小于当前日,农历年同公历年
  2542.        CLR      C
  2543.        SUBB     A,temp_Byte5
  2544.        MOV      temp_Byte4,A
  2545.        JNC      CON_62
  2546.        DEC      temp_Byte3              ;temp_Byte3 temp_Byte4 中为公历日离春节的天数
  2547. CON_62: MOV     CONvert_mONth,#1        ;农历月为  1 月
  2548.        CLR      A
  2549.        MOVC     A,@A+dptr
  2550.        MOV      temp_Byte5,A
  2551.        ANL      A,#0f0h
  2552.        SWAP     A;
  2553.        XCH      A,temp_Byte5            ;temp_Byte5 中为闰月,ACC  为当年农历表第一字节
  2554.        CLR      f0                      ;第一个月肯定不是闰月
  2555.        ANL      A,#0fh
  2556.        MOV      temp_Byte1,A
  2557.        MOV      A,#1
  2558.        MOVC     A,@A+dptr
  2559.        MOV      temp_Byte2,A
  2560.        ANL      A,#0f0h
  2561.        ORL      A,temp_Byte1
  2562.        SWAP     A
  2563.        MOV      temp_Byte1,A
  2564.        MOV      A,#2
  2565.        MOVC     A,@A+dptr
  2566.        MOV      C,ACC.7
  2567.        MOV      A,temp_Byte2
  2568.        ANL      A,#0fh
  2569.      SWAP     A
  2570.        MOV      ACC.3,C;
  2571.        MOV     temp_Byte2,A             ;以上 temp_Byte1,temp_Byte2 各 BIT 存农历年大小
  2572. CON_70: MOV     A,temp_Byte2
  2573.        RLC      A
  2574.        MOV      temp_Byte2,A
  2575.        MOV      A,temp_Byte1
  2576.        RLC      A
  2577.        MOV      temp_Byte1,A
  2578.        JC       CON_72
  2579.        MOV      B,#29                   ;小月 29 天处理
  2580.        SJMP     CON_74
  2581. CON_72: MOV     B,#30                   ;大月 30 天
  2582. CON_74: MOV     A,temp_Byte4
  2583.        CLR      C
  2584.        SUBB     A,B
  2585.        JNC      CON_78                  ;低字节够减跳转
  2586.        MOV     B,A                      ;低字节不够减,  B 暂存减后结果,
  2587.        MOV      A,temp_Byte3
  2588.        JZ       CON_76                  ;高字节为  0,不够减
  2589.        DEC      temp_Byte3
  2590.        MOV      temp_Byte4,B
  2591.        SJMP     CON_80
  2592. CON_76: MOV     A,temp_Byte4            ;不够减结束月调整
  2593.        LJMP     CON_46                  ;转日期加  1 后,处理并保存转换后农历年月日
  2594. CON_78: MOV     temp_Byte4,A            ;temp_Byte3 temp_Byte4 天数为减去一月后天数
  2595. CON_80: MOV     A,CONvert_mONth
  2596.        CJNE     A,temp_Byte5,CON_82
  2597.        CPL      f0                      ;当前月与闰月相同,更改闰月标志
  2598.        JNB      f0,CON_82               ;更改标志后是非闰月,月份加     1
  2599.        SJMP     CON_70
  2600. CON_82: INC     CONvert_mONth;
  2601.        SJMP     CON_70
  2602. get_dAys_lOw:
  2603.        MOVC A,@A+PC                      ;取得常年过去月的天数的低字节
  2604.        RET
  2605.        DB 0,31,59,90,120,151,181,212,243,17,48,78
  2606. get_ruN_dAys_lOw:
  2607.        MOVC A,@A+PC                      ;取得闰年过去月的天数的低字节
  2608.        RET
  2609.        DB 0,31,60,91,121,152,182,213,244,18,49,79
  2610. mONth_dAtA:
  2611. ;公历年对应的农历数据,每年三字节,
  2612. ;格式第一字节      BIT7-4 位表示闰月月份,值为        0 为无闰月,BIT3-0    对应农历第     1-4 月的大小
  2613. ;第二字节    BIT7-0 对应农历第     5-12 月大小,第三字节       BIT7 表示农历第     13 个月大小
  2614. ;月份对应的位为       1 表示本农历月大(30       天),为 0 表示小(29   天).
  2615. ;第三字节    BIT6-5 表示春节的公历月份,BIT4-0        表示春节的公历日期  
  2616. /*DB 004h,0Aeh,053h,00Ah,057h,048h,055h,026h,0Bdh,00dh,026h,050h,00dh,095h,044h; 1905
  2617. DB 046h,0AAh,0B9h,005h,06Ah,04dh,009h,0Adh,042h,024h,0Aeh,0B6h,004h,0Aeh,04Ah; 1910
  2618. DB 06Ah,04dh,0Beh,00Ah,04dh,052h,00dh,025h,046h,05dh,052h,0BAh,00Bh,054h,04eh; 1915
  2619. DB 00dh,06Ah,043h,029h,06dh,037h,009h,05Bh,04Bh,074h,09Bh,0C1h,004h,097h,054h; 1920
  2620. DB 00Ah,04Bh,048h,05Bh,025h,0BCh,006h,0A5h,050h,006h,0d4h,045h,04Ah,0dAh,0B8h; 1925
  2621. DB 002h,0B6h,04dh,009h,057h,042h,024h,097h,0B7h,004h,097h,04Ah,066h,04Bh,03eh; 1930
  2622. DB 00dh,04Ah,051h,00eh,0A5h,046h,056h,0d4h,0BAh,005h,0Adh,04eh,002h,0B6h,044h; 1935
  2623. DB 039h,037h,038h,009h,02eh,04Bh,07Ch,096h,0Bfh,00Ch,095h,053h,00dh,04Ah,048h; 1940
  2624. DB 06dh,0A5h,03Bh,00Bh,055h,04fh,005h,06Ah,045h,04Ah,0Adh,0B9h,002h,05dh,04dh; 1945
  2625. DB 009h,02dh,042h,02Ch,095h,0B6h,00Ah,095h,04Ah,07Bh,04Ah,0Bdh,006h,0CAh,051h; 1950
  2626. DB 00Bh,055h,046h,055h,05Ah,0BBh,004h,0dAh,04eh,00Ah,05Bh,043h,035h,02Bh,0B8h; 1955
  2627. DB 005h,02Bh,04Ch,08Ah,095h,03fh,00eh,095h,052h,006h,0AAh,048h,07Ah,0d5h,03Ch; 1960
  2628. DB 00Ah,0B5h,04fh,004h,0B6h,045h,04Ah,057h,039h,00Ah,057h,04dh,005h,026h,042h; 1965
  2629. DB 03eh,093h,035h,00dh,095h,049h,075h,0AAh,0Beh,005h,06Ah,051h,009h,06dh,046h; 1970
  2630. DB 054h,0Aeh,0BBh,004h,0Adh,04fh,00Ah,04dh,043h,04dh,026h,0B7h,00dh,025h,04Bh; 1975
  2631. DB 08dh,052h,0Bfh,00Bh,054h,052h,00Bh,06Ah,047h,069h,06dh,03Ch,009h,05Bh,050h; 1980
  2632. DB 004h,09Bh,045h,04Ah,04Bh,0B9h,00Ah,04Bh,04dh,0ABh,025h,0C2h,006h,0A5h,054h; 1985
  2633. DB 006h,0d4h,049h,06Ah,0dAh,03dh,00Ah,0B6h,051h,009h,037h,046h,054h,097h,0BBh; 1990
  2634. DB 004h,097h,04fh,006h,04Bh,044h,036h,0A5h,037h,00eh,0A5h,04Ah,086h,0B2h,0Bfh; 1995
  2635. DB 005h,0ACh,053h,00Ah,0B6h,047h,059h,036h,0BCh,009h,02eh,050h,00Ch,096h,045h; 2000  */

  2636. DB 04dh,04Ah,0B8h,00dh,04Ah,04Ch,00dh,0A5h,041h,025h,0AAh,0B6h,005h,06Ah,049h; 2005
  2637. DB 07Ah,0Adh,0Bdh,002h,05dh,052h,009h,02dh,047h,05Ch,095h,0BAh,00Ah,095h,04eh; 2010
  2638. DB 00Bh,04Ah,043h,04Bh,055h,037h,00Ah,0d5h,04Ah,095h,05Ah,0Bfh,004h,0BAh,053h; 2015
  2639. DB 00Ah,05Bh,048h,065h,02Bh,0BCh,005h,02Bh,050h,00Ah,093h,045h,047h,04Ah,0B9h; 2020
  2640. DB 006h,0AAh,04Ch,00Ah,0d5h,041h,024h,0dAh,0B6h,004h,0B6h,04Ah,069h,057h,03dh; 2025
  2641. DB 00Ah,04eh,051h,00dh,026h,046h,05eh,093h,03Ah,00dh,053h,04dh,005h,0AAh,043h; 2030
  2642. DB 036h,0B5h,037h,009h,06dh,04Bh,0B4h,0Aeh,0Bfh,004h,0Adh,053h,00Ah,04dh,048h; 2035
  2643. DB 06dh,025h,0BCh,00dh,025h,04fh,00dh,052h,044h,05dh,0AAh,038h,00Bh,05Ah,04Ch; 2040
  2644. DB 005h,06dh,041h,024h,0Adh,0B6h,004h,09Bh,04Ah,07Ah,04Bh,0Beh,00Ah,04Bh,051h; 2045
  2645. DB 00Ah,0A5h,046h,05Bh,052h,0BAh,006h,0d2h,04eh,00Ah,0dAh,042h,035h,05Bh,037h; 2050
  2646. DB 009h,037h,04Bh,084h,097h,0C1h,004h,097h,053h,006h,04Bh,048h,066h,0A5h,03Ch; 2055
  2647. DB 00eh,0A5h,04fh,006h,0B2h,044h,04Ah,0B6h,038h,00Ah,0Aeh,04Ch,009h,02eh,042h; 2060
  2648. DB 03Ch,097h,035h,00Ch,096h,049h,07dh,04Ah,0Bdh,00dh,04Ah,051h,00dh,0A5h,045h; 2065
  2649. DB 055h,0AAh,0BAh,005h,06Ah,04eh,00Ah,06dh,043h,045h,02eh,0B7h,005h,02dh,04Bh; 2070
  2650. DB 08Ah,095h,0Bfh,00Ah,095h,053h,00Bh,04Ah,047h,06Bh,055h,03Bh,00Ah,0d5h,04fh; 2075
  2651. DB 005h,05Ah,045h,04Ah,05dh,038h,00Ah,05Bh,04Ch,005h,02Bh,042h,03Ah,093h,0B6h; 2080
  2652. DB 006h,093h,049h,077h,029h,0Bdh,006h,0AAh,051h,00Ah,0d5h,046h,054h,0dAh,0BAh; 2085
  2653. DB 004h,0B6h,04eh,00Ah,057h,043h,045h,027h,038h,00dh,026h,04Ah,08eh,093h,03eh;   2090
  2654. DB 00dh,052h,052h,00dh,0AAh,047h,066h,0B5h,03Bh,005h,06dh,04fh,004h,0Aeh,045h;   2095
  2655. DB 04Ah,04eh,0B9h,00Ah,04dh,04Ch,00dh,015h,041h,02dh,092h,0B5h,00dh,053h,049h;   2100
  2656. ;ds1302时钟上升沿输入命令或数据,下降沿输出数据.===========================================================================
  2657. IN_1302:mov                MIAO,#00H                                ;秒赋初值     出厂日期:2010.6.25.12:00:00
  2658.              mov                FEN,#00H                                ;分赋初值
  2659.             mov                SHI,#12H                                ;时赋初值
  2660.             mov                RIQI,#025H                                ;日赋初值h
  2661.             mov                YUE,#06H                                ;月赋初值
  2662.             mov                XQI,#05H                                ;星期赋初值
  2663.             mov                NIAN,#10H                        ;年赋初值
  2664.             lcall        set1302                                ;调用初值设定子程序
  2665.             RET
  2666. ;入口参数:初始时间:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)*/
  2667. Set1302:
  2668.     CLR    T_RST
  2669.     CLR    T_CLK
  2670.     SETB   T_RST
  2671.     MOV    B,     #8EH        ;控制寄存器  10001110b
  2672.     LCALL  RTInputByte  
  2673.     MOV    B,     #00H        ;写操作前WP=0
  2674.     LCALL  RTInputByte  
  2675.     MOV    B,     #90H        ;控制寄存器  10010000b
  2676.     LCALL  RTInputByte  
  2677.     MOV    B,     #10101001b       ;充电
  2678.     LCALL  RTInputByte  
  2679.     SETB   T_CLK
  2680.     CLR    T_RST
  2681.     MOV    R0,    #MIAO;
  2682.     MOV    R7,    #7        ;秒 分 时 日 月 星期 年 共7个字节
  2683.     MOV    R1,    #80H      ;秒写地址  10000000b
  2684. S13021:   CLR    T_RST
  2685.     CLR    T_CLK
  2686.     SETB   T_RST
  2687.     MOV    B,     R1        ;写秒 分 时 日 月 星期 年   地址
  2688.     LCALL  RTInputByte  
  2689.     MOV    A,     @R0       ;写秒数据
  2690.     MOV    B,     A
  2691.     LCALL  RTInputByte  
  2692.     INC    R0
  2693.     INC    R1
  2694.     INC    R1
  2695.     SETB   T_CLK
  2696.     CLR    T_RST
  2697.     DJNZ   R7,    S13021
  2698.     CLR    T_RST
  2699.     CLR    T_CLK
  2700.     SETB   T_RST
  2701.     MOV    B,     #8EH        ;控制寄存器
  2702.     LCALL  RTInputByte  
  2703.     MOV    B,     #80H        ;控制,WP=1,写保护
  2704.     LCALL  RTInputByte  
  2705.     SETB   T_CLK
  2706.     CLR    T_RST
  2707.     RET
  2708. ;功    能:从DS1302 读时间
  2709. Get1302:      
  2710.     MOV    R0,    #MIAO;
  2711.     MOV    R7,    #7
  2712.     MOV    R1,    #81H       ;秒地址
  2713. G13021:   CLR    T_RST
  2714.     CLR    T_CLK
  2715.    SETB   T_RST
  2716.     MOV    B,     R1        ;秒 分 时 日 月 星期 年 地址
  2717.     LCALL   RTInputByte  
  2718.     LCALL   RTOutputByte
  2719.     MOV    @R0,   A         ;秒
  2720.     INC    R0
  2721.     INC    R1
  2722.     INC    R1
  2723.     SETB   T_CLK
  2724.     CLR    T_RST
  2725.     DJNZ   R7,    G13021
  2726.     RET
  2727. ;功    能:写1302一字节  (内部子程序)
  2728. RTInputByte:  
  2729.          MOV    R3,    #8                ;一个字节有八个位,移八次.
  2730. Inbit1:  MOV    A,     B
  2731.          RRC    A                                ;通过A移入CY.
  2732.          MOV    B,     A
  2733.          MOV    T_IO,  C                ;移入芯片内.
  2734.          SETB   T_CLK
  2735.          CLR    T_CLK
  2736.          DJNZ   R3,   Inbit1
  2737.          RET
  2738. ;功    能:读1302一字节
  2739. RTOutputByte:
  2740.         MOV    R3,    #8                ;一个字节有八个位,移八次.
  2741. Out_1:  MOV    C, T_IO            ;从芯片内移到CY
  2742.         RRC    A                        ;通过CY移入A.
  2743.         SETB   T_CLK
  2744.         CLR    T_CLK
  2745.         DJNZ   R3,Out_1
  2746.         RET

  2747.                   ;=================================================  
  2748. ;以下子程序用于从当前公历日期,推算星期,
  2749. ;入口:time_yeAr,time_month ,time_date ,定义公历年 月  日,BCD   码,其中月的
  2750. ;BIT7 表示世纪,0表示20 世纪,1表示 19 世纪,出口   time_week, 0-6 表示星期日-星期六,程序不改变入口数据
  2751. ;使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3
  2752. GetWeek:  MOV         A,NIAN
  2753.            MOV        B,#16
  2754.            DIV        AB
  2755.            MOV        temp_Byte1,B
  2756.            MOV        B,#10
  2757.            MUL        AB
  2758.            ADD        A,temp_Byte1
  2759.            MOV        temp_Byte1,A      ;temp_Byte1=年
  2760.            MOV        A,YUE
  2761.            JB         ACC.7,getw02
  2762.       MOV      A,#100
  2763.        ADD      A,temp_Byte1
  2764.        MOV     temp_Byte1,A             ;20世纪年+100
  2765.        MOV      A,YUE
  2766.        CLR      ACC.7
  2767. getw02: JNB     ACC.4,getw04
  2768.        ADD      A,#10
  2769.        CLR      ACC.4
  2770. getw04: MOV     temp_Byte2,A            ;temp_Byte2=月
  2771.        MOV      A,RIQI
  2772.        MOV      B,#16
  2773.        DIV      AB
  2774.        MOV      temp_Byte3,B
  2775.        MOV      B,#10
  2776.        MUL      AB
  2777.        ADD      A,temp_Byte3
  2778.        MOV      temp_Byte3,A            ;temp_Byte3=日
  2779.          MOV    A,temp_Byte1;
  2780.        ANL      A,#03h
  2781.        JNZ      getw10                  ;非闰年转移
  2782.        MOV      A,temp_Byte2
  2783.        CJNE     A,#3,getw06
  2784. getw06: JNC     getw10                  ;月大于  2 转移
  2785.        DEC      temp_Byte3              ;份小于等于   2,又是闰年,日减 1
  2786. getw10: MOV     A,temp_Byte2;
  2787.        LCALL    get_CorreCt             ;取月校正表数据
  2788.        ADD      A,temp_Byte1
  2789.        MOV      B,#7
  2790.        DIV      AB                      ;B放年加校正日数之和后除7 的余数 不先做这一步;有可能数据溢出
  2791.        MOV      A,temp_Byte1
  2792.        ANL      A,#0fCh
  2793.        RR       A
  2794.       RR        A                       ;以上年除  4 即闰年数
  2795.        ADD      A,B
  2796.        ADD      A,temp_Byte3
  2797.        MOV      B,#7
  2798.        DIV      AB
  2799.        MOV     XQI,B      ; time_week,B
  2800.        RET
  2801. get_COrreCt:
  2802.        MOVC     A,@A+PC
  2803.        RET
  2804.        DB 0,3,3,6,1,4,6,2,5,0,3,5

  2805.           END

  2806.         
复制代码
nbsp;           ;保持16微秒以上
       RRC  A  ;把字节DATA分成8个BIT环移给C
       MOV  DQ,  C        ;写入一个BIT
       MOV  R3,#23
       DJNZ R3,
  1. ;***************引脚定义,根据使用不同的管脚而改动*************
  2. ;农历,星期,1302程序由网上下载
  3. ABCD    EQU    P2      ;行扫描0-7
  4. SEG     EQU    P1.1    ; 红
  5. SER     EQU    P1.0    ;内容发送绿
  6. SRCLK   EQU    P1.2    ;串行CP端
  7. RCLK    EQU    P1.3    ;输出CP端
  8. EN      EQU    P1.4    ;EN为138使能端.高电平关闭显示;低电平显示
  9. DQ      EQU    P3.6    ;温度18b20
  10. BEEP    EQU    P3.7           ;蜂鸣器
  11. AN      EQU    P0.1           ;中间按键
  12. ANS     EQU    P0.0           ;上按键
  13. ANX     EQU    P0.4           ;下按键
  14. ANZ     EQU    P0.2           ;左按键
  15. ANY     EQU    P0.3           ;右按键
  16. T_CLK   EQU    P0.7    ;实时时钟时钟线引脚
  17. T_IO    EQU    P0.6    ;实时时钟数据线引脚
  18. T_RST   EQU    P0.5    ;实时时钟复位线引脚
  19. ;温度存放地址
  20. A_BIT   EQU  22H     ;存放个位数变量
  21. B_BIT   EQU  21H     ;存放十位数变量
  22. C_BIT   EQU  24H     ;存放 小数变量
  23. D_BIT   EQU  20H     ;存放 百 位数变量
  24. FLAG    EQU  26H     ;DS18B20是否存在标志
  25. XSD     EQU  23H     ;点
  26. WDFH    EQU  25H     ;℃
  27. WDGW    EQU  27H        ;温度高位值
  28. WDDW    EQU  28H        ;温度低位值
  29. QUSHU   EQU  28H
  30. QUSHU1  EQU  08H
  31. QUSHU2  EQU  09H
  32. LSTZSJ1 EQU  0AH
  33. LSTZSJ  EQU  0BH
  34. MIAO            EQU         20H                                ;秒
  35. FEN            EQU         21H                                ;分
  36. SHI            EQU         22H                                ;时
  37. RIQI            EQU         23H                                ;日
  38. YUE            EQU         24H                                ;月  ACC.7=0为2000年
  39. XQI            EQU         25H                                ;星期
  40. NIAN            EQU         26H                                ;年   
  41. start_year     EQU     01;    定义查询表起始年份,01--199 表示 1901-2099 年
  42. ;以下三单元为需转换的公历日期          是子程序的入口数据
  43. time_year      EQU    NIAN
  44. time_month     EQU    YUE    ;BIT7 表示世纪,为  1 表示 19 世纪,为 0 表示 20 世纪
  45. time_date      EQU    RIQI
  46. ;以下三单元存转换后农历日期         与入口单元重叠,如要保留入口信息,请重定义出口地址
  47. CONvert_yeAr   DATA   3Fh
  48. CONvert_mONth   DATA   3Eh    ;BIT7 为 1 表示闰月
  49. CONvert_dAte   DATA    3Dh
  50. temp_Byte4     DATA    3Bh
  51. temp_Byte5     DATA    3Ch
  52. temp_Byte1  EQU  20H
  53. temp_Byte2  EQU  21H
  54. temp_Byte3  EQU  22H
  55. ;*************************************************************        
  56. ;*********************中断入口程序****************************
  57.         ORG     0000H
  58.         LJMP    MAIN
  59.     ;    ORG     0003H
  60.    ;     RETI
  61.     ;    ORG     000BH   ; 定时器 T0中断入口
  62.      ;   JMP     EXT0    ; 跳至T0中断子程序   
  63.      ;   ORG     0013H
  64.      ;   RETI
  65.      ;;   ORG     001BH
  66.      ;   RETI
  67.     ;    ORG     0023H
  68.     ;    RETI
  69. ;***************主程序****************************************/
  70. MAIN: MOV    SP,#69H          ;堆栈首址
  71.       LCALL BEEP_BZ
  72.       LCALL AN_DEL
  73.       LCALL BEEP_BZ           ;开机鸣响2声
  74.       LCALL RE_TEMP        ;对DS18B20初始化及读取
  75.                 LCALL GET1302 ;读时间
  76.                 MOV A,MIAO
  77.                 JNB ACC.7,STRAT   ;如果秒最高位是1初始化时钟
  78.           LCALL IN_1302         ;时钟芯片初始化
  79. STRAT: ; MOV    SP,#69H          ;堆栈首址
  80.        ; MOV    R0,#30H          ;初使化寄存显示单元
  81.        ; MOV    R1,#74           ;30H-单元清零
  82.        ; MOV    A,#0
  83. ST:    ; MOV    @R0,A
  84.        ; INC    R0
  85.        ; DJNZ   R1,ST

  86. ST1:
  87.                 LCALL  Get1302                   ;读取时间
  88.       LCALL  XSSJ           ;时间数据转换
  89.                 LCALL  PLAY1                          ;显示时间
  90.                 MOV A,MIAO          ;如果秒=30显示滚动日期
  91.                 CJNE A,#30H,ST2
  92.                 LCALL GDRQ
  93. ST2:  JNB ANZ,WD                 ;按下左键调用温度显示
  94.   ;    JNB ANY,YYUE         ;按下右键调用音乐
  95.       JNB ANX,G_DRQ          ;按下下键调用滚动显示日历
  96.                 JNB AN,TZSJ   ;按下中间按键调用调时
  97.                 JMP    ST1
  98. ;*****************************
  99. G_DRQ:LCALL GDRQ
  100.       JMP ST1
  101. ;*****************************************************
  102. WD:   LCALL AN_DEL
  103.       JB ANZ,WD_OUT
  104.       LCALL BEEP_BZ
  105. WD_1: LCALL  RE_TEMP        ;读取温度
  106.       LCALL   TURN          ;转化温度子程序        
  107.       LCALL  XSWD           ;温度数据转换
  108.                 LCALL  PLAY                          ;显示
  109.                 JB ANZ,WD_1
  110.                 LCALL AN_DEL
  111.                 LCALL BEEP_BZ
  112.             JNB ANZ,WDOUT
  113. WD_OUT:RET
  114. GDRQ: LCALL  Get1302                   ;读取时间
  115.       LCALL   RQFL    ;调用日期分离程序
  116.       LCALL   L30_
  117.       RET
  118. WDOUT:LJMP ST1
  119. ;*******************************************调整时间程序*************
  120. TZSJ:
  121.          LCALL AN_DEL
  122.                JNB AN,$
  123.               LCALL BEEP_BZ
  124. TZSJ_1:  LCALL S_NIAN  ;显示调年
  125.          JNB ANS, N_J1          ;年+1
  126.                JNB ANX,N_1            ;年-1
  127.         JNB ANY,TZ_YUE  ;调月
  128.         JNB AN,TZSJOUT;确认
  129.              JNB ANZ, TZ_NOUT
  130.          JMP TZSJ_1
  131. TZSJOUT:;LCALL GetWeek
  132. LCALL Set1302
  133.             LCALL BEEP_BZ
  134. TZ_NOUT:        LJMP ST1
  135. N_J1:  LCALL AN_DEL  ;年+1
  136.        LCALL BEEP_BZ
  137.       LCALL NIAN_J1
  138.       LJMP TZSJ_1
  139. N_1:  LCALL AN_DEL ;年-1
  140.               LCALL BEEP_BZ
  141.       LCALL NIAN_1
  142.       LJMP TZSJ_1
  143. ;***************************************
  144. Y_J1:  LCALL AN_DEL;月+1
  145.               LCALL BEEP_BZ
  146.       LCALL YUE_J1
  147.       LJMP TZ_YUE1
  148. Y_1:  LCALL AN_DEL ;月-1
  149.               LCALL BEEP_BZ
  150.       LCALL YUE_1
  151.       LJMP TZ_YUE1
  152. ;*********
  153. TZ_YUE: LCALL AN_DEL
  154.       JNB ANY,$
  155.    LCALL BEEP_BZ
  156. TZ_YUE1: LCALL S_YUE;显示调月
  157.          JNB ANS,Y_J1;月+1
  158.          JNB ANX,Y_1;月-1
  159.          JNB ANY,TZ_RIQI;调日期
  160.          JNB AN,TZ_YUEOUT
  161.            JNB ANZ, TZ_YOUT
  162.        JMP TZ_YUE1
  163. TZ_YUEOUT:LCALL GetWeek
  164. LCALL SET1302
  165.   LCALL BEEP_BZ
  166. TZ_YOUT:LJMP ST1
  167. ;***************************************
  168. R_J1:  LCALL AN_DEL;月+1
  169.               LCALL BEEP_BZ
  170.       LCALL RIQI_J1
  171.       LJMP TZ_RIQI1
  172. R_1:  LCALL AN_DEL ;月-1
  173.               LCALL BEEP_BZ
  174.       LCALL RIQI_1
  175.       LJMP TZ_RIQI1
  176. ;*********
  177. TZ_RIQI: LCALL AN_DEL
  178.       JNB ANY,$
  179.    LCALL BEEP_BZ
  180. TZ_RIQI1: LCALL S_RIQI;显示调日期
  181.          JNB ANS,R_J1;日期+1
  182.          JNB ANX,R_1;日期-1
  183.          JNB ANY,TZ_SHI;
  184.          JNB AN,TZ_RIQIOUT
  185.               JNB ANZ, TZ_ROUT
  186.         JMP TZ_RIQI1
  187. TZ_RIQIOUT:;LCALL GetWeek
  188. LCALL SET1302
  189.   LCALL BEEP_BZ
  190. TZ_ROUT:LJMP ST1
  191. ;***************************************
  192. S_J1:  LCALL AN_DEL;时+1
  193.               LCALL BEEP_BZ
  194.       LCALL SHI_J1
  195.       LJMP TZ_SHI1
  196. S_1:  LCALL AN_DEL ;时-1
  197.               LCALL BEEP_BZ
  198.       LCALL SHI_1
  199.       LJMP TZ_SHI1
  200. ;*********
  201. TZ_SHI: LCALL AN_DEL
  202.       JNB ANY,$
  203.    LCALL BEEP_BZ
  204. TZ_SHI1: LCALL S_SHI;显示调时
  205.          JNB ANS,S_J1;时+1
  206.           JNB ANX,S_1;时-1
  207. TZ_SHI4:JNB ANY,TZ_FEN
  208.         JNB AN,TZ_SHIOUT
  209.           JNB ANZ, TZ_SOUT
  210.         JMP TZ_SHI1
  211. TZ_SHIOUT:;LCALL GetWeek
  212. LCALL SET1302
  213.   LCALL BEEP_BZ
  214. TZ_SOUT: LJMP ST1
  215. ;*********
  216. TZ_FEN: LCALL AN_DEL
  217.       JNB ANY,$
  218.    LCALL BEEP_BZ
  219. TZ_FEN1: LCALL S_FEN;显示调分
  220.          JNB ANS,F_J1;分+1
  221.           JNB ANX,F_1;分-1
  222. ;TZ_RIQI4:JNB ANY,TZ_FEN;
  223.         JNB AN,TZ_FENOUT
  224.         JNB ANZ, TZ_FOUT
  225.         JMP TZ_FEN1
  226. TZ_FENOUT:MOV MIAO,#0
  227. ;LCALL GetWeek
  228.   LCALL SET1302
  229.   LCALL BEEP_BZ
  230. TZ_FOUT:LJMP ST1
  231. ;***************************************
  232. F_J1:  LCALL AN_DEL;时+1
  233.               LCALL BEEP_BZ
  234.       LCALL FEN_J1
  235.       LJMP TZ_FEN1
  236. F_1:  LCALL AN_DEL ;时-1
  237.               LCALL BEEP_BZ
  238.       LCALL FEN_1
  239.       LJMP TZ_FEN1
  240. ;***************************************************
  241. ;YYUE:   LCALL START1  ;调用音乐
  242. ;        RET
  243. SHIJ:   LCALL IN_1302 ;调用时间初始化
  244.         RET
  245. AN_DEL: MOV R6,#0
  246. AN_DEL1:LCALL DEL
  247.         DJNZ R6,AN_DEL1
  248.                   RET
  249. ;********************调整年月日程序*********************************/=======================================================================
  250. S_NIAN:  MOV 40H,#52    ;显示调年
  251.                   MOV 41H,#30
  252.                   MOV A,NIAN
  253.                   ANL A,#0FH
  254.                   MOV 43H,A
  255.                   MOV A,NIAN
  256.                   SWAP A
  257.                   ANL A,#0FH
  258.                   MOV 42H,A
  259.                   MOV 2DH,#0
  260.                   MOV QUSHU,#40H
  261.               LCALL  LINE_88
  262.         RET               
  263. S_YUE:  MOV 40H,#52    ;显示调月
  264.                   MOV 41H,#31
  265.                   MOV A,YUE
  266.                   ANL A,#0FH
  267.                   MOV 43H,A
  268.                   MOV A,YUE
  269.                   SWAP A
  270.                   ANL A,#0FH
  271.                   MOV 42H,A
  272.                   MOV 2DH,#0
  273.                   MOV QUSHU,#40H
  274.               LCALL  LINE_88
  275.         RET               
  276. S_RIQI:  MOV 40H,#52    ;显示调日期
  277.                   MOV 41H,#32
  278.                   MOV A,RIQI
  279.                   ANL A,#0FH
  280.                   MOV 43H,A
  281.                   MOV A,RIQI
  282.                   SWAP A
  283.                   ANL A,#0FH
  284.                   MOV 42H,A
  285.                   MOV 2DH,#0
  286.                   MOV QUSHU,#40H
  287.               LCALL  LINE_88
  288.         RET               
  289. S_SHI:  MOV 40H,#52    ;显示调时
  290.                   MOV 41H,#53
  291.                   MOV A,SHI
  292.                   ANL A,#0FH
  293.                   MOV 43H,A
  294.                   MOV A,SHI
  295.                   SWAP A
  296.                   ANL A,#0FH
  297.                   MOV 42H,A
  298.                   MOV 2DH,#0
  299.                   MOV QUSHU,#40H
  300.               LCALL  LINE_88
  301.         RET               
  302. S_FEN:  MOV 40H,#52    ;显示调分
  303.                   MOV 41H,#54
  304.                   MOV A,FEN
  305.                   ANL A,#0FH
  306.                   MOV 43H,A
  307.                   MOV A,FEN
  308.                   SWAP A
  309.                   ANL A,#0FH
  310.                   MOV 42H,A
  311.                   MOV 2DH,#0
  312.                   MOV QUSHU,#40H
  313.               LCALL  LINE_88
  314.         RET               
  315. ;;;;;;;;;;;;;;;;;;;;
  316. FEN_J1:MOV LSTZSJ1,FEN;分+1程序
  317. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  318. INC LSTZSJ;月+1
  319. MOV A,LSTZSJ
  320. CJNE A,#60,FEN_J12;小时60清0
  321. MOV LSTZSJ,#0
  322. FEN_J12:
  323. LCALL TSSJTZ1;数据调整,16到10进制
  324. MOV FEN,LSTZSJ1
  325. RET
  326. FEN_1: MOV LSTZSJ1,FEN;分-1程序
  327. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  328. MOV A,LSTZSJ
  329. CJNE A,#0,FEN_12  ;分是0加60
  330. MOV LSTZSJ,#60
  331. FEN_12:DEC LSTZSJ
  332. LCALL TSSJTZ1;数据调整,16到10进制
  333. MOV FEN,LSTZSJ1
  334. RET
  335. ;;;;
  336. SHI_J1:MOV LSTZSJ1,SHI;小时+1程序
  337. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  338. INC LSTZSJ;月+1
  339. MOV A,LSTZSJ
  340. CJNE A,#24,SHI_J12;小时24清0
  341. MOV LSTZSJ,#0
  342. SHI_J12:
  343. LCALL TSSJTZ1;数据调整,16到10进制
  344. MOV SHI,LSTZSJ1
  345. RET
  346. SHI_1: MOV LSTZSJ1,SHI;小时-1程序
  347. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  348. MOV A,LSTZSJ
  349. CJNE A,#0,SHI_12  ;小时是0加24
  350. MOV LSTZSJ,#24
  351. SHI_12:DEC LSTZSJ
  352. LCALL TSSJTZ1;数据调整,16到10进制
  353. MOV SHI,LSTZSJ1
  354. RET
  355. ;;;;  
  356. RIQI_J1:MOV LSTZSJ1,RIQI;日+1程序
  357. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  358. INC LSTZSJ;月+1
  359. MOV A,LSTZSJ
  360. CJNE A,#32,RIQI_J12;日是32清0
  361. MOV LSTZSJ,#1
  362. RIQI_J12:
  363. LCALL TSSJTZ1;数据调整,16到10进制
  364. MOV RIQI,LSTZSJ1
  365. RET
  366. RIQI_1: MOV LSTZSJ1,RIQI;日-1程序
  367. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  368. MOV A,LSTZSJ
  369. CJNE A,#1,RIQI_12  ;日是1加32
  370. MOV LSTZSJ,#32
  371. RIQI_12:DEC LSTZSJ
  372. LCALL TSSJTZ1;数据调整,16到10进制
  373. MOV RIQI,LSTZSJ1
  374. RET
  375. ;;;;
  376. YUE_J1:MOV LSTZSJ1,YUE;月+1程序
  377. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  378. INC LSTZSJ;月+1
  379. MOV A,LSTZSJ
  380. CJNE A,#13,YUE_J12;月是13清0
  381. MOV LSTZSJ,#1
  382. YUE_J12:
  383. LCALL TSSJTZ1;数据调整,16到10进制
  384. MOV YUE,LSTZSJ1
  385. RET
  386. YUE_1: MOV LSTZSJ1,YUE;月-1程序
  387. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  388. MOV A,LSTZSJ
  389. CJNE A,#1,YUE_12
  390. MOV LSTZSJ,#13
  391. YUE_12:DEC LSTZSJ
  392. LCALL TSSJTZ1;数据调整,16到10进制
  393. MOV YUE,LSTZSJ1
  394. RET

  395. NIAN_J1:MOV LSTZSJ1,NIAN;年+1程序
  396. LCALL TSSJTZ   ;;数据调整,10到16进制如21:00100001转为 21:00010101
  397. INC LSTZSJ;年+1
  398. MOV A,LSTZSJ
  399. CJNE A,#100,NIAN_J12;年是100清0
  400. MOV LSTZSJ,#01
  401. NIAN_J12:
  402. LCALL TSSJTZ1;数据调整,16到10进制
  403. MOV NIAN,LSTZSJ1
  404. RET
  405. NIAN_1: ;CJNE A,#13H,SMAJ_QR  
  406. MOV LSTZSJ1,NIAN;年-1程序
  407. LCALL TSSJTZ;;数据调整,10到16进制如21:00100001转为 21:00010101
  408. MOV A,LSTZSJ
  409. CJNE A,#1,NIAN_12
  410. MOV LSTZSJ,#100
  411. NIAN_12:DEC LSTZSJ
  412. LCALL TSSJTZ1;数据调整,16到10进制
  413. MOV NIAN,LSTZSJ1
  414. RET
  415. ;;;;;;;;;;;;;
  416. TSSJTZ:MOV A,LSTZSJ1;数据调整,10到16进制如21:00100001转为 21:00010101
  417. ANL A,#0FH
  418. MOV LSTZSJ,A
  419. MOV A,LSTZSJ1
  420. SWAP A
  421. ANL A,#0FH
  422. MOV B,#10
  423. MUL AB
  424. ADD A,LSTZSJ
  425. MOV LSTZSJ,A
  426. RET
  427. TSSJTZ1:MOV A,LSTZSJ ;数据调整,16到10进制
  428. MOV B,#10
  429. DIV AB
  430. SWAP A
  431. MOV LSTZSJ,A
  432. MOV A,B
  433. ORL A,LSTZSJ
  434. MOV LSTZSJ1,A
  435. RET                                          ;*/
  436. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  437. LINE_88 :  MOV    2BH,#8      ;扫描的行数,共8行
  438. FF2:      LCALL  LINE_11       ;扫描显示1行子程序
  439.          DJNZ   2BH,FF2            ;扫描下一行
  440.          MOV   2DH,#0
  441.          RET
  442. ;*********扫描显示一行子程序********************
  443. LINE_11: LCALL MSTR_YD_
  444.                    MOV 30H,#0
  445.                    MOV 31H,#0
  446.              LCALL  SEND_11        ;发送串行口子程序
  447.         LCALL  XTH         ;选通行子程序
  448.                    LCALL  DL22US
  449.                    INC 2DH
  450.         RET

  451. SEND_11: MOV  R0,#30H
  452.         MOV  R1,#35H
  453.         MOV  R5,#4                ;一行有2个字节;如每次显示字数不同要作相应改动
  454. LQ_11:   MOV  R2,#8                ;每个字节有5位
  455.         MOV  A,@R0                ;将显存的字节的单元移入
  456.                 MOV  R6,A
  457.         MOV  A,@R1                ;将显存的字节的单元移入
  458.                 MOV  R7,A
  459.         LCALL  DD_1                ;调用显示一个字节的子程序
  460.         INC  R0                        ;指向下一个显存的单元
  461.         INC  R1                        ;指向下一个显存的单元
  462.         DJNZ R5,LQ_11                ;2个字节全部移入了没有,未继续
  463.         RET                                                        ;
  464. ;*************************************** 日期分离程序====================================
  465. RQFL:    MOV 40H,#12
  466.          MOV 41H,#12
  467.                         MOV 42H,#12
  468.                         MOV 43H,#12
  469.          MOV A,YUE
  470.          JB ACC.7,RQFL1
  471.          MOV 44H,#2
  472.          MOV 45H,#0
  473.          JMP RQFL3
  474. RQFL1:  MOV 44H,#1
  475.         MOV 45H,#9
  476. RQFL3:
  477.       MOV A,NIAN
  478.       ANL A,#0FH
  479.       MOV 47H,A
  480.       MOV A,NIAN
  481.       SWAP A
  482.       ANL A,#0FH
  483.       MOV 46H,A
  484.                 MOV 48H,#30  ;显示年
  485.       MOV A,YUE
  486.       ANL A,#0FH
  487.       MOV 4AH,A
  488.       MOV A,YUE
  489.       SWAP A
  490.       ANL A,#03H
  491.                 JZ  YUE_S_1
  492. YUE_S_2:MOV 49H,A
  493. YUE_S_3:        MOV 4BH,#31  ;显示 月
  494.       MOV A,RIQI
  495.       ANL A,#0FH
  496.       MOV 4DH,A
  497.       MOV A,RIQI
  498.       SWAP A
  499.       ANL A,#03H
  500.                 JZ RIQI_S_1
  501. RIQI_S_2:MOV 4CH,A
  502. RIQI_S_3:MOV 4EH,#32  ;显示 日
  503.                 MOV 4FH,#12
  504.                 MOV 50H,#16         ;显示星期
  505.                 MOV 51H,#17
  506.                 MOV 52H,#12
  507.                 LCALL GetWeek
  508.       MOV A,XQI
  509.                 ANL A,#07H
  510.             CJNE A,#0,XQ_1
  511.                  MOV  53H,#32
  512.                  JMP  XQ_OUT
  513. RIQI_S_1:MOV 4CH,#12
  514.          JMP RIQI_S_3
  515. YUE_S_1: MOV 49H,#12
  516.          JMP YUE_S_3
  517. XQ_1:  ADD A,#41
  518.        MOV 53H,A
  519. XQ_OUT:
  520.                 MOV 54H,#12  ;空格
  521.                 LCALL  RE_TEMP        ;读取温度
  522.       LCALL   TURN          ;转化温度子程序
  523.       MOV 55H,#15    ;T
  524.              MOV 56H,#14     ;:
  525.                 MOV 57H,20H            ;温度百位
  526.                 MOV 58H,21H             ;温度十位
  527.                 MOV 59H,22H                  ;温度个位
  528.                 MOV 5AH,#13                  ;小数点
  529.                 MOV 5BH,24H                  ;温度小数位
  530.                 MOV 5CH,#11                  ;℃符号
  531.                 MOV 5DH,#12
  532.                 MOV 5EH,#33      ;农
  533.                 MOV 5FH,#34                  ;历
  534.                 LCALL  Get1302
  535.                 LCALL   CONvert  ;调用公历转农历程序
  536.                 MOV A,CONvert_mONth
  537.                 JNB ACC.7,RQFL4
  538.                 MOV 60H,#51
  539.                 JMP RQFL5
  540. RQFL4:MOV 60H,#12
  541. RQFL5:LCALL  NL_YUE    ;调用农历月份
  542.                 MOV 62H,#31 ;显示月
  543.                 LCALL NL_RIQI
  544.                 MOV 65H,#12
  545.                 MOV 66H,#12
  546.                 MOV 67H,#12
  547.                 MOV 68H,#12
  548.         ;        MOV 69H,#12
  549. RQFLB:  RET
  550. ;***********************
  551. NL_YUE:  MOV  A,        CONvert_mONth        ;农历月
  552.        ANL A,#1FH
  553.                 JNB ACC.4,NL_RIQI0
  554.                 ANL A,#0FH
  555.                 ADD A,#10                                                         
  556. NL_RIQI0: CJNE A,#1,NL_YUE1
  557.                  MOV  61H,#35
  558.                  JMP  NL_YOUT
  559. NL_YUE1:    CJNE A,#10,NL_YUE2
  560.          MOV  61H,#39
  561.                  JMP  NL_YOUT
  562. NL_YUE2:         CJNE A,#11,NL_YUE3
  563.          MOV  61H,#37
  564.                  JMP  NL_YOUT
  565. NL_YUE3:         CJNE A,#12,NL_YUE4
  566.          MOV 61H,#38
  567.                  JMP NL_YOUT
  568. NL_YUE4:        ADD A,#41
  569.          MOV 61H,A
  570. NL_YOUT: RET
  571. ;***************
  572. NL_RIQI:MOV A, CONvert_dAte  ;农历日
  573.                   SWAP A
  574.                   ANL A,#0FH
  575.                   CJNE A,#0,NL_RIQI1
  576.                   MOV 63H,#36  ;显示 初
  577.                   JMP NL_ROUT
  578. NL_RIQI1:CJNE A,#1,NL_RIQI2
  579.          MOV 63H,#39  ;显示 十
  580.                         JMP NL_ROUT
  581. NL_RIQI2:CJNE A,#2,NL_RIQI3
  582.          MOV 63H,#40  ;显示 二十
  583.                         JMP NL_ROUT
  584. NL_RIQI3:CJNE A,#3,NL_ROUT
  585.          MOV 63H,#41  ;显示 三十
  586.                         JMP NL_ROUT
  587. NL_ROUT:MOV A, CONvert_dAte  ;农历日
  588.         ANL A,#0FH
  589.                   CJNE A,#0,NL_RIQI4
  590.                   MOV 64H,#39  ;显示 十
  591.                   JMP NL_RIQI5
  592. NL_RIQI4:ADD A,#41
  593.          MOV 64H,A
  594. NL_RIQI5:        RET
  595.         
  596. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
  597. ;;;;;;;;;;;;;;;;;;;;;;;
  598. L30_:    MOV  2DH,#0
  599.          MOV  QUSHU,#40H
  600.          MOV    2FH,#37       ;共有多少个半角字符,一个汉字等于两个字符,个数值为实际字数*2+屏长度数
  601. HHH_:    LCALL  L31_           ;. 扫描一个字节
  602.          DJNZ   2FH,HHH_           ;字数没完继续
  603.          RET
  604. L31_:     MOV   B, #1     ;每次移入内存单元的数据要左移次数次值         ,从第一开始。
  605. II_:      MOV   29H,#5    ;左移速度
  606. III_:   LCALL L32_     ;扫描显示1帧
  607.          DJNZ  29H,III_        ;速度没完继续
  608.          INC   B                        ;左移次数+1
  609.          MOV   A,#9
  610.          CJNE  A,B,II_ ;如果B中的数超过8就完成1个字节的8次左移显示,否则继续循环.
  611.               INC QUSHU       ;日期数据+1---5CH→
  612.          RET

  613. L32_:     MOV  2BH,#8      ;扫描的行数,共8行
  614. JJ_:      LCALL  L33_     ;扫描显示1行子程序
  615.          INC 2DH
  616.           DJNZ   2BH,JJ_        ;8行没完继续
  617.               MOV  2DH,#0 ;8行完成后再从0行开始扫描
  618.          RET
  619. L33_:     MOV    2EH,B         ;显示内容要左移几次数再显示的赋值给2EH单元
  620.          LCALL  SEND_YD        ;发送串行口子程序
  621.          LCALL  XT_H          ;选通行子程序
  622.          LCALL  MSTR_YD_        ;将显示内容移入内存单元30H→
  623. EE_:      LCALL  ZY
  624.          DJNZ   2EH,EE_
  625.          LCALL  ZYXZ        ;左移速度同步修正
  626.          RET
  627. MSTR_YD_:SETB RS1 ;R0,R1-数据存放起始地址,2DH行数据,R3-21H,22H临时数据,R4-每屏的字节数, ,20H日期数据起始地址
  628.         SETB RS0                  
  629.         MOV    R0,#30H
  630.              MOV    R1,#35H
  631.         MOV    R4,#5            ;每幕显示的字节数加1
  632. BB_YD_: LCALL L_SHUJU
  633.         MOV     @R0,A
  634.         MOV     @R1,A
  635.         INC    QUSHU           ;加1,移到下一个字节的对应位置
  636.              INC    R0
  637.              INC    R1
  638.         DJNZ   R4,BB_YD_
  639.                   MOV A,QUSHU
  640.                   CLR C
  641.                   SUBB A,#5
  642.                   MOV QUSHU,A
  643.              CLR RS1
  644.              CLR RS0
  645.         RET
  646. ;;;使用R0,R1,R6,R7,B,2DH
  647. L_SHUJU: MOV DPTR,#TAB10
  648.         MOV QUSHU1,R0
  649.         MOV QUSHU2,R1
  650.         MOV R6,B
  651.         MOV R0,QUSHU
  652. L_SHU:   MOV A,@R0
  653.         MOV B,#8
  654.         MUL AB
  655.         MOV R7,A
  656.         MOV A,DPH
  657.         ADD A,B
  658.         MOV DPH,A
  659.         MOV A,R7
  660.         MOV B,2DH
  661.         ADD A,B
  662.         MOVC A,@A+DPTR
  663.         MOV R0,QUSHU1
  664.         MOV R1,QUSHU2
  665.         MOV B,R6
  666.         RET
  667. ;*****************************发送数据到串口子程序*****************************************************/
  668. SEND_YD:   MOV   R0,#30H
  669.         MOV   R5,#4        ;如每次显示字数不同要作相应改动
  670. LQ_YD:     CLR   C                        ;清C方便每个字节的移动
  671.             MOV   R2,#8                ;每个字节有8位
  672.         MOV   A,@R0                ;将显存的字节的单元移入A
  673.             CPL   A                ;取反
  674.         LCALL  DD1_YD                ;调用显示一个字节的子程序
  675.         INC  R0                        ;指向下一个显存的单元
  676.         DJNZ R5,LQ_YD                ;8个字节全部移入了没有,未继续
  677.         RET
  678. DD1_YD:    CLR  SRCLK                ;清串行CP端
  679.         RLC  A                        ;将每个字节移位
  680.    ;     MOV  SER,C                ;将移入C的位移入信号端
  681.                    MOV  SEG,C
  682.         SETB SRCLK                ;触发串行CP端
  683.         DJNZ R2,DD1_YD                ;每个字节位移8次够了没有?
  684.         RET
  685. ;*******选通行子程序***2BH行数据*********************************************************************************/
  686. XT_H:     CLR   RCLK                ;将输出CP变为低电平为上升沿作准备
  687.              SETB  EN               ;将使能端变为高电平为下降沿作准备
  688.                  MOV  R5,2BH
  689.                  CJNE R5,#7,HSM_1
  690.                  MOV  ABCD,#11111110B
  691.                  JMP  XTH_OUT
  692. HSM_1:    CJNE R5,#6,HSM_2
  693.          MOV  ABCD,#11111101B
  694.                  JMP  XTH_OUT
  695. HSM_2:         CJNE R5,#5,HSM_3
  696.          MOV  ABCD,#11111011B
  697.                  JMP  XTH_OUT
  698. HSM_3:         CJNE R5,#4,HSM_4
  699.          MOV ABCD,#11110111B
  700.                  JMP XTH_OUT
  701. HSM_4:         CJNE R5,#3,HSM_5
  702.          MOV ABCD,#11101111B
  703.                  JMP XTH_OUT
  704. HSM_5:    CJNE R5,#2,HSM_6
  705.          MOV ABCD,#11011111B
  706.                  JMP XTH_OUT
  707. HSM_6:         CJNE R5,#1,HSM_7
  708.          MOV ABCD,#10111111B
  709.                  JMP XTH_OUT
  710. HSM_7:         CJNE R5,#8,XTH_OUT
  711.          MOV ABCD,#01111111B
  712. XTH_OUT:
  713.          SETB  RCLK                ;输出CP为上升沿,显示一个
  714.          CLR   EN               ;138可显示
  715.          RET

  716. ;**********左移一位子程序*******************************************************************************/
  717. ZY:           ;30H后存入显示内容,R0为显示未址,R2为移出高位个数   字数*2+1
  718.          SETB RS1
  719.                         CLR  RS0
  720.                    MOV R2,#5
  721.          MOV  R0, #34H    ;显示单元未址        
  722.          CLR  C
  723. CC:      MOV  A,   @R0
  724.          RLC  A            ;将后一字节的最高位移到C里,再移到前一字节的最低位
  725.          MOV  @R0, A
  726.          DEC  R0
  727.          DJNZ R2,  CC
  728.          CLR  C
  729.                         CLR RS1
  730.                         CLR RS0
  731.          RET
  732. ;********************移动查模式时速度同步修正子程序*****************************************************/
  733. ZYXZ:    MOV   R5,B
  734.          MOV   A,#9
  735.          SUBB  A,R5
  736.          MOV   R4,A
  737. AA:      LCALL DL22US
  738.          NOP
  739.          DJNZ  R4 ,AA
  740.          RET
  741. ;*********************************************************************************/

  742. ;********************时间数据转换*************************************=====================================================================*/
  743. XSSJ:  
  744.       MOV        A,FEN    ;分
  745.           MOV        B,#10h
  746.           DIV        AB                                                ;把41H高低4位分开
  747.           MOV        43H,A                                        ;高4位存入
  748.           MOV        A,B
  749.           MOV        44H,A                                        ;低4位存入
  750.           MOV        A,MIAO    ;秒
  751.           MOV        B,#10h               
  752.           DIV        AB                                                ;把40H高低4位分开
  753.           mov        45H,A                                        ;高4位存入
  754.           mov        a,b
  755.           mov        46H,a                                        ;低4位存入
  756.       MOV A,SHI
  757.       MOV B,#16
  758.       DIV AB
  759.       MOV 40H,A
  760.       MOV A,B
  761.       MOV 41H,A
  762.           MOV 42H,#15
  763.           MOV A,40H
  764.           JNZ XSSJ_1
  765.           MOV 40H,#12
  766. XSSJ_1:  RET
  767. ;*************************时间显示程序****************************
  768. PLAY1:         MOV  DPTR,#TABX
  769.           MOV   2DH,#0
  770.          MOV   2FH,#20     ;速度
  771. GG1:      CALL LINE_8      ;扫描显示1帧
  772.          DJNZ  2FH,GG1
  773.          RET
  774. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  775. LINE_8 :  MOV    2BH,#8      ;扫描的行数,共8行
  776. FF1:      CALL  LINE_1       ;扫描显示1行子程序
  777.          DJNZ   2BH,FF1            ;扫描下一行
  778.          MOV    A,2DH
  779.          SUBB A ,#8    ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
  780.          MOV    2DH,A
  781.          RET
  782. ;*********扫描显示一行子程序********************
  783. LINE_1:  CALL  MSTR_R      ;将显示内容移入内存单元
  784.         CALL  MSTR_G
  785.                 MOV 35H,#0
  786.                 MOV 36H,#0
  787. ;                MOV 3BH,#0
  788.                 MOV 3AH,#0
  789.             CALL  SEND_1        ;发送串行口子程序
  790.         CALL  XTH         ;选通行子程序
  791.                 CALL  DL22US
  792.                 INC 2DH
  793.         RET
  794. ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***2EH,2FH缓冲**************
  795. SEND_1: MOV  R0,#30H
  796.         MOV  R1,#38H
  797.         MOV  R5,#2                ;一行有2个字节;如每次显示字数不同要作相应改动
  798. LQ_1:   MOV  R2,#5                ;每个字节有5位
  799.         MOV  A,@R0                ;将显存的字节的单元移入
  800.                 MOV  R6,A
  801.         MOV  A,@R1                ;将显存的字节的单元移入
  802.                 MOV  R7,A
  803.         CALL  DD_1                ;调用显示一个字节的子程序
  804.         INC  R0                        ;指向下一个显存的单元
  805.         INC  R1                        ;指向下一个显存的单元
  806.         DJNZ R5,LQ_1                ;2个字节全部移入了没有,未继续
  807.                 CALL SEND_2
  808.                 CALL SEND_3
  809.         RET                                                        ;
  810. SEND_2: MOV R0,#32H
  811.         MOV R1,#3AH
  812.                 MOV R5,#1
  813. LQ_2:   MOV  R2,#2                ;每个字节有2位
  814.         MOV  A,@R0                ;将显存的字节的单元移入
  815.                 MOV  R6,A
  816.         MOV  A,@R1                ;将显存的字节的单元移入
  817.                 MOV  R7,A
  818.         CALL  DD_1                ;调用显示一个字节的子程序
  819.         INC  R0                        ;指向下一个显存的单元
  820.         INC  R1                        ;指向下一个显存的单元
  821.         DJNZ R5,LQ_2                ;2个字节全部移入了没有,未继续
  822.                 RET
  823. SEND_3: MOV R0,#33H
  824.         MOV R1,#3BH
  825.                 MOV R5,#4
  826. LQ_3:   MOV  R2,#5                ;每个字节有5位
  827.         MOV  A,@R0                ;将显存的字节的单元移入
  828.                 MOV  R6,A
  829.         MOV  A,@R1                ;将显存的字节的单元移入
  830.                 MOV  R7,A
  831.         CALL  DD_1                ;调用显示一个字节的子程序
  832.         INC  R0                        ;指向下一个显存的单元
  833.         INC  R1                        ;指向下一个显存的单元
  834.         DJNZ R5,LQ_3                ;2个字节全部移入了没有,未继续
  835.                 RET
  836. DD_1:   CLR  SRCLK                ;清串行CP端
  837.         CLR  C
  838.         MOV  A,R6
  839.         RLC  A                        ;将每个字节移位
  840.                 MOV  R6,A
  841.                 CPL  C
  842.         MOV  SER,C                ;红色
  843.                 CLR  C
  844.                 MOV  A,R7
  845.                 RLC  A
  846.                 MOV  R7,A
  847.                 CPL C
  848.                 MOV  SEG,C            ;绿色
  849.         SETB SRCLK                ;触发串行CP端
  850.         DJNZ R2,DD_1                ;每个字节位移5次够了没有?
  851.         RET
  852. ;*************************温度显示程序****************************
  853. PLAY:         MOV  DPTR,#TABX
  854.          MOV   2DH,#0
  855.          MOV   2FH,#60     ;速度
  856. GG:      CALL LINE8      ;扫描显示1帧
  857.          DJNZ  2FH,GG
  858.          RET
  859. ;*********扫描显示1帧行子程序*2BH存行数据,2DH存字节数据                  ******************
  860. LINE8 :  MOV    2BH,#8      ;扫描的行数,共8行
  861. FF:      CALL  LINE1       ;扫描显示1行子程序
  862.          DJNZ   2BH,FF            ;扫描下一行
  863.          MOV    A,2DH
  864.          SUBB A ,#8    ;扫描完8行后要重头开始,在MSTR子程序中,扫8行后会增加8,这里-8
  865.          MOV    2DH,A
  866.          RET
  867. ;*********扫描显示一行子程序********************
  868. LINE1:  CALL  MSTR_R      ;将显示内容移入内存单元
  869.         CALL  MSTR_G
  870.                 MOV 34H,#0
  871.                 MOV 35H,#0
  872.                 MOV 3BH,#0
  873.             CALL  SEND        ;发送串行口子程序
  874.         CALL  XTH         ;选通行子程序
  875.                 CALL  DL22US
  876.                 INC 2DH
  877.         RET

  878. ;****************************************************************************
  879. ;**显示内容移入内存单元子程序*取红色到30H-34H,绿色35H-39H*2DH取字节数据***********************
  880. MSTR_R: MOV    R0,#30H
  881.         MOV    R4,#7            ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
  882.                 MOV    R1,#40H
  883. BB_R:   
  884.         MOV   A,@R1
  885.                 MOV   B,#8
  886.                 MUL   AB
  887.                 ADD    A,2DH
  888.                 MOVC   A, @A+DPTR
  889.         MOV    @R0,A         
  890.             INC    R0
  891.                 INC    R1        
  892.             DJNZ   R4,BB_R
  893.                 MOV   R1,#40H
  894.             RET
  895. MSTR_G: MOV    R0,#38H
  896.         MOV    R4,#7            ;每幕显示的字数加1;如每幕显示字数不同要作相应改动
  897.                 MOV    R1,#40H
  898. BB_G:   
  899.         MOV   A,@R1
  900.                 MOV   B,#8
  901.                 MUL   AB
  902.                 ADD    A,2DH
  903.                 MOVC   A, @A+DPTR
  904.         MOV    @R0,A         
  905.             INC    R0
  906.                 INC    R1        
  907.             DJNZ   R4,BB_G
  908.                 MOV   R1,#40H
  909.             RET
  910. ;***发送数据到串口子程序*取红色30H-34H,绿色35H-39H***R6,R7**************
  911. SEND:   MOV  R0,#30H
  912.         MOV  R1,#38H
  913.         MOV  R5,#6                ;一行有4个字节;如每次显示字数不同要作相应改动
  914. LQ:     MOV  R2,#5                ;每个字节有8位
  915.         MOV  A,@R0                ;将显存的字节的单元移入
  916.                 MOV  R6,A
  917.         MOV  A,@R1                ;将显存的字节的单元移入
  918.                 MOV  R7,A
  919.         LCALL  DD1                ;调用显示一个字节的子程序
  920.         INC  R0                        ;指向下一个显存的单元
  921.         INC  R1                        ;指向下一个显存的单元
  922.         DJNZ R5,LQ                ;8个字节全部移入了没有,未继续
  923.                 CLR SRCLK
  924.                 SETB C
  925.                 MOV SER,C
  926.                 MOV SEG,C
  927.                 SETB SRCLK
  928.         RET                                                        ;

  929. DD1:    CLR  SRCLK                ;清串行CP端
  930.         CLR  C
  931.         MOV  A,R6
  932.         RLC  A                        ;将每个字节移位
  933.                 MOV  R6,A
  934.                 CPL  C
  935.         MOV  SER,C                ;红色
  936.                 CLR  C
  937.                 MOV  A,R7
  938.                 RLC  A
  939.                 MOV  R7,A
  940.                 CPL C
  941.                 MOV  SEG,C            ;绿色
  942.         SETB SRCLK                ;触发串行CP端
  943.         DJNZ R2,DD1                ;每个字节位移8次够了没有?
  944.         RET
  945. ;*******选通行子程序***2BH行数据*********************************************************************************/
  946. XTH:     CLR   RCLK                ;将输出CP变为低电平为上升沿作准备
  947.              SETB  EN               ;将使能端变为高电平为下降沿作准备
  948.                  MOV  R5,2BH
  949.                  CJNE R5,#8,HSM1
  950.                  MOV  ABCD,#11111110B
  951.                  JMP  XTHOUT
  952. HSM1:    CJNE R5,#7,HSM2
  953.          MOV  ABCD,#11111101B
  954.                  JMP  XTHOUT
  955. HSM2:         CJNE R5,#6,HSM3
  956.          MOV  ABCD,#11111011B
  957.                  JMP  XTHOUT
  958. HSM3:         CJNE R5,#5,HSM4
  959.          MOV ABCD,#11110111B
  960.                  JMP XTHOUT
  961. HSM4:         CJNE R5,#4,HSM5
  962.          MOV ABCD,#11101111B
  963.                  JMP XTHOUT
  964. HSM5:    CJNE R5,#3,HSM6
  965.          MOV ABCD,#11011111B
  966.                  JMP XTHOUT
  967. HSM6:         CJNE R5,#2,HSM7
  968.          MOV ABCD,#10111111B
  969.                  JMP XTHOUT
  970. HSM7:         CJNE R5,#1,XTHOUT
  971.          MOV ABCD,#01111111B
  972. XTHOUT:
  973.          SETB  RCLK                ;输出CP为上升沿,显示一个
  974.          CLR   EN               ;138可显示
  975.          RET

  976. ;******22US延时子程序********
  977. DL22US:  MOV   R7,#50
  978.          DJNZ  R7,$
  979.          RET                 ;
  980. DEL:    MOV R7,#0
  981.          DJNZ  R7,$
  982.           RET
  983. BEEP_BZ:; CLR     BEEP         ;蜂鸣器鸣响
  984.          MOV R6,#40
  985. BEEP_2:  CALL DEL
  986.          CPL BEEP
  987.                         DJNZ R6, BEEP_2
  988.          SETB   BEEP          ;蜂鸣器停止
  989.                         RET
  990. ;***********************************字码表****************************************
  991. TAB10:
  992. DB 038H,044H,082H,082H,082H,082H,044H,038H;"0",0
  993. DB 010H,070H,010H,010H,010H,010H,010H,0FEH;"1",1
  994. DB 07CH,082H,082H,006H,00CH,070H,0FAH,09EH;"2",2
  995. DB 07EH,044H,00CH,038H,006H,002H,086H,07CH;"3",3
  996. DB 004H,00CH,01CH,034H,064H,0FEH,004H,03FH;"4",4
  997. DB 07EH,042H,040H,07CH,042H,002H,086H,07CH;"5",5
  998. DB 03CH,062H,0C0H,0FCH,082H,082H,0C2H,07CH;"6",6
  999. DB 0FEH,084H,088H,018H,010H,030H,020H,020H;"7",7
  1000. DB 07CH,082H,082H,07CH,086H,082H,0C6H,07CH;"8",8
  1001. DB 07CH,086H,082H,082H,07EH,002H,084H,078H;"9",9
  1002. DB 000H, 000H, 000H, 000H, 0FCH, 000H, 000H, 000H   ;-        10
  1003. DB 080H, 078H, 084H, 080H, 080H, 080H, 084H, 078H  ;"C",11
  1004. DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H  ;无显示,12
  1005. DB 000H, 000H, 000H, 000H, 030H, 030H, 000H, 000H  ;点,13
  1006. DB 000H, 000H, 030H, 030H, 000H, 030H, 030H, 000H   ;:   14
  1007. DB 0FEH,092H,010H,010H,010H,010H,010H,038H;"T",15
  1008. DB 7EH,42H,7EH,7EH,48H,7EH,88H,7EH    ;温   16
  1009. DB    57H,0FDH,57H,75H,57H,0FDH,55H,8BH ;度 17
  1010. ;DB 0D6H, 092H, 092H, 092H, 09AH, 06CH, 064H, 044H;"W",16
  1011. ;DB 0EEH, 044H, 048H, 070H, 050H, 048H, 044H, 0EEH;"K",17
  1012. DB 0FCH,042H,042H,07CH,040H,040H,0E0H,000H;"P",18
  1013. DB 0CEH,084H,084H,0FCH,084H,084H,0CEH,000H;"H",19
  1014. DB 000H,000H,078H,084H,0FCH,080H,07CH,000H;"e",20
  1015. DB 000H,000H,0DCH,078H,030H,078H,0ECH,000H;"x",21
  1016. DB 018H,000H,038H,008H,008H,008H,008H,0F0H;"j",22
  1017. DB 000H,000H,0FEH,092H,092H,092H,0DAH,000H;"m",23
  1018. DB 000H,020H,000H,060H,020H,020H,020H,0F8H;"i",24
  1019. DB 000H,000H,000H,0D8H,066H,042H,042H,0E7H;"n",25
  1020. DB 0E7H,042H,044H,024H,02CH,028H,018H,010H;"V",26
  1021. DB 03CH,05AH,0AAH,0AAH,0B4H,042H,03CH,000H;"@",27
  1022. DB 000H,000H,03CH,062H,040H,042H,03CH,000H;"c",28
  1023. DB 000H,000H,03CH,042H,042H,042H,03CH,000H;"o",29
  1024. DB 010H,03EH,048H,0BCH,028H,07EH,008H,008H;年,30
  1025. DB 03CH,024H,03CH,024H,03CH,024H,044H,08CH;月,31
  1026. DB 0FCH,084H,084H,0FCH,084H,084H,084H,0FCH;日,32
  1027. DB 10H,0FEH,92H,20H,34H,68H,0A4H,32H;农,33
  1028. DB 7EH,48H,7EH,4AH,4AH,4AH,4AH,96H;历,34
  1029. DB 000H,0FEH,010H,010H,05CH,050H,050H,0FEH;正,35
  1030. DB 040H,0E0H,03EH,06AH,0CAH,04AH,052H,044H;初,36
  1031. DB 010H,01EH,024H,058H,018H,024H,0DBH,018H;冬,37
  1032. DB 000H,075H,05FH,075H,05FH,075H,057H,0B7H;腊,38
  1033. DB 010H,010H,010H,0FEH,010H,010H,010H,010H;十,39
  1034. DB 000H,044H,0FEH,044H,044H,044H,044H,07CH;二十,40
  1035. DB 054H,054H,054H,0FEH,054H,054H,054H,094H;卅,41
  1036. DB 000H,000H,000H,000H,0FEH,000H,000H,000H;一,42
  1037. DB 000H,000H,07CH,000H,000H,0FEH,000H,000H;二,43
  1038. DB 000H,000H,07CH,000H,038H,000H,0FEH,000H;三,44
  1039. DB 000H,0FEH,0AAH,0AAH,0AAH,0CEH,082H,0FEH;四,45
  1040. DB 07CH,010H,010H,07CH,014H,014H,024H,0FEH;五,46
  1041. DB 000H,010H,000H,0FEH,000H,028H,046H,082H;六,47
  1042. DB 000H,020H,020H,0FEH,020H,020H,022H,01CH;七,48
  1043. DB 000H,028H,028H,028H,044H,044H,082H,000H;八,49
  1044. DB 020H,020H,0FCH,028H,028H,028H,04AH,086H;九,50
  1045. DB 05EH,082H,0BAH,092H,0BAH,092H,0BAH,086H;闰,51
  1046. DB 0BEH,2AH,0FEH,6AH,0BEH,0F6H,0BEH,46H ;调,52
  1047. DB 04H,0FEH,0A4H,0B4H,0ECH,0A4H,0E4H,0CH ;时 53
  1048. DB 28H,44H,82H,7CH,24H,24H,44H,8CH;分 54
  1049. DB 04H,24H,6CH,0F6H,25H,72H,0A4H,28H ;秒 55

  1050. ;********************温度数据转换*************************************=====================================================================*/
  1051. XSWD:   CALL  RE_TEMP
  1052.         MOV    XSD,#13
  1053.                 MOV    WDFH,#11
  1054.                 MOV  R0,#20H
  1055.             MOV  R1,#40H
  1056.                 MOV  R2,#7
  1057. XSWD2:  MOV  A,@R0
  1058.                 MOV  @R1,A
  1059.                 INC  R0
  1060.                 INC  R1
  1061.                 DJNZ  R2,XSWD2
  1062.                 RET
  1063. ;;;;;;;;;;;;以下是温度程序;;;;;;;;;==
  1064. ; 程序功能:数字温度计(+125- -55)
  1065. RE_TEMP:         ;对DS18B20初始化及读取
  1066.        SETB   DQ           
  1067.        CALL  RESET_1820    ;调用复位子程序
  1068.        JB     FLAG, STT        ;判断DS1820是否存在?
  1069.        RET                              ;*/            
  1070. STT:                       ; DS18B20存在
  1071.        MOV    A,#0CCH        ;跳过ROM匹配
  1072.        CALL   WRITE_1820     ;写入数据
  1073.        MOV    A,#44H          ;发出温度转换命令
  1074.        CALL   WRITE_1820     ;写入数据
  1075.        CALL   RESET_1820    ;准备读温度前先复位
  1076.        MOV    A,#0CCH         ;跳过ROM匹配
  1077.        CALL   WRITE_1820     ;写入数据
  1078.        MOV    A,#0BEH         ;发出读温度命令
  1079.        CALL   WRITE_1820     ;写入数据
  1080.        CALL   READ_1820      ;读出温度数据         
  1081.        RET                                  ;*/      
  1082. RESET_1820:  ;复位(有具体的时序要求)                       
  1083.        SETB  DQ
  1084.            NOP
  1085.            NOP
  1086.        CLR   DQ      
  1087. ;主机发出延时521微秒的复位低脉冲
  1088.        MOV  R1,#2            ;  3
  1089. DLY:   MOV  R0,#107
  1090.        DJNZ R0,$
  1091.        DJNZ R1,DLY
  1092. ;然后拉高数据线
  1093.        SETB  DQ
  1094.            NOP
  1095.            NOP
  1096.            NOP        
  1097.        MOV   R0,#25H      
  1098. T2:    JNB   DQ ,T3       ;等待DS18B20回应
  1099.        DJNZ  R0, T2
  1100.        JMP  T4         
  1101. T3:    SETB  FLAG      ;置标志位,表示DS1820存在
  1102.        JMP  T5
  1103. T4:    CLR   FLAG     ;清标志位,表示DS1820不存在     
  1104.        JMP  T7
  1105. T5:    MOV  R0,#117
  1106. T6:    DJNZ R0,T6           ;时序要求延时一段时间
  1107. T7:    SETB   DQ        
  1108.        RET  
  1109.        ;---------------------------------------------- */                                 
  1110. WRITE_1820: ;写入DS18B20(有具体的时序要求)
  1111.        MOV  R2,#8           ;一共8位数据
  1112.        CLR  C
  1113. WR1:   CLR  DQ            ;总线低位,开始写入  
  1114.        MOV  R3,#7
  1115.        DJNZ R3,[        DISCUZ_CODE_1        ]nbsp;           ;保持16微秒以上
  1116.        RRC  A  ;把字节DATA分成8个BIT环移给C
  1117.        MOV  DQ,  C        ;写入一个BIT
  1118.        MOV  R3,#23
  1119.        DJNZ R3,[        DISCUZ_CODE_1        ]nbsp;           ;等待
  1120.        SETB  DQ           ;重新释放总线
  1121.        NOP
  1122.        DJNZ R2,WR1          ;写入下一个BIT
  1123.        SETB  DQ         
  1124.        RET                                            
  1125. READ_1820: ;将温度高位和低位从DS18B20中读出
  1126.        MOV   R4,#2           ; 读出两个字节的数据
  1127.        MOV   R1,#WDDW        ;低位存
  1128. RE0:   MOV   R2,#8           ;数据一共有8位
  1129. RE1:   CLR   C
  1130.        SETB  DQ
  1131.            NOP
  1132.            NOP
  1133.            NOP         
  1134.        CLR   DQ          ;读前总线保持为低   
  1135.            NOP
  1136.            NOP
  1137.            NOP            
  1138.        SETB  DQ          ;开始读总线释放                 
  1139.        MOV   R3,#9
  1140. RE2:   DJNZ  R3,RE2        ;延时18微妙
  1141.        MOV   C, DQ         ; 从总线读到一个BIT                  
  1142.        MOV   R3,#23
  1143. RE3:   DJNZ  R3,RE3         ;等待100μ秒
  1144.        RRC   A              ;把读得的位值环移给A
  1145.        DJNZ  R2,RE1        ;读下一个BIT
  1146.        MOV   @R1,A
  1147.        DEC   R1
  1148.        DJNZ  R4,RE0
  1149.        RET         
  1150. ;;;;;;;;;;;;;;;;;;;; */                              
  1151. TURN:  MOV   A,WDGW   
  1152.        JBC   ACC.4,TU  ;是零下跳到TU
  1153.        MOV   D_BIT,#0FFH
  1154. DIS:   MOV   DPTR,#TAB
  1155.            MOV   A,WDDW           ;低位
  1156.        ANL   A,#0FH              ;取小数
  1157.        MOVC  A,@A+DPTR
  1158.            MOV   C_BIT,A        ;精确到0.1度的小数值
  1159.        MOV   A,WDDW
  1160.        SWAP  A       ;高低位互换
  1161.                 ANL  A,#0FH
  1162.                 MOV  WDDW,A
  1163.                 MOV  A,WDGW
  1164.                 ANL  A,#0FH
  1165.                 SWAP A
  1166.                 ORL  A,WDDW;重新组合,为不带小数的温度值
  1167.                 MOV  WDDW,A
  1168.                 MOV  A,D_BIT
  1169.                 CJNE A,#10,TU_1;百位不是-跳转
  1170.                 MOV A,WDDW
  1171. DIS_1:
  1172.           MOV B,#10
  1173.           DIV AB
  1174.           MOV A_BIT,B;十位值
  1175.           MOV B_BIT,A;个位值
  1176.           MOV A,D_BIT
  1177.           CJNE A,#0,TU_2;百位不是0跳转
  1178.           MOV D_BIT,#12;是0消隐
  1179. DIS_2:MOV A,B_BIT
  1180.           CJNE A,#0,TUR;十位不是0转
  1181.           MOV B_BIT,#12;是0消隐
  1182. TUR:    RET   

  1183. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                              
  1184. TU:   MOV D_BIT,#10;显示-号
  1185.       CPL A
  1186.       ANL A,#0FH
  1187.       mov WDGW,A;取反A存入高位
  1188.       MOV A,WDDW
  1189.       CPL A
  1190.       CLR C
  1191.                 INC A
  1192.                 MOV WDDW,A
  1193.                 MOV A,WDGW
  1194.       ADDC A,#0
  1195.       MOV WDGW,A
  1196.       JMP DIS
  1197. TU_1: MOV A,WDDW
  1198.       MOV B,#100
  1199.           DIV AB
  1200.           MOV D_BIT,A;百位值
  1201.       MOV A,B
  1202.           JMP DIS_1
  1203. TU_2: CJNE A,#10,TUR;百位不是-跳转
  1204.       JMP DIS_2
  1205. TAB:DB 0, 1,1,2,3,3,4,4,5,6,6,7,8,8,9,9  
  1206. ;;;;;;;;;;;;以上是温度程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; */
  1207. TABX:;5*7小字符  用于固定显示时间和温度
  1208. DB 060H, 090H, 090H, 090H, 090H, 090H, 060H, 000H   ;0
  1209. DB 020H, 060H, 020H, 020H, 020H, 020H, 070H, 000H   ;1
  1210. DB 060H, 090H, 010H, 020H, 040H, 080H, 0F0H, 000H   ;2
  1211. DB 060H, 090H, 010H, 060H, 010H, 090H, 060H, 000H   ;3
  1212. DB 020H, 060H, 0A0H, 0A0H, 0F0H, 020H, 020H, 000H   ;4
  1213. DB 0F0H, 080H, 0E0H, 090H, 010H, 090H, 060H, 000H   ;5
  1214. DB 060H, 090H, 080H, 0E0H, 090H, 090H, 060H, 000H   ;6
  1215. DB 0F0H, 010H, 010H, 020H, 040H, 040H, 040H, 000H   ;7
  1216. DB 060H, 090H, 090H, 060H, 090H, 090H, 060H, 000H   ;8
  1217. DB 060H, 090H, 090H, 070H, 010H, 090H, 060H, 000H   ;9
  1218. DB 000H, 000H, 000H, 0F0H, 000H, 000H, 000H, 000H   ;-  10
  1219. DB 080H, 030H, 040H, 040H, 040H, 040H, 030H, 000H   ;C  11
  1220. DB 000H, 000H, 000H, 000H, 000H, 000H, 000H, 000H   ;  空格 12
  1221. DB 000H, 000H, 000H, 000H, 060H, 060H, 000H, 000H   ;.   13
  1222. DB 000H, 060H, 060H, 000H, 060H, 060H, 000H, 000H   ;:   14
  1223. DB 000H, 000H, 080H, 000H, 000H, 080H, 000H, 000H   ;:  单冒号15
  1224. /*;程序功能:歌曲演奏        
  1225.   START1: MOV   TMOD,#00000001B; 设T0方式1
  1226.          MOV   IE,#10000010B;允许T0中断         
  1227.          MOV   DPTR,#TABLE ; 存表首地址           
  1228.   LOOP:  CLR   A           ; 清零
  1229.          MOVC  A,@A+DPTR   ; 查表               
  1230.          MOV   R1,A        ; 定时器高8位存R1     
  1231.          INC   DPTR        ; 指针加1
  1232.          CLR   A           ; 清零
  1233.          MOVC  A,@A+DPTR   ; 查表               
  1234.          MOV   R0,A        ; 定时器低8位存R0            
  1235.          ORL   A,R1        ; 进行"或"运算
  1236.          JZ    NEXT0       ; 全0为休止符
  1237.          MOV   A, R0       ;
  1238.          ANL   A, R1       ; 进行"与"运算
  1239.          CJNE  A,#0FFH,NEXT; 全1表示乐曲结束
  1240.          RET     
  1241.   NEXT:  MOV   TH0,R1      ; 装入高位定时值
  1242.          MOV   TL0,R0      ; 装入低位定时值      
  1243.          SETB  TR0         ; 启动定时器T0
  1244.          setb  tf0         ;启动定时器工作
  1245.          JMP  NEXT1        ; 转移NEXT1处
  1246.   NEXT0: CLR   TR0         ; 关闭定时器停止发音   
  1247.   NEXT1: CLR   A           ; 清零
  1248.          INC   DPTR        ; 指针加1
  1249.          MOVC  A,@A+DPTR   ; 查延时常数
  1250.          MOV   R2, A       ; 延时常数存入R2      
  1251.   LOOP1: ACALL   DDELAY     ; 调延时子程序
  1252.          DJNZ  R2, LOOP1   ; 控制延时次数         
  1253.          INC   DPTR        ; 指针加1
  1254.          JMP  LOOP         ; 转移LOOP处         
  1255.   EXT0:  MOV   TH0,R1      ; 重装定时值
  1256.          MOV   TL0,R0      ;
  1257.          CPL   BEEP        ; 反相输出
  1258.          RETI              ; 中断返回              
  1259.   DDELAY: MOV   R7,#2      ; 延时187ms
  1260.   D2:    MOV   R6,#187     ;
  1261.   D3:    MOV   R5,#248     ;
  1262.          DJNZ  R5,[        DISCUZ_CODE_1        ]nbsp;       ;
  1263.          DJNZ  R6,D3       ;
  1264.          DJNZ  R7,D2       ;
  1265.          RET               ;
  1266. TABLE:
  1267. DB  0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H,0FEH,2AH,04H,0FEH,02H,04H ;
  1268. DB  00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H,0FDH,0C6H,04H,0FDH,80H,04H ;
  1269. DB  0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FDH,80H,03H,0FDH,80H,01H ;
  1270. DB  0FEH,0C0H,04H, 0FEH,84H,04H,0FEH,2AH,04H, 0FEH,02H,04H,0FDH,0C6H,04H               ;
  1271. DB  0FEH,98H,03H, 0FEH,98H,01H,0FEH,84H,04H, 0FEH,2AH,04H,0FEH,5CH,04H, 0FEH,2AH,04H,00H,00H,04H,0FFH,0FFH   */
  1272. ;以下为公历转农历子程序
  1273. CONvert: MOV     A,time_year    ;将年月日转化为   HEX 格式  16进制
  1274.        MOV      B,#16
  1275.        DIV      AB
  1276.        MOV      CONvert_yeAr,B
  1277.        MOV      B,#10
  1278.        MUL      AB
  1279.        ADD      A,CONvert_yeAr
  1280.        MOV      CONvert_yeAr,A
  1281.        MOV      A,time_month
  1282.        MOV      C,ACC.7
  1283.        MOV    f0,C             ;f0暂存世纪标志,仅用于数据表定位
  1284.        CLR      ACC.7
  1285.        JNB      ACC.4,CON_02
  1286.       CLR      ACC.4          ;ACC.4 为 1 表示大于   10 月
  1287.        ADD      A,#10
  1288. CON_02: MOV     CONvert_mONth,A
  1289.        MOV      A,time_date;
  1290.       SWAP A
  1291.                 ANL A,#07H
  1292.                 MOV B,#10
  1293.                 MUL AB
  1294.                 MOV CONVERT_DATE,A
  1295.                 MOV A,TIME_DATE
  1296.                 ANL A,#0FH
  1297.       ADD      A,CONvert_dAte
  1298.        MOV      CONvert_dAte,A
  1299.        MOV      dptr,#mONth_dAtA  ;以下定位本年数据在表格中的位置
  1300.        MOV      A,CONvert_yeAr
  1301.        JB       f0,CON_06      ;当前为  19 世纪年跳转
  1302. ;      ADD      A,#100         ;从 19 世纪起定义表格起始年,20    世纪要加  100 年
  1303. CON_06: CLR     C
  1304.        SUBB     A,#stArt_yeAr
  1305.        MOV      B,#3           ;表格每年  3 字节
  1306.        MUL      AB
  1307.        ADD      A,dpl
  1308.        MOV      dpl,A
  1309.        MOV      A,B
  1310.        ADDC     A,dph
  1311.        MOV      dph,A
  1312.        MOV      A,#2
  1313.        MOVC     A,@A+dptr      ;读本年表格最后一字节(春节日期)
  1314.        CLR      ACC.7          ;ACC.7 是闰年第   13 个月大小,在此不用
  1315.        MOV      B,#32
  1316.        DIV      AB
  1317.        MOV      temp_Byte1,A   ;春节月份
  1318.        MOV      temp_Byte2,B   ;春节日
  1319.       ;以下计算当前日期距元旦天数
  1320.        MOV      temp_Byte3,#0  ;设距元旦天数高位为     0
  1321.        MOV      A,CONvert_mONth
  1322.        CJNE     A,#10,CON_08
  1323. CON_08: JC      CON_09         ;9 月以前日子数小于    256 天,高字节为  0(9 月份过去的整月为     8 个月)
  1324.        MOV      temp_Byte3,#1
  1325. CON_09: MOV     A,CONvert_yeAr
  1326.        ANL      A,#03h         ;ACC 为除  4 的余数
  1327.        JNZ      CON_10         ;转常年处理
  1328.        ;年除 4 余数为  0 是闰年
  1329.        MOV      A,CONvert_mONth
  1330.        LCALL   get_ruN_dAys_lOw  ;取得闰年过去月的天数的低字节
  1331.        SJMP    CON_12
  1332. CON_10: MOV    A,CONvert_mONth
  1333.        LCALL   get_dAys_lOw      ;取得常年过去月的天数的低字节
  1334. CON_12: MOV    B,CONvert_dAte
  1335.        DEC     B                 ;因为日期从  1 日起,而不是  0 日起
  1336.        ADD     A,B                ;过去的整月天数加当月天数
  1337.        MOV     temp_Byte4,A
  1338.        JNC     CON_14
  1339.        INC     temp_Byte3        ;temp_Byte3,temp_Byte4 分别为公历年过去的天数的高低字节
  1340. ;以下求春节距元旦天数,因肯定小于       256 天所以只用一字节表示
  1341. CON_14: MOV    A,temp_Byte1
  1342.        LCALL   get_dAys_lOw      ;春节不会在  3 月份,不用考虑闰年
  1343.        DEC     A                 ;因为日期从  1 日起
  1344.        ADD     A,temp_Byte2
  1345.        MOV     temp_Byte5,A      ;temp_Byte5,为春节距元旦天数
  1346.        MOV     A,CONvert_mONth
  1347.        CJNE    A,temp_Byte1,CON_20 ;转换月与春节月比较
  1348.        MOV     A,CONvert_dAte
  1349.        CJNE    A,temp_Byte2,CON_20 ;转换日与春节日比较
  1350. CON_20: JC     CON_22
  1351.        LJMP    CON_60            ;当前日大于等于春节日期,公历年与农历年同年份
  1352. CON_22: MOV    A,CONvert_yeAr    ;不到春节,农历年比公历年低一年
  1353.        JNZ     CON_24
  1354.        MOV     A,#100            ;年有效数  0-99
  1355. CON_24: DEC    A
  1356.        MOV     CONvert_yeAr,A
  1357.        MOV     A,dpl
  1358.        CLR     C
  1359.        SUBB    A,#3
  1360.        MOV     dpl,A
  1361.        JNC     CON_26
  1362.        DEC     dph               ;表格指针指向上一年
  1363. CON_26: MOV    A,temp_Byte5
  1364.        CLR     C
  1365.        SUBB    A,temp_Byte4
  1366.        MOV     temp_Byte3,A      ;temp_Byte3 中为当前日离春节的天数
  1367.        MOV     CONvert_mONth,#12 ;农历月为  12 月
  1368.        CLR     f0                ;1901-2099 年没有闰  12 月,清闰月标志
  1369.        CLR     A
  1370.        MOVC    A,@A+dptr
  1371.        ANL     A,#0f0h
  1372.        SWAP    A;
  1373.        MOV     temp_Byte4,A      ;temp_Byte4 中为闰月
  1374.        JZ      CON_30            ;没有闰月转移
  1375.        MOV    A,#2               ;有闰月,取第 13 个月天数
  1376.        MOVC    A,@A+dptr
  1377.        MOV     C,ACC.7
  1378.        MOV     A,#1
  1379.        MOVC    A,@A+dptr
  1380.        RLC     A                 ;ACC 中为最后  6 个月的大小值
  1381.        SJMP    CON_34
  1382. CON_30: MOV    A,#1
  1383.        MOVC    A,@A+dptr         ;ACC 中为最后  6 个月的大小值
  1384. CON_34: MOV    temp_Byte5,A
  1385. CON_40: MOV    A,temp_Byte5
  1386.        RRC     A
  1387.        MOV     temp_Byte5,A
  1388.        JC      CON_42
  1389.        MOV     B,#29             ;小月 29 天
  1390.        SJMP    CON_44
  1391. CON_42: MOV    B,#30             ;大月 30 天
  1392. CON_44: MOV    A,temp_Byte3
  1393.        CLR     C
  1394.        SUBB    A,B
  1395.        JZ      CON_46            ;正好够减,就是农历日   1 日
  1396.        JNC     CON_50            ;不够减一月天数,结束农历月调整
  1397.        CPL     A                 ;求补取绝对值
  1398.        INC     A
  1399. CON_46: INC    A                 ;加 1 即为农历日
  1400.        MOV     B,#10             ;转换并保存农历日,月,年
  1401.        DIV     AB
  1402.        SWAP    A
  1403.        ORL     A,B
  1404.        MOV     CONvert_dAte,A
  1405.        MOV     A,CONvert_mONth
  1406.        MOV     B,#10
  1407.        DIV     AB
  1408.        SWAP    A
  1409.        ORL     A,B
  1410.        MOV     C,f0
  1411.        MOV     ACC.7,C
  1412.        MOV     CONvert_mONth,A
  1413.       MOV      A,CONvert_yeAr
  1414.        MOV      B,#10
  1415.        DIV      AB
  1416.        SWAP     A
  1417.        ORL      A,B
  1418.        MOV      CONvert_yeAr,A
  1419.        RET                                ;结束转换 ==========================
  1420. CON_50: MOV     temp_Byte3,A            ;temp_Byte3 存减去一月后的天数
  1421.        JB       f0,CON_52               ;是闰月,前推一月,月份不减
  1422.        DEC      CONvert_mONth;
  1423. CON_52: MOV     A,CONvert_mONth
  1424.        CJNE     A,temp_Byte4,CON_54
  1425.        CPL      f0                      ;当前月与闰月相同,更改闰月标志
  1426. CON_54: SJMP    CON_40
  1427. CON_60: MOV     A,temp_Byte4            ;春节日小于当前日,农历年同公历年
  1428.        CLR      C
  1429.        SUBB     A,temp_Byte5
  1430.        MOV      temp_Byte4,A
  1431.        JNC      CON_62
  1432.        DEC      temp_Byte3              ;temp_Byte3 temp_Byte4 中为公历日离春节的天数
  1433. CON_62: MOV     CONvert_mONth,#1        ;农历月为  1 月
  1434.        CLR      A
  1435.        MOVC     A,@A+dptr
  1436.        MOV      temp_Byte5,A
  1437.        ANL      A,#0f0h
  1438.        SWAP     A;
  1439.        XCH      A,temp_Byte5            ;temp_Byte5 中为闰月,ACC  为当年农历表第一字节
  1440.        CLR      f0                      ;第一个月肯定不是闰月
  1441.        ANL      A,#0fh
  1442.        MOV      temp_Byte1,A
  1443.        MOV      A,#1
  1444.        MOVC     A,@A+dptr
  1445.        MOV      temp_Byte2,A
  1446.        ANL      A,#0f0h
  1447.        ORL      A,temp_Byte1
  1448.        SWAP     A
  1449.        MOV      temp_Byte1,A
  1450.        MOV      A,#2
  1451.        MOVC     A,@A+dptr
  1452.        MOV      C,ACC.7
  1453.        MOV      A,temp_Byte2
  1454.        ANL      A,#0fh
  1455.      SWAP     A
  1456.        MOV      ACC.3,C;
  1457.        MOV     temp_Byte2,A             ;以上 temp_Byte1,temp_Byte2 各 BIT 存农历年大小
  1458. CON_70: MOV     A,temp_Byte2
  1459.        RLC      A
  1460.        MOV      temp_Byte2,A
  1461.        MOV      A,temp_Byte1
  1462.        RLC      A
  1463.        MOV      temp_Byte1,A
  1464.        JC       CON_72
  1465.        MOV      B,#29                   ;小月 29 天处理
  1466.        SJMP     CON_74
  1467. CON_72: MOV     B,#30                   ;大月 30 天
  1468. CON_74: MOV     A,temp_Byte4
  1469.        CLR      C
  1470.        SUBB     A,B
  1471.        JNC      CON_78                  ;低字节够减跳转
  1472.        MOV     B,A                      ;低字节不够减,  B 暂存减后结果,
  1473.        MOV      A,temp_Byte3
  1474.        JZ       CON_76                  ;高字节为  0,不够减
  1475.        DEC      temp_Byte3
  1476.        MOV      temp_Byte4,B
  1477.        SJMP     CON_80
  1478. CON_76: MOV     A,temp_Byte4            ;不够减结束月调整
  1479.        LJMP     CON_46                  ;转日期加  1 后,处理并保存转换后农历年月日
  1480. CON_78: MOV     temp_Byte4,A            ;temp_Byte3 temp_Byte4 天数为减去一月后天数
  1481. CON_80: MOV     A,CONvert_mONth
  1482.        CJNE     A,temp_Byte5,CON_82
  1483.        CPL      f0                      ;当前月与闰月相同,更改闰月标志
  1484.        JNB      f0,CON_82               ;更改标志后是非闰月,月份加     1
  1485.        SJMP     CON_70
  1486. CON_82: INC     CONvert_mONth;
  1487.        SJMP     CON_70
  1488. get_dAys_lOw:
  1489.        MOVC A,@A+PC                      ;取得常年过去月的天数的低字节
  1490.        RET
  1491.        DB 0,31,59,90,120,151,181,212,243,17,48,78
  1492. get_ruN_dAys_lOw:
  1493.        MOVC A,@A+PC                      ;取得闰年过去月的天数的低字节
  1494.        RET
  1495.        DB 0,31,60,91,121,152,182,213,244,18,49,79
  1496. mONth_dAtA:
  1497. ;公历年对应的农历数据,每年三字节,
  1498. ;格式第一字节      BIT7-4 位表示闰月月份,值为        0 为无闰月,BIT3-0    对应农历第     1-4 月的大小
  1499. ;第二字节    BIT7-0 对应农历第     5-12 月大小,第三字节       BIT7 表示农历第     13 个月大小
  1500. ;月份对应的位为       1 表示本农历月大(30       天),为 0 表示小(29   天).
  1501. ;第三字节    BIT6-5 表示春节的公历月份,BIT4-0        表示春节的公历日期  
  1502. /*DB 004h,0Aeh,053h,00Ah,057h,048h,055h,026h,0Bdh,00dh,026h,050h,00dh,095h,044h; 1905
  1503. DB 046h,0AAh,0B9h,005h,06Ah,04dh,009h,0Adh,042h,024h,0Aeh,0B6h,004h,0Aeh,04Ah; 1910
  1504. DB 06Ah,04dh,0Beh,00Ah,04dh,052h,00dh,025h,046h,05dh,052h,0BAh,00Bh,054h,04eh; 1915
  1505. DB 00dh,06Ah,043h,029h,06dh,037h,009h,05Bh,04Bh,074h,09Bh,0C1h,004h,097h,054h; 1920
  1506. DB 00Ah,04Bh,048h,05Bh,025h,0BCh,006h,0A5h,050h,006h,0d4h,045h,04Ah,0dAh,0B8h; 1925
  1507. DB 002h,0B6h,04dh,009h,057h,042h,024h,097h,0B7h,004h,097h,04Ah,066h,04Bh,03eh; 1930
  1508. DB 00dh,04Ah,051h,00eh,0A5h,046h,056h,0d4h,0BAh,005h,0Adh,04eh,002h,0B6h,044h; 1935
  1509. DB 039h,037h,038h,009h,02eh,04Bh,07Ch,096h,0Bfh,00Ch,095h,053h,00dh,04Ah,048h; 1940
  1510. DB 06dh,0A5h,03Bh,00Bh,055h,04fh,005h,06Ah,045h,04Ah,0Adh,0B9h,002h,05dh,04dh; 1945
  1511. DB 009h,02dh,042h,02Ch,095h,0B6h,00Ah,095h,04Ah,07Bh,04Ah,0Bdh,006h,0CAh,051h; 1950
  1512. DB 00Bh,055h,046h,055h,05Ah,0BBh,004h,0dAh,04eh,00Ah,05Bh,043h,035h,02Bh,0B8h; 1955
  1513. DB 005h,02Bh,04Ch,08Ah,095h,03fh,00eh,095h,052h,006h,0AAh,048h,07Ah,0d5h,03Ch; 1960
  1514. DB 00Ah,0B5h,04fh,004h,0B6h,045h,04Ah,057h,039h,00Ah,057h,04dh,005h,026h,042h; 1965
  1515. DB 03eh,093h,035h,00dh,095h,049h,075h,0AAh,0Beh,005h,06Ah,051h,009h,06dh,046h; 1970
  1516. DB 054h,0Aeh,0BBh,004h,0Adh,04fh,00Ah,04dh,043h,04dh,026h,0B7h,00dh,025h,04Bh; 1975
  1517. DB 08dh,052h,0Bfh,00Bh,054h,052h,00Bh,06Ah,047h,069h,06dh,03Ch,009h,05Bh,050h; 1980
  1518. DB 004h,09Bh,045h,04Ah,04Bh,0B9h,00Ah,04Bh,04dh,0ABh,025h,0C2h,006h,0A5h,054h; 1985
  1519. DB 006h,0d4h,049h,06Ah,0dAh,03dh,00Ah,0B6h,051h,009h,037h,046h,054h,097h,0BBh; 1990
  1520. DB 004h,097h,04fh,006h,04Bh,044h,036h,0A5h,037h,00eh,0A5h,04Ah,086h,0B2h,0Bfh; 1995
  1521. DB 005h,0ACh,053h,00Ah,0B6h,047h,059h,036h,0BCh,009h,02eh,050h,00Ch,096h,045h; 2000  */

  1522. DB 04dh,04Ah,0B8h,00dh,04Ah,04Ch,00dh,0A5h,041h,025h,0AAh,0B6h,005h,06Ah,049h; 2005
  1523. DB 07Ah,0Adh,0Bdh,002h,05dh,052h,009h,02dh,047h,05Ch,095h,0BAh,00Ah,095h,04eh; 2010
  1524. DB 00Bh,04Ah,043h,04Bh,055h,037h,00Ah,0d5h,04Ah,095h,05Ah,0Bfh,004h,0BAh,053h; 2015
  1525. DB 00Ah,05Bh,048h,065h,02Bh,0BCh,005h,02Bh,050h,00Ah,093h,045h,047h,04Ah,0B9h; 2020
  1526. DB 006h,0AAh,04Ch,00Ah,0d5h,041h,024h,0dAh,0B6h,004h,0B6h,04Ah,069h,057h,03dh; 2025
  1527. DB 00Ah,04eh,051h,00dh,026h,046h,05eh,093h,03Ah,00dh,053h,04dh,005h,0AAh,043h; 2030
  1528. DB 036h,0B5h,037h,009h,06dh,04Bh,0B4h,0Aeh,0Bfh,004h,0Adh,053h,00Ah,04dh,048h; 2035
  1529. DB 06dh,025h,0BCh,00dh,025h,04fh,00dh,052h,044h,05dh,0AAh,038h,00Bh,05Ah,04Ch; 2040
  1530. DB 005h,06dh,041h,024h,0Adh,0B6h,004h,09Bh,04Ah,07Ah,04Bh,0Beh,00Ah,04Bh,051h; 2045
  1531. DB 00Ah,0A5h,046h,05Bh,052h,0BAh,006h,0d2h,04eh,00Ah,0dAh,042h,035h,05Bh,037h; 2050
  1532. DB 009h,037h,04Bh,084h,097h,0C1h,004h,097h,053h,006h,04Bh,048h,066h,0A5h,03Ch; 2055
  1533. DB 00eh,0A5h,04fh,006h,0B2h,044h,04Ah,0B6h,038h,00Ah,0Aeh,04Ch,009h,02eh,042h; 2060
  1534. DB 03Ch,097h,035h,00Ch,096h,049h,07dh,04Ah,0Bdh,00dh,04Ah,051h,00dh,0A5h,045h; 2065
  1535. DB 055h,0AAh,0BAh,005h,06Ah,04eh,00Ah,06dh,043h,045h,02eh,0B7h,005h,02dh,04Bh; 2070
  1536. DB 08Ah,095h,0Bfh,00Ah,095h,053h,00Bh,04Ah,047h,06Bh,055h,03Bh,00Ah,0d5h,04fh; 2075
  1537. DB 005h,05Ah,045h,04Ah,05dh,038h,00Ah,05Bh,04Ch,005h,02Bh,042h,03Ah,093h,0B6h; 2080
  1538. DB 006h,093h,049h,077h,029h,0Bdh,006h,0AAh,051h,00Ah,0d5h,046h,054h,0dAh,0BAh; 2085
  1539. DB 004h,0B6h,04eh,00Ah,057h,043h,045h,027h,038h,00dh,026h,04Ah,08eh,093h,03eh;   2090
  1540. DB 00dh,052h,052h,00dh,0AAh,047h,066h,0B5h,03Bh,005h,06dh,04fh,004h,0Aeh,045h;   2095
  1541. DB 04Ah,04eh,0B9h,00Ah,04dh,04Ch,00dh,015h,041h,02dh,092h,0B5h,00dh,053h,049h;   2100
  1542. ;ds1302时钟上升沿输入命令或数据,下降沿输出数据.===========================================================================
  1543. IN_1302:mov                MIAO,#00H                                ;秒赋初值     出厂日期:2010.6.25.12:00:00
  1544.              mov                FEN,#00H                                ;分赋初值
  1545.             mov                SHI,#12H                                ;时赋初值
  1546.             mov                RIQI,#025H                                ;日赋初值h
  1547.             mov                YUE,#06H                                ;月赋初值
  1548.             mov                XQI,#05H                                ;星期赋初值
  1549.             mov                NIAN,#10H                        ;年赋初值
  1550.             lcall        set1302                                ;调用初值设定子程序
  1551.             RET
  1552. ;入口参数:初始时间:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)*/
  1553. Set1302:
  1554.     CLR    T_RST
  1555.     CLR    T_CLK
  1556.     SETB   T_RST
  1557.     MOV    B,     #8EH        ;控制寄存器  10001110b
  1558.     LCALL  RTInputByte  
  1559.     MOV    B,     #00H        ;写操作前WP=0
  1560.     LCALL  RTInputByte  
  1561.     MOV    B,     #90H        ;控制寄存器  10010000b
  1562.     LCALL  RTInputByte  
  1563.     MOV    B,     #10101001b       ;充电
  1564.     LCALL  RTInputByte  
  1565.     SETB   T_CLK
  1566.     CLR    T_RST
  1567.     MOV    R0,    #MIAO;
  1568.     MOV    R7,    #7        ;秒 分 时 日 月 星期 年 共7个字节
  1569.     MOV    R1,    #80H      ;秒写地址  10000000b
  1570. S13021:   CLR    T_RST
  1571.     CLR    T_CLK
  1572.     SETB   T_RST
  1573.     MOV    B,     R1        ;写秒 分 时 日 月 星期 年   地址
  1574.     LCALL  RTInputByte  
  1575.     MOV    A,     @R0       ;写秒数据
  1576.     MOV    B,     A
  1577.     LCALL  RTInputByte  
  1578.     INC    R0
  1579.     INC    R1
  1580.     INC    R1
  1581.     SETB   T_CLK
  1582.     CLR    T_RST
  1583.     DJNZ   R7,    S13021
  1584.     CLR    T_RST
  1585.     CLR    T_CLK
  1586.     SETB   T_RST
  1587.     MOV    B,     #8EH        ;控制寄存器
  1588.     LCALL  RTInputByte  
  1589.     MOV    B,     #80H        ;控制,WP=1,写保护
  1590.     LCALL  RTInputByte  
  1591.     SETB   T_CLK
  1592.     CLR    T_RST
  1593.     RET
  1594. ;功    能:从DS1302 读时间
  1595. Get1302:      
  1596.     MOV    R0,    #MIAO;
  1597.     MOV    R7,    #7
  1598.     MOV    R1,    #81H       ;秒地址
  1599. G13021:   CLR    T_RST
  1600.     CLR    T_CLK
  1601.    SETB   T_RST
  1602.     MOV    B,     R1        ;秒 分 时 日 月 星期 年 地址
  1603.     LCALL   RTInputByte  
  1604.     LCALL   RTOutputByte
  1605.     MOV    @R0,   A         ;秒
  1606.     INC    R0
  1607.     INC    R1
  1608.     INC    R1
  1609.     SETB   T_CLK
  1610.     CLR    T_RST
  1611.     DJNZ   R7,    G13021
  1612.     RET
  1613. ;功    能:写1302一字节  (内部子程序)
  1614. RTInputByte:  
  1615.          MOV    R3,    #8                ;一个字节有八个位,移八次.
  1616. Inbit1:  MOV    A,     B
  1617.          RRC    A                                ;通过A移入CY.
  1618.          MOV    B,     A
  1619.          MOV    T_IO,  C                ;移入芯片内.
  1620.          SETB   T_CLK
  1621.          CLR    T_CLK
  1622.          DJNZ   R3,   Inbit1
  1623.          RET
  1624. ;功    能:读1302一字节
  1625. RTOutputByte:
  1626.         MOV    R3,    #8                ;一个字节有八个位,移八次.
  1627. Out_1:  MOV    C, T_IO            ;从芯片内移到CY
  1628.         RRC    A                        ;通过CY移入A.
  1629.         SETB   T_CLK
  1630.         CLR    T_CLK
  1631.         DJNZ   R3,Out_1
  1632.         RET

  1633.                   ;=================================================  
  1634. ;以下子程序用于从当前公历日期,推算星期,
  1635. ;入口:time_yeAr,time_month ,time_date ,定义公历年 月  日,BCD   码,其中月的
  1636. ;BIT7 表示世纪,0表示20 世纪,1表示 19 世纪,出口   time_week, 0-6 表示星期日-星期六,程序不改变入口数据
  1637. ;使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3
  1638. GetWeek:  MOV         A,NIAN
  1639.            MOV        B,#16
  1640.            DIV        AB
  1641.            MOV        temp_Byte1,B
  1642.            MOV        B,#10
  1643.            MUL        AB
  1644.            ADD        A,temp_Byte1
  1645.            MOV        temp_Byte1,A      ;temp_Byte1=年
  1646.            MOV        A,YUE
  1647.            JB         ACC.7,getw02
  1648.       MOV      A,#100
  1649.        ADD      A,temp_Byte1
  1650.        MOV     temp_Byte1,A             ;20世纪年+100
  1651.        MOV      A,YUE
  1652.        CLR      ACC.7
  1653. getw02: JNB     ACC.4,getw04
  1654.        ADD      A,#10
  1655.        CLR      ACC.4
  1656. getw04: MOV     temp_Byte2,A            ;temp_Byte2=月
  1657.        MOV      A,RIQI
  1658.        MOV      B,#16
  1659.        DIV      AB
  1660.        MOV      temp_Byte3,B
  1661.        MOV      B,#10
  1662.        MUL      AB
  1663.        ADD      A,temp_Byte3
  1664.        MOV      temp_Byte3,A            ;temp_Byte3=日
  1665.          MOV    A,temp_Byte1;
  1666.        ANL      A,#03h
  1667.        JNZ      getw10                  ;非闰年转移
  1668.        MOV      A,temp_Byte2
  1669.        CJNE     A,#3,getw06
  1670. getw06: JNC     getw10                  ;月大于  2 转移
  1671.        DEC      temp_Byte3              ;份小于等于   2,又是闰年,日减 1
  1672. getw10: MOV     A,temp_Byte2;
  1673.        LCALL    get_CorreCt             ;取月校正表数据
  1674.        ADD      A,temp_Byte1
  1675.        MOV      B,#7
  1676.        DIV      AB                      ;B放年加校正日数之和后除7 的余数 不先做这一步;有可能数据溢出
  1677.        MOV      A,temp_Byte1
  1678.        ANL      A,#0fCh
  1679.        RR       A
  1680.       RR        A                       ;以上年除  4 即闰年数
  1681.        ADD      A,B
  1682.        ADD      A,temp_Byte3
  1683.        MOV      B,#7
  1684.        DIV      AB
  1685.        MOV     XQI,B      ; time_week,B
  1686.        RET
  1687. get_COrreCt:
  1688.        MOVC     A,@A+PC
  1689.        RET
  1690.        DB 0,3,3,6,1,4,6,2,5,0,3,5

  1691.           END

  1692.         
复制代码
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]


X3208.rar

13.95 KB, 下载次数: 41, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:22225 发表于 2015-8-29 17:10 | 只看该作者
不错 谢谢分享
回复

使用道具 举报

板凳
ID:134271 发表于 2016-7-19 17:42 | 只看该作者
太厉害了,居然还有人用汇编做,可惜原理图太模糊了,尤其点阵驱动电路。
回复

使用道具 举报

地板
ID:99987 发表于 2020-2-28 22:24 | 只看该作者
原图能发个清楚的吗?谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表