原创 89C2051-自编的汇编语言的电子钟

2007-3-22 21:21 4893 7 7 分类: MCU/ 嵌入式

pdf


;功能:    按住key2 1.5S左右,时位闪烁,                          作报警信号,要求1KHz信号响100ms,500Hz信号响200ms

;          按key1  时位减1
 ;         按key2  时位加1
  ;        按住key1 1.5S左右,退出调整状态。
   ;       按住key2 1.5S左右,分位闪烁,
   ;       按key1  分位减1
   ;       按key2  分位加1
    ;      按住key1 1.5S左右,退出调整状态。
    ;      按住key2 1.5S左右,秒位闪烁,
    ;      按key1  秒位减1
     ;     按key2  秒位加1         
     ;     按住key1 1.5S左右,退出调整状态。
     ;     按住key2 1.5S左右,时位闪烁,如此循环


    ;      暂时没有添加设置闹钟的功能。
  
    ;      汇编语言好困难啊.......


    ;      在调整时位和分位时,开着中断,当调整秒的时候,就关闭中断。


        A0  BIT  P3.3
        A1  BIT  P3.7
        A2  BIT  P3.5
 ADDDIS   EQU  R0  ;显示程序查表值首地址寄存器
        BITCOUNT EQU  R1  ;显示程序中的位计数器
 SECDATA  EQU  R2  ;秒显示缓冲寄存器
 MINDATA  EQU  R3  ;分显示缓冲寄存器
 HOUDATA  EQU  R4  ;时显示缓冲寄存器
        DISCOUNT EQU  R5  ;调整状态时显示程序中的计数器,和DISBIT一起配合。
 INTCOUNT EQU  R6  ;中断计数器
        SHC  EQU  2CH  ;时的缓冲寄存器
        FHC  EQU  2BH  ;分的缓冲寄存器
        MHC  EQU  2AH  ;秒的缓冲寄存器
        SSW  EQU  25H  ;时十位显示值
        SGW  EQU  24H  ;时个位显示值
        FSW  EQU  23H  ;分十位显示值
        FGW  EQU  22H  ;分个位显示值
        MSW  EQU  21H  ;秒十位显示值
        MGW  EQU  20H  ;秒个位显示值
 REGA EQU  28H     ;暂存A值,类似堆栈
 TDIS EQU  26H    
 TSKEY BIT 26H.0   ;按键KEY1按下的标志位
        TSBIT BIT 26H.1   ;和TSBIT的四种组合决定时钟所处的状态,
 TFBIT BIT 26H.2   ;四种状态在显示程序里面里面也做相应状态闪烁的标志
                   ;TFBIT,TSBIT=00    正常的工作状态
     ;TFBIT,TSBIT=01    调整时钟状态
     ;TFBIT,TSBIT=10    调整分钟状态
     ;TFBIT,TSBIT=11    调整秒钟状态
 DISBIT BIT 26H.3  ;在调整时间时,DISBIT=0,相应的调整位灭;DISBIT=1时,就亮? 
        KEY1 BIT  P3.0   
 KEY2 BIT  P3.1
        ORG  0000H
        LJMP  MAIN
        ORG  000BH
        LJMP  INTT               ;43
 ORG  0050H
MAIN:   MOV  SECDATA,  #30H
        MOV  MINDATA,  #30H
        MOV  HOUDATA,  #09H
 MOV  DISCOUNT,  #40      ;修改此值可以改变在调整状态时的闪烁频率
        MOV  INTCOUNT , #00H
        MOV  TMOD, #01H
        MOV  TH0,  #3CH
        MOV  TL0,  #0B0H
 SETB  EA
        SETB  ET0
        SETB  TR0
DIS1:   MOV  TDIS, #00H
        ACALL  DISPLAY
        JNB  KEY2, TS
        AJMP  DIS1


;***********************判断KEY2按下的情况*************************


TS:     ACALL  DISPLAY
        ACALL  DISPLAY
 JB  KEY2, DIS1
        MOV  34H,#50
TS_1:   ACALL DISPLAY
        JB  KEY2, DIS1
        DJNZ  34H, TS_1
       
        SETB   TSBIT
        CLR    TFBIT
TS_2:   ACALL DISPLAY
        JNB  KEY2, TS_2
        AJMP  TSH         ;跳到调整小时程序


 


 


;************************************************************
;**********************调整时间等待按键按下******************


TSH:    SETB   TSBIT
        CLR    TFBIT
TSH_1:  ACALL  DISPLAY
        JNB    KEY1, PADA
        JNB    KEY2, PADA
        AJMP   TSH_1


;***********************调整分位的标志置位*******************


TSF:    CLR    TSBIT     ;TSBIT=0且TFBIT=1时代表调分标志位
        SETB   TFBIT 
        AJMP   TSH_1  
;***********************调整秒位的标志置位*******************
TSM:    CLR    TR0
        SETB   TFBIT
        SETB   TSBIT
        AJMP   TSH_1
;************************************************************
;************************************************************


 



PADA:   ACALL  DISPLAY
        ACALL  DISPLAY
        JNB    KEY1,  PADA_1    ;按下就跳
        JNB    KEY2,  PADA_2    ;按下就跳
;******************************************************
PADA_3: CLR   TSKEY
        JB    TSBIT, TSH_B
        JB    TFBIT, TSF_B
        AJMP  DIS1
TSH_B:  JB    TFBIT, TSM_B
        AJMP  TSH
TSF_B:  AJMP  TSF
TSM_B:  AJMP  TSM
;******************************************************


PADA_1: SETB  TSKEY
PADA_2: MOV   35H, #50  
PADA_6: ACALL DISPLAY          
        JNB   KEY1,  PADA_4    ;按下就跳
        JNB   KEY2,  PADA_4    ;按下就跳
        JNB   TSKEY, PADA_5    ;是KEY1按下吗?是就跳,做减1操作,否则表示是按下的是KEY2,做加1操作。
        JB    TSBIT, DECS
        JB    TFBIT, DECF
        SETB  TR0
        AJMP  DIS1
;*******************************************


PADA_4: DJNZ  35H,   PADA_6
PADA_7: ACALL DISPLAY          ;程序走到这里表示按键已经按下了1.5S,
        JNB   KEY1,  PADA_7    
        JNB   KEY2,  PADA_7    ;判断是放开没有,没有放开就等待
        JNB   TSKEY, PADA_8    ;判断是KEY1按下吗?不是就跳
        SETB  TR0
        CLR   TSKEY
        AJMP  DIS1


;*****************切换到下一个调整变量(时位调整,分位调整,秒位调整)********
PADA_8: CLR   TSKEY
        JB    TSBIT, TSH_A
        JB    TFBIT, TSF_A
        SETB  TR0
        AJMP  DIS1
TSH_A:  JB    TFBIT, TSM_A
        AJMP  TSF
TSF_A:  AJMP  TSM
TSM_A:  SETB  TR0
        AJMP  TSH


 


 


;*************************时,分,秒 加1程序********************


PADA_5: JB    TSBIT, INCS
        JB    TFBIT, INCF
        SETB  TR0
        AJMP  DIS1


INCS:   JB    TFBIT, INCM
INCS_1: CJNE  HOUDATA, #23H, INCS_2
        MOV   HOUDATA, #99H
INCS_2: MOV   A, HOUDATA
        ADD   A, #1        
        DA    A
        MOV   HOUDATA, A
        AJMP  PADA_3 


INCF:   CJNE  MINDATA, #59H, INCF_1
        MOV   MINDATA, #99H
INCF_1: MOV   A, MINDATA
        ADD   A, #1        
        DA    A
        MOV   MINDATA, A
        AJMP  PADA_3


INCM:   CJNE  SECDATA, #59H, INCM_1
        MOV   SECDATA, #99H
INCM_1: MOV   A, SECDATA
        ADD   A, #1
        DA    A
        MOV   SECDATA, A
        AJMP  PADA_3    


;***************************************时减1************************
DECS:   JB    TFBIT, DECM
        CJNE  HOUDATA, #00H, DECS_1
        MOV   HOUDATA, #24H
DECS_2: DEC   HOUDATA
        AJMP  PADA_3
DECS_1: MOV   A, HOUDATA
        ANL   A, #0FH
 CJNE  A, #00H, DECS_2
 MOV   A, HOUDATA
 DEC   A
        DA    A
 ADD   A , #04H
 SWAP  A
 DEC   A
 SWAP  A
 MOV   HOUDATA, A
 AJMP  PADA_3
;***************************************分减1************************
DECF:   CJNE  MINDATA, #00H, DECF_1
        MOV   MINDATA, #59H
 AJMP  PADA_3
DECF_2: DEC   MINDATA
        AJMP  PADA_3
DECF_1: MOV   A, MINDATA
        ANL   A, #0FH
 CJNE  A, #00H, DECF_2
 MOV   A, MINDATA
 DEC   A
        DA    A
 ADD   A , #04H
 SWAP  A
 DEC   A
 SWAP  A
 MOV   MINDATA, A
 AJMP  PADA_3
;***************************************秒减1************************
DECM:   CJNE  SECDATA, #00H, DECM_1
        MOV   SECDATA, #59H
 AJMP  PADA_3
DECM_2: DEC   SECDATA
        AJMP  PADA_3
DECM_1: MOV   A, SECDATA
        ANL   A, #0FH
 CJNE  A, #00H, DECM_2
 MOV   A, SECDATA
 DEC   A
        DA    A
 ADD   A , #04H
 SWAP  A
 DEC   A
 SWAP  A
 MOV   SECDATA, A
 AJMP  PADA_3


;*****************中断服务程序************************


INTT:   CLR   TR0                     ;1
        INC   INTCOUNT                ;40
        CJNE  INTCOUNT, #14H, YANS_5  ;41
        MOV   INTCOUNT, #00H          ;42
        PUSH  PSW                     ;2  
        MOV   REGA, A                 ;3
        NOP                           ;4


        CJNE  SECDATA, #59H, YANS_1   ;5
;*********************************  
        MOV   SECDATA, #99H           ;6
        CJNE  MINDATA, #59H, YANS_2   ;7
;*********************************
        MOV   MINDATA,#99H            ;8
        CJNE  HOUDATA, #23H, YANS_3   ;9
;*********************************   
        MOV   HOUDATA, #99H           ;10   
 
        ACALL YANS_4                  ;11


HOUR:   MOV   A,HOUDATA               ;12
        ADD   A,#01H                  ;13
        DA    A                       ;14
        MOV   HOUDATA, A              ;15           


MINUTE: MOV   A,MINDATA               ;16
        ADD   A,#01H                  ;17
        DA    A                       ;18
        MOV   MINDATA, A              ;19


SECOND: MOV   A, SECDATA              ;20  
        ADD   A, #01H                 ;21
        DA    A                       ;22
        MOV   SECDATA, A              ;23  


        MOV   A, REGA                 ;24
        POP   PSW                     ;25
JIESU:  SETB  TR0                     ;26
        RETI                          ;27     


YANS_1: MOV  TL0, #0C5H               ;28   YANS_1......YANS_5 里面的TL0和THO的值重装的不同,是因为在进入中断程序时
        MOV  TH0, #3CH                ;29   把1秒的时间也加到里面去了。就是说进入了中断程序后,虽然关闭了定时器中断,
        AJMP SECOND                   ;30   就自己计算了中断程序的时间,在重装TL0和TH0时减去了这段时间而保持了1秒钟的
YANS_2: MOV  TL0, #0CCH               ;31   精度。
        MOV  TH0, #3CH                ;32
        AJMP MINUTE                   ;33
YANS_3: MOV  TL0, #0D3H               ;34
        MOV  TH0, #3CH                ;35
        AJMP HOUR                     ;36
YANS_4: MOV  TL0, #0D6H               ;37
        MOV  TH0, #3CH                ;38
        RET                           ;39
YANS_5: MOV  TL0, #0BBH               ;44
        MOV  TH0, #3CH                ;45
 AJMP JIESU                    ;46



;************************显示程序*********************************
DISPLAY:
        MOV   SGW, HOUDATA      
        ANL   SGW, #0FH     ;时个位送数
        MOV   A, HOUDATA
 SWAP  A
        MOV   SSW, A
        ANL   SSW, #0FH     ;时十位送数
       
        MOV   FGW, MINDATA
        ANL   FGW, #0FH
        MOV   A, MINDATA
        SWAP  A
        MOV   FSW, A
        ANL   FSW, #0FH    
        
        MOV   MGW, SECDATA      
        ANL   MGW, #0FH
        MOV   A, SECDATA
        SWAP  A           
        MOV   MSW, A      
        ANL   MSW, #0FH


        MOV   DPTR, #TABLE
        MOV   ADDDIS, #20H
 MOV   BITCOUNT, #00H
       
 ACALL PADADIS  ; //A2 A1 A0=000, 送秒个位//
        ACALL DIS       
 
        ACALL PADADIS  ; //A2 A1 A0=001, 送秒十位//
        ACALL DIS


        ACALL PADADIS  ;//A2 A1 A0=010, 送分个位//
        ACALL DIS


        ACALL PADADIS  ;//A2 A1 A0=011, 送分十位//
        ACALL DIS


        ACALL PADADIS  ;//A2 A1 A0=100, 送时个位//
        ACALL DIS


        ACALL PADADIS ;//A2 A1 A0=101, 送时十位//
 ACALL DIS
 RET


DIS:    MOV  A,@ADDDIS
        MOVC A,@A+DPTR
        MOV  P1,A
        ACALL  DELAY_1MS 
        MOV  P1, #00H 
        INC  ADDDIS
        RET
;************************判断显示状态子程序********************


PADADIS:JB   TSBIT, TSDIS
        JB   TFBIT, TFDIS
 DEC  DISCOUNT
        CJNE DISCOUNT, #00H, PADADIS_1
 MOV  DISCOUNT, #40
PADADIS_1: AJMP DIS_2


TSDIS:  JB   TFBIT, TMDIS
        CJNE BITCOUNT, #04H, TSDIS_1
 AJMP DIS_4
TFDIS:  CJNE BITCOUNT, #02H, TFDIS_1
        AJMP DIS_4
TMDIS:  CJNE BITCOUNT, #00H, TMDIS_1
        AJMP DIS_4
TSDIS_1:CJNE BITCOUNT, #05H, DIS_2
        AJMP DIS_4
TFDIS_1:CJNE BITCOUNT, #03H, DIS_2
        AJMP DIS_4
TMDIS_1:CJNE BITCOUNT, #01H, DIS_2
        AJMP DIS_4


DIS_4:  DEC  DISCOUNT
        CJNE DISCOUNT, #00H, DIS_1
 MOV  DISCOUNT, #40
 CPL  DISBIT
DIS_1:  JB   DISBIT, DIS_2
        MOV  A, #06H
 AJMP DIS_3


DIS_2:  MOV  A, BITCOUNT
DIS_3:  RRC  A
        MOV  A0, C
 RRC  A
        MOV  A1, C
        RRC  A
        MOV  A2, C
 MOV  A,  BITCOUNT
 CJNE A, #05H, DIS_5
 MOV  A, SSW
 JNZ  DIS_5
 SETB A1
DIS_5: INC  BITCOUNT
 RET


;*****************延时1ms********************
DELAY_1MS: 
        MOV  30H, #14H
DEL_1MS:
        MOV  31H, #50H
        DJNZ  31H, $
        DJNZ  30H, DEL_1MS
        RET
;*****************显示表*********************
TABLE:  DB        03FH   ;0
        DB        006H   ;1
        DB        05BH   ;2
        DB        04FH   ;3
        DB        066H   ;4
        DB        06DH   ;5
        DB        07DH   ;6
        DB        007H   ;7
        DB        07FH   ;8
        DB        06FH   ;9
 
        END
;*************************************************************



       
      


 

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条