專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

可調(diào)時(shí)鐘程序(狀態(tài)機(jī))

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2010年10月01日   【字體:
/***************************************************************************************
         008.ASM
        用八位數(shù)碼管顯示時(shí)間,通過兩個(gè)按鍵改變顯示內(nèi)容及修改時(shí)間
       接線:J15.J16短接,P0接八位數(shù)碼管,P2接獨(dú)立鍵盤
                             2010.09.06  
  ***************************************************************************************/
  ORG 0000H
    LJMP MAIN
  ORG 001BH
    LJMP INT_T1
  ORG 0040H
MAIN:
    LCALL FRIST     ;上電初始化
LOOP:        ;主循環(huán)
 LCALL KEY_READ     ;讀鍵盤
 JBC 00H,N
 LJMP N0      ;無鍵,則跳到N0
N:
 LCALL CHAUNG   ;有鍵則去刷新顯示狀態(tài)
 LJMP LOOP
N0:       ;輸出當(dāng)前時(shí)分秒
    MOV R0,#60H 
 MOV R1,#07H
 MOV R5,#08H
 LCALL COUNT_OUTPUT  ;刷新輸出
 LCALL SHOW     ;輸出
 LCALL CHANG_TIME   ;按秒改變輸出時(shí)間
 LJMP LOOP

FRIST:
 MOV SP,#30H   ;設(shè)置堆棧
 MOV 45H,#01H      ;設(shè)置初始狀態(tài)為00H
 MOV P1,#0FFH       ;初始化P1口 
 MOV TMOD,#21H   ;設(shè)置定時(shí)器工作模式,T0為工作模式2,T1為工作模式1

 MOV 50H,#06H    ;初始化年月日 數(shù)碼管顯示
 MOV 51H,#00H
 MOV 52H,#09H
 MOV 53H,#00H
 MOV 54H,#00H
 MOV 55H,#01H
 MOV 56H,#00H
 MOV 57H,#02H

 MOV 46H,#14H  ;初始化年月日
 MOV 47H,#0AH
 MOV 48H,#09H
 MOV 49H,#06H 

 MOV 60H,#00H ;初始化時(shí) 分 秒 數(shù)碼管顯示
 MOV 61H,#00H
 MOV 62H,#08H
 MOV 63H,#05H
 MOV 64H,#02H
 MOV 65H,#02H
 MOV 66H,#00H
 MOV 67H,#00H

 MOV 58H,#16H   ;初始化時(shí)分秒
 MOV 59H,#3AH
 MOV 68H,#00H

 MOV R6,#19H  ;定時(shí)T1計(jì)數(shù)
 MOV R7,#28H

 MOV TH0,#15H     ;賦T0定時(shí)初值
 MOV TL0,#0A0H
 MOV TH1,#06H   ;賦T1定時(shí)初值
 MOV TL1,#06H
 SETB TR1

 CLR 00H        ;初始化按鍵標(biāo)志為“0” , 即 無 鍵
 CLR 01H        ;初始化鍵值為“0”,即A
 CLR 02H        ;初始化按鍵長短為“0”,即短按鍵  
 CLR 03H         ;初始化定時(shí)T1標(biāo)志
 CLR 04H         ;初始時(shí)間更改標(biāo)志位(秒,分,時(shí),日,月,年)
 CLR 05H 
 CLR 06H
 CLR 07H
 CLR 08H
 CLR 09H
 CLR 0AH
 CLR 0BH         ;01狀態(tài)標(biāo)志位,表示為01狀態(tài)

    MOV IE,#88H    ;開定時(shí)中斷
 RET

 /*輸出計(jì)算子程序*/
COUNT_OUTPUT:
    JBC 04H,COUNT_S     ;秒改變,則計(jì)算出顯示值送相應(yīng)內(nèi)存
 LJMP COUNT_M
COUNT_S:        ;否則去計(jì)算分
    MOV B,#0AH       ;秒/10。商送61H,余數(shù)送60H
 MOV A,68H
 DIV AB
 MOV 61H,A
 MOV 60H,B
COUNT_M:
 JBC 05H,COUNT_M0     ;分改變,則計(jì)算出顯示值送相應(yīng)內(nèi)存
 LJMP COUNT_H    ;否則去計(jì)算時(shí)
COUNT_M0:
    MOV B,#0AH     ;分/10,商送63H,余數(shù)送62H
 MOV A,59H
 DIV AB
 MOV 63H,A
 MOV 62H,B
COUNT_H:
    JBC 06H,COUNT_H0   ;時(shí)改變,則計(jì)算出顯示值送相應(yīng)內(nèi)存
 LJMP COUNT_D     ;否則去計(jì)算日
COUNT_H0:
    MOV B,#0AH     ;時(shí)/10,商送65H,余數(shù)送64H
 MOV A,58H
 DIV AB
 MOV 65H,A
 MOV 64H,B
COUNT_D:       ;日改變,則計(jì)算出顯示值送相應(yīng)內(nèi)存
    JBC 07H,COUNT_D0    ;否則去計(jì)算月
 LJMP COUNT_MON
COUNT_D0:        ;日/10,商送51H,余數(shù)送50H
    MOV B,#0AH
 MOV A,49H
 DIV AB
 MOV 51H,A
 MOV 50H,B
COUNT_MON:
    JBC 08H,COUNT_MON0      ;月改變,則計(jì)算出顯示值送相應(yīng)內(nèi)存
 LJMP COUNT_YL       ;否則去計(jì)算年(L)
COUNT_MON0:
    MOV B,#0AH      ;月/10,商送53H,余數(shù)送52H
 MOV A,48H
 DIV AB
 MOV 53H,A
 MOV 52H,B
COUNT_YL:
    JBC 09H,COUNT_YL0     ;年低位改變,則計(jì)算出顯示值送相應(yīng)內(nèi)存
 LJMP COUNT_YH      ;否則去計(jì)算年(H)
COUNT_YL0:
    MOV B,#0AH       ;年(L)/10,商送55H,余數(shù)送54H
 MOV A,47H
 DIV AB
 MOV 55H,A
 MOV 54H,B
COUNT_YH:         ;年高改變,則計(jì)算出顯示值送相應(yīng)內(nèi)存
    JBC 0AH,COUNT_YH0       ;否則子程序返回
 LJMP COUNT_RETURN
COUNT_YH0:
 MOV B,#0AH        ;年(H)/10,商送57H,余數(shù)送56H
 MOV A,46H
 DIV AB
 MOV 57H,A
 MOV 56H,B               
COUNT_RETURN:
     RET

/*時(shí)間修改子程序*/
CHAUNG:
     
STAR:
  MOV A,45H       ;讀狀態(tài)值
  CJNE A,#01H,CHAUNG0    ;狀態(tài)值=01H,則轉(zhuǎn)H_M_S0,否則進(jìn)行下一個(gè)判斷
  LCALL H_M_S0
  LJMP CHAUNG10
CHAUNG0:
     CJNE A,#02H,CHAUNG1    ;狀態(tài)值=02H,則轉(zhuǎn)H_M_S1,否則進(jìn)行下一個(gè)判斷
  LCALL H_M_S1
  LJMP CHAUNG10
CHAUNG1:
     CJNE A,#04H,CHAUNG3    ;狀態(tài)值=04H,則轉(zhuǎn)H_M_S2,否則進(jìn)行下一個(gè)判斷
  LCALL H_M_S2
  LJMP CHAUNG10
CHAUNG3:
     CJNE A,#03H,CHAUNG4    ;狀態(tài)值=03H,則轉(zhuǎn)Y_M_D0,否則進(jìn)行下一個(gè)判斷
  LCALL Y_M_D0
  LJMP CHAUNG10
CHAUNG4:
     CJNE A,#06H,CHAUNG5    ;狀態(tài)值=06H,則轉(zhuǎn)Y_M_D1,否則進(jìn)行下一個(gè)判斷
  LCALL Y_M_D1
  LJMP CHAUNG10
CHAUNG5:
     CJNE A,#0CH,CHAUNG6     ;狀態(tài)值=0cH,則轉(zhuǎn)Y_M_D2,否則進(jìn)行下一個(gè)判斷
  LCALL Y_M_D2
CHAUNG6:
     CJNE A,#18H,CHAUNG7     ;狀態(tài)值=18H,則轉(zhuǎn)Y_M_D3,否則進(jìn)行下一個(gè)判斷
  LCALL Y_M_D3
  LJMP CHAUNG10
CHAUNG7:
     CJNE A,#07H,CHAUNG8     ;狀態(tài)值=07H,則轉(zhuǎn)S_CLOCK0,否則進(jìn)行下一個(gè)判斷
  LCALL S_CLOCK0
  LJMP CHAUNG10
CHAUNG8:
     CJNE A,#0EH,CHAUNG9     ;狀態(tài)值=0eH,則轉(zhuǎn)S_CLOCK1,否則進(jìn)行下一個(gè)判斷
  LCALL S_CLOCK1
  LJMP CHAUNG10
CHAUNG9:
     CJNE A,#1CH,CHAUNG10    ;狀態(tài)值=07H,則轉(zhuǎn)S_CLOCK2,否則進(jìn)行下一個(gè)判斷
  LCALL S_CLOCK2
  LJMP CHAUNG10
CHAUNG10:              ;子程序返回
     JBC 0BH,STAR
     RET


/*狀態(tài)01修理子程序*/
H_M_S0:
     JB 01H,S_01       ;判斷A鍵,B鍵
  MOV 45H,#02H       ;A鍵,狀態(tài)轉(zhuǎn)為02H
  LJMP S_01_RETURN
S_01:           ;B鍵,狀態(tài)轉(zhuǎn)為03H
     MOV 45H,#03H
S_01_RETURN:
     SETB 0BH
  RET


/*狀態(tài)02修理子程序*/
H_M_S1:
     MOV 69H,#00H        ;定時(shí)標(biāo)志,定時(shí)到,回到A狀態(tài)
LOOP_02:
     MOV R0,#64H        ;設(shè)置顯示內(nèi)容
  MOV R1,#03H
  MOV R5,#02H
  LCALL COUNT_OUTPUT       ;計(jì)算顯示數(shù)據(jù)
  LCALL SHOW         ;顯示
  LCALL KEY_READ      ;讀鍵盤
     JBC 00H,S_02      ;有鍵,則去判斷長按短按
  INC 69H        ;無鍵,定時(shí)標(biāo)志+1
  MOV A,69H
  CJNE A,#0FFH,LOOP_02     ;定時(shí)到,狀態(tài)轉(zhuǎn)為01H,子程序返回
  MOV 45H,#01H
  LJMP S_02_RETURN
S_02:
     MOV 69H,#00H       ;有按鍵,清零定時(shí)標(biāo)志
     JBC 02H,S_02_0        ;長按,去判斷A鍵B鍵
  JBC 01H,S_02_1        ;短按,去判斷A鍵B鍵
  INC 58H         ;A鍵,時(shí)+1
  SETB 06H          ;置位,時(shí)改變標(biāo)志
  LJMP LOOP_02
S_02_0:
     JBC 01H,S_02_2        ;長按,B鍵,狀態(tài)變?yōu)榱?1H,并子程序返回
  MOV 45H,#04H        ;A鍵,狀態(tài)轉(zhuǎn)為04H
  SETB 0BH
  LJMP S_02_RETURN
S_02_1:           ;短按B鍵,時(shí)-1,并置位時(shí)改變標(biāo)志
      DEC 58H
   SETB 06H
   LJMP LOOP_02
S_02_2:
     MOV 45H,#01H
S_02_RETURN:
     MOV 68H,#00H
  RET

/*狀態(tài)04處理子程序*/
H_M_S2:
    MOV 69H,#00H        ;定時(shí)標(biāo)志,定時(shí)到,回到A狀態(tài)
LOOP_04:
     MOV R0,#62H        ;設(shè)置顯示內(nèi)容
  MOV R1,#05H
  MOV R5,#02H
  LCALL COUNT_OUTPUT       ;計(jì)算顯示數(shù)據(jù)
  LCALL SHOW         ;顯示
  LCALL KEY_READ      ;讀鍵盤
     JBC 00H,S_04      ;有鍵,則去判斷長按短按
  INC 69H        ;無鍵,定時(shí)標(biāo)志+1
  MOV A,69H
  CJNE A,#0FFH,LOOP_04     ;定時(shí)到,狀態(tài)轉(zhuǎn)為01H,子程序返回
  MOV 45H,#01H
  LJMP S_02_RETURN
S_04:
     MOV 69H,#00H       ;有按鍵,清零定時(shí)標(biāo)志
     JBC 02H,S_04_0        ;長按,去判斷A鍵B鍵
  JBC 01H,S_04_1        ;短按,去判斷A鍵B鍵
  INC 59H         ;A鍵,分+1
  SETB 05H          ;置位,分改變標(biāo)志
  LJMP LOOP_04
S_04_0:
     JBC 01H,S_04_2        ;長按,B鍵,狀態(tài)變?yōu)榱?1H,并子程序返回
  MOV 45H,#01H        ;A鍵,狀態(tài)轉(zhuǎn)為08H
  LJMP S_04_RETURN
S_04_1:           ;短按B鍵,分-1,并置位分改變標(biāo)志
      DEC 59H
   SETB 05H
   LJMP LOOP_04
S_04_2:
     MOV 45H,#01H
S_04_RETURN:
     MOV 68H,#00H 
  RET


/*狀態(tài)03修理子程序*/
Y_M_D0:
     MOV R0,#50H
  MOV R1,#07H
  MOV R5,#08H
  LCALL  COUNT_OUTPUT 
  LCALL SHOW
  LCALL KEY_READ 
     JB 01H,S_03       ;判斷A鍵,B鍵
  MOV 45H,#06H       ;A鍵,狀態(tài)轉(zhuǎn)為02H
  LJMP S_03_RETURN
S_03:           ;B鍵,狀態(tài)轉(zhuǎn)為03H
     MOV 45H,#07H
S_03_RETURN:
     SETB 0BH       
     RET


/*狀態(tài)06修理子程序*/
Y_M_D1:
     MOV 69H,#00H        ;定時(shí)標(biāo)志,定時(shí)到,回到A狀態(tài)
LOOP_06:
     MOV R0,#54H        ;設(shè)置顯示內(nèi)容
  MOV R1,#03H
  MOV R5,#04H
  LCALL COUNT_OUTPUT       ;計(jì)算顯示數(shù)據(jù)
  LCALL SHOW         ;顯示
  LCALL KEY_READ      ;讀鍵盤
     JBC 00H,S_06      ;有鍵,則去判斷長按短按
  INC 69H        ;無鍵,定時(shí)標(biāo)志+1
  MOV A,69H
  CJNE A,#0FFH,LOOP_06     ;定時(shí)到,狀態(tài)轉(zhuǎn)為01H,子程序返回
  MOV 45H,#01H
  LJMP S_06_RETURN
S_06:
     MOV 69H,#00H       ;有按鍵,清零定時(shí)標(biāo)志
     JBC 02H,S_06_0        ;長按,去判斷A鍵B鍵
  JBC 01H,S_06_1        ;短按,去判斷A鍵B鍵
  INC 47H         ;A鍵,年+1
  MOV A,47H
  CJNE A,#64H,S_066
  MOV 47H,#00H
  INC 46H
  SETB 0AH
S_066:
  SETB 09H          ;置位,年改變標(biāo)志
  LJMP LOOP_06
S_06_0:
     JBC 01H,S_06_2        ;長按,B鍵,狀態(tài)變?yōu)榱?1H,并子程序返回
  MOV 45H,#01H        ;A鍵,狀態(tài)轉(zhuǎn)為08H
  LJMP S_06_RETURN
S_06_1:           ;短按B鍵,年-1,并置位年改變標(biāo)志
      DEC 47H
   MOV A,47H
   CJNE A,#-1,S_0666
   MOV 47H,#00H
   DEC 46H
   SETB 0AH
S_0666:
   SETB 09H
   LJMP LOOP_06
S_06_2:
     MOV 45H,#01H
S_06_RETURN:
     RET

/*狀態(tài)0C修理子程序*/
Y_M_D2:
     MOV 69H,#00H        ;定時(shí)標(biāo)志,定時(shí)到,回到A狀態(tài)
LOOP_0C:
     MOV R0,#52H        ;設(shè)置顯示內(nèi)容
  MOV R1,#05H
  MOV R5,#02H
  LCALL COUNT_OUTPUT       ;計(jì)算顯示數(shù)據(jù)
  LCALL SHOW         ;顯示
  LCALL KEY_READ      ;讀鍵盤
     JBC 00H,S_0C      ;有鍵,則去判斷長按短按
  INC 69H        ;無鍵,定時(shí)標(biāo)志+1
  MOV A,69H
  CJNE A,#0FFH,LOOP_0C     ;定時(shí)到,狀態(tài)轉(zhuǎn)為01H,子程序返回
  MOV 45H,#01H
  LJMP S_0C_RETURN
S_0C:
     MOV 69H,#00H       ;有按鍵,清零定時(shí)標(biāo)志
     JBC 02H,S_0C_0        ;長按,去判斷A鍵B鍵
  JBC 01H,S_0C_1        ;短按,去判斷A鍵B鍵
  INC 48H         ;A鍵,月+1
  SETB 08H          ;置位,月改變標(biāo)志
  LJMP LOOP_0C
S_0C_0:
     JBC 01H,S_0C_2        ;長按,B鍵,狀態(tài)變?yōu)榱?1H,并子程序返回
  MOV 45H,#01H        ;A鍵,狀態(tài)轉(zhuǎn)為08H
  LJMP S_0C_RETURN
S_0C_1:           ;短按B鍵,月-1,并置位月改變標(biāo)志
      DEC 48H
   SETB 08H
   LJMP LOOP_0C
S_0C_2:
     MOV 45H,#01H
S_0C_RETURN:
     RET

/*狀態(tài)18修理子程序*/
Y_M_D3:
     MOV 69H,#00H        ;定時(shí)標(biāo)志,定時(shí)到,回到A狀態(tài)
LOOP_18:
     MOV R0,#50H        ;設(shè)置顯示內(nèi)容
  MOV R1,#07H
  MOV R5,#02H
  LCALL COUNT_OUTPUT       ;計(jì)算顯示數(shù)據(jù)
  LCALL SHOW         ;顯示
  LCALL KEY_READ      ;讀鍵盤
     JBC 00H,S_18      ;有鍵,則去判斷長按短按
  INC 69H        ;無鍵,定時(shí)標(biāo)志+1
  MOV A,69H
  CJNE A,#0FFH,LOOP_18     ;定時(shí)到,狀態(tài)轉(zhuǎn)為01H,子程序返回
  MOV 45H,#01H
  LJMP S_18_RETURN
S_18:
     MOV 69H,#00H       ;有按鍵,清零定時(shí)標(biāo)志
     JBC 02H,S_18_0        ;長按,去判斷A鍵B鍵
  JBC 01H,S_18_1        ;短按,去判斷A鍵B鍵
  INC 49H         ;A鍵,日+1
  SETB 07H          ;置位,日改變標(biāo)志
  LJMP LOOP_18
S_18_0:
     JBC 01H,S_18_2        ;長按,B鍵,狀態(tài)變?yōu)榱?1H,并子程序返回
  MOV 45H,#01H        ;A鍵,狀態(tài)轉(zhuǎn)為08H
  LJMP S_18_RETURN
S_18_1:           ;短按B鍵,日-1,并置位日改變標(biāo)志
      DEC 49H
   SETB 07H
   LJMP LOOP_18
S_18_2:
     MOV 45H,#01H
S_18_RETURN:
     MOV 68H,#00H 
     RET

/*狀態(tài)07修理子程序*/
S_CLOCK0:
     JB 01H,S_07       ;判斷A鍵,B鍵
  MOV 45H,#01H       ;A鍵,狀態(tài)轉(zhuǎn)為02H
  LJMP S_07_RETURN
S_07:           ;B鍵,狀態(tài)轉(zhuǎn)為03H
     MOV 45H,#07H
S_07_RETURN:
     SETB 0BH       
     RET


/*狀態(tài)0E修理子程序*/
S_CLOCK1:
    
LOOP_0E:
     MOV R0,#62H        ;設(shè)置顯示內(nèi)容
  MOV R1,#05H
  MOV R5,#02H
  LCALL COUNT_OUTPUT       ;計(jì)算顯示數(shù)據(jù)
  LCALL SHOW         ;顯示
  LCALL KEY_READ      ;讀鍵盤
     JBC 00H,S_0E      ;有鍵,則去判斷長按短按
  INC 69H        ;無鍵,定時(shí)標(biāo)志+1
  MOV A,69H
  CJNE A,#0FFH,LOOP_0E     ;定時(shí)到,狀態(tài)轉(zhuǎn)為01H,子程序返回
  MOV 45H,#01H
  LJMP S_18_RETURN
S_0E:
     MOV 69H,#00H       ;有按鍵,清零定時(shí)標(biāo)志
     JBC 02H,S_0E_0        ;長按,去判斷A鍵B鍵
  JBC 01H,S_0E_1        ;短按,去判斷A鍵B鍵
  INC 59H         ;A鍵,分+1
  SETB 05H          ;置位,時(shí)改變標(biāo)志
  LJMP LOOP_0E
S_0E_0:
     JBC 01H,S_0E_2        ;長按,B鍵,狀態(tài)變?yōu)榱?1H,并子程序返回
  MOV 45H,#01H        ;A鍵,狀態(tài)轉(zhuǎn)為08H
  LJMP S_0E_RETURN
S_0E_1:           ;短按B鍵,分-1,并置位時(shí)改變標(biāo)志
      DEC 59H
   SETB 05H
   LJMP LOOP_0E
S_0E_2:
     MOV 45H,#01H
S_0E_RETURN:
     MOV 68H,#00H 
     RET
   
/*狀態(tài)1C修理子程序*/
S_CLOCK2:

LOOP_1C:
     MOV R0,#62H        ;設(shè)置顯示內(nèi)容
  MOV R1,#05H
  MOV R5,#02H
  LCALL COUNT_OUTPUT       ;計(jì)算顯示數(shù)據(jù)
  LCALL SHOW         ;顯示
  LCALL KEY_READ      ;讀鍵盤
     JBC 00H,S_1C      ;有鍵,則去判斷長按短按
  INC 69H        ;無鍵,定時(shí)標(biāo)志+1
  MOV A,69H
  CJNE A,#0FFH,LOOP_1C     ;定時(shí)到,狀態(tài)轉(zhuǎn)為01H,子程序返回
  MOV 45H,#01H
  LJMP S_1C_RETURN
S_1C:
     MOV 69H,#00H       ;有按鍵,清零定時(shí)標(biāo)志
     JBC 02H,S_1C_0        ;長按,去判斷A鍵B鍵
  JBC 01H,S_1C_1        ;短按,去判斷A鍵B鍵
  INC 59H         ;A鍵,分+1
  SETB 05H          ;置位,時(shí)改變標(biāo)志
  LJMP LOOP_1C
S_1C_0:
     JBC 01H,S_1C_2        ;長按,B鍵,狀態(tài)變?yōu)榱?1H,并子程序返回
  MOV 45H,#01H        ;A鍵,狀態(tài)轉(zhuǎn)為08H
  LJMP S_1C_RETURN
S_1C_1:           ;短按B鍵,分-1,并置位時(shí)改變標(biāo)志
      DEC 59H
   SETB 05H
   LJMP LOOP_1C
S_1C_2:
     MOV 45H,#01H
S_1C_RETURN:
     MOV 68H,#00H 
     RET

 


/*時(shí)間按秒增長子程序*/
CHANG_TIME:
     JBC 03H,C_TIME      ;秒定時(shí)標(biāo)志是否為1,為1則去改變時(shí)間,否則子程序返回
  LJMP C_RETURN
C_TIME:
     MOV A,68H       ;讀出秒,加1,判斷是否大于等于60,是則送#00H到68H,否則將秒寫回68H
  INC A
  SETB 04H
  CJNE A,#3CH,S       ;僅當(dāng)秒大于等于60時(shí),才去改變分
  MOV 68H,#00H
  LJMP M0
S:
     MOV 68H,A          
  LJMP C_RETURN
M0:
     MOV A,59H         ;讀出分,加1,判斷是否大于等于60,是則送#00H到59H,否則將秒寫回59H
  INC A
  SETB 05H
  CJNE A,#3CH,M1      ;僅當(dāng)分大于等于60時(shí),才去改變時(shí)
  MOV 59H,#00H
  LJMP H0
M1:
     MOV 59H,A
  LJMP C_RETURN
H0:
     MOV A,58H        ;讀出時(shí),加1,判斷是否大于等于24,是則送#00H到58H,否則將秒寫回58H
  INC A
  SETB 06H
  CJNE A,#18H,H1       ;僅當(dāng)時(shí)大于等于24時(shí),才去改變?nèi)?  MOV 58H,#00H
  LJMP DAY0
H1: 
     MOV 58H,A
  LJMP C_RETURN
DAY0:
     MOV A,49H         ;讀出日,加1,判斷是否大于等于31,是則送#01H到49H,否則將秒寫回49H
  INC A
  SETB 07H
  CJNE A,#1EH,DAY1        ;僅當(dāng)日大于等于30時(shí),才去改變月
  MOV 49H,#01H
  LJMP MON0
DAY1:
     MOV 49H,A
  LJMP C_RETURN
MON0:
     MOV A,48H        ;讀出月,加1,判斷是否大于等于13,是則送#01H到48H,否則將秒寫回48H
  INC A
  SETB 08H
  CJNE A,#0CH,MON1      ;僅當(dāng)月大于等于13時(shí),才去改變年
  MOV 48H,#01H
  LJMP YEARL0
MON1:
     MOV 48H,A
  LJMP C_RETURN
YEARL0:
     MOV A,47H       ;讀出年(L),加1,判斷是否大于等于100,是則送#00H到48H,否則將秒寫回47H
  INC A
  SETB 09H
  CJNE A,#64H,YEARL1     ;僅當(dāng)年(L)大于等于100時(shí),才去改變年(H)
  MOV 47H,#00H
  LJMP YAERH0
YEARL1:
     MOV 47H,A
  LJMP C_RETURN
YAERH0:
     MOV A,46H       ;讀出年(H),加1,判斷是否大于等于100,是則送#00H到48H,否則將秒寫回46H
  INC A
  SETB 0AH
  CJNE A,#64H,YEARH1
  MOV 46H,#00H
  LJMP C_RETURN
YEARH1:
  MOV 46H,A
                         
C_RETURN:
     RET

/*數(shù)碼管顯示子程序,R0存顯示內(nèi)容首址,R1存位選首址 ,*/


SHOW:
 MOV DPTR,#LED_DATA
S2:
 MOV A,R1
 RL A
 RL A
 MOV P2,A
 MOV A,@R0
 MOVC A,@A+DPTR
 CPL A
 MOV P0,A
 INC R0
 DEC R1
 MOV R4,#01H
 LCALL DELAY
 DJNZ R5,S2
 MOV R4,#01H
    LCALL DELAY
 RET


/*鍵盤掃描子程序*/

 


KEY_READ:
    JB P1.0,NEXT
 MOV R4,#64H
 LCALL DELAY
 JB P1.0,NEXT
 SETB TR0
 SETB 00H
 CLR 01H
 JNB P1.0,$
 CLR TR0
 JNB TF0,KEY_RETUN
 SETB 02H
 LJMP KEY_RETUN
NEXT:
    JB P1.2,KEY_RETUN
 MOV R4,#64H
 LCALL DELAY
 JB P1.2,KEY_RETUN
 SETB TR0
 SETB 00H
 SETB 01H
 JNB P1.2,$
 CLR TR0
 JNB TF0,KEY_RETUN
 SETB 02H
 LJMP KEY_RETUN

KEY_RETUN:
    MOV TH0,#15H     ;重賦T0定時(shí)初值
 MOV TL0,#0A0H
    CLR TF0
 RET    
    
/*定時(shí)器T1中斷服務(wù)子程序*/ 
  
INT_T1:
    PUSH ACC
    DJNZ R6,INT_1
 MOV R6,#50H
 DJNZ R7,INT_1
 MOV R7,#32H 
 SETB 03H
INT_1:
 POP ACC
    RETI 
    
/*延時(shí)子程序,R2,R3為定時(shí)常數(shù),R4為定時(shí)變量*/

DELAY:
D: MOV R2,#0AH
D0: MOV R3,#0AH
D1: DJNZ R3,D1
    DJNZ R2,D0
 DJNZ R4,D
 RET     

 

 

/*數(shù)碼管顯示代碼,0~F*/

LED_DATA:
     DB 03H,9FH,25H,0DH,99H,49H,41H,1FH
  DB 01H,09H,11H,0C1H,63H,85H,61H,71H


  END    

關(guān)閉窗口

相關(guān)文章