⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock1.asm

📁 一个基于51单片机的时钟电路设计源代码
💻 ASM
字号:
;********************************************************************
;****************************PROGRAM FOR CLOCK***********************
;********************************************************************

                                ;DESCRIPTION: CLOCK PROGRAM INCULED KEY AND DISPLAY

                                ;AUTHORS:     WEIHONGLIN

                                ;DATE:        31ST,JULY,2003

                                ;VER:         1.0
;********************************************************************

      ORG      0000h            ;留出中断入口
      LJMP     MAIN

      ORG      0Bh
      LJMP     TIME

      ;ORG      000bH
      ;RETI

      ORG      0013H
      RETI

      ORG      001BH
      RETI

      ORG      0023H
      RETI

      ORG      0030H


;********************************************************************
;DESCRIPTION:                   p0作为输出口
                                ;p1.0-1.5作为片选信号口,p3.0作为led闪烁信号
                                ;R0作为输入七段码缓冲区
;********************************************************************
;******************************INHITE********************************
MAIN:

      MOV      TMOD,#01h        ;初始化时片选信号

      MOV      P1,#10000000B    ;初化显示缓冲区 显示00: 00 00

      MOV      R0,#0H

      MOV      R1,#9H

      MOV      08H,#0H          ;INHITE THE AREA OF TIMER

      MOV      09H,#0H

      MOV      0AH,#0H

      MOV      0BH,#0H

      MOV      0CH,#0H

      MOV      0DH,#0H

      MOV      0EH,#0H

      MOV      0FH,#0H

      SETB     P2.1             ;PREPARE FOR DEYBORD

      SETB     P2.2

      SETB     P2.3

      MOV      SP,#31H          ;inhite the stack

      SETB     EA               ;SET INTERUPTION ENABLE

      SETB     ET0

      MOV      TH0,#0B1H        ;LOAD VALUE TO TIMER

      MOV      TL0,#0E0H

      SETB     TR0
WAIT:

      AJMP     $                ;WAIT FOR THE INTERUPTION

;********************************************************************
;DESCRIPTIONS:
      ;以下是时间中断程序
      ;每次中断显示片信号左移一位
      ;软件计数,实现秒计数,分计数,秒计数
      ;每半秒钟ledlamp闪一次。
;********************************************************************
;****************************TIMER***********************************
TIME:

       MOV      TH0,#0ffH       ;LOAD VALUE

       MOV      TL0,#0daH

       CLR      RS1

       SETB     RS0             ;use the the 1st command register

       INC      R0              ;count the interuption times

       CJNE     R0,#251,DISP    ;count 250 times

       CPL      P3.0            ;light on half second and shut down half second

       INC      R1              ;r0 is not large enough to contain the data 500  so r1 is nessesury

       MOV      R0,#0H          ;reset the r0 register

       CJNE     R1,#3,DISP

       MOV      R1,#0H          ;reset the r1 register

       INC      R2              ;THE LOW BIT OF SECOND

       CJNE     R2,#10,DISP

       MOV      R2,#0H          ;RESET THE R2 REGISTER

       INC      R3              ;THE HIGHT BIT OF SECOND

       CJNE     R3,#6,DISP      ;CHECK THE R3 REGISTER

       MOV      R3,#0H          ;RESET THE R3 REGISTER

       INC      R4              ;THE LOW BIT OF MINUTE

       CJNE     R4,#10,DISP     ;CHECK THE R4 RIGISTER

       MOV      R4,#0H          ;RESET THE R4 RIGISTER

       INC      R5              ;THE HIGHT BIT OF MINUTE

       CJNE     R5,#6,DISP      ;CHECK THE HIGHTBIT OF MINUTE

       MOV      R5,#0H          ;RESET THE R5 REGISTER

       INC      R6              ;THE LOW BIT OF HOURS

       CJNE     R7,#1,CONTINU   ;CHECK THE HIGHT BIT OF HOURS

       CJNE     R6,#2,DISP      ;CHECK THE LOW BIT OF HOURS

       MOV      R6,#0H          ;RESET THE R6 REGISTER

       MOV      R7,#0H          ;RESET THE R7 REGISTER
CONTINU:
       CJNE     R6,#10,DISP     ;CHECK THE LOW BIT OF HOURS

       MOV      R6,#0H          ;RESET THE R6 REGISTER

       INC      R7              ;THE HIGHT BIT OF HOURS
;********************************************************************
;********************************DISPLAY*****************************
;DISCRIPTIONS:
              ;CONTROL THE STATUS OF LED DISPLAYERS
              ;GET THE POSITION INFORMATION FROM THE I/O P1
              ;GET THE DISPLAY VALUE BY THE "DIVED" SECTION
              ;USE THE VALUE AS ADDRESS THEN CAN FIND THE SEVEN SECTION CODE
              ;PUT THE SEVEN SECTION CODE INTO THE R0 BUFFER(OUTPUT BUFFER)
DISP:

       MOV      DPTR,#TABLE

       MOV      A,P1

       RL       A               ;THE POSITION OF HIGHT BIT MOVE LEFT BY ONE STEP

       MOV      P0,#0FFH        ;CLOSE THE LED_LAMP

       MOV      P1,A

       CLR      RS0             ;USE THE FIRST RIGISTER GROUP

       CLR      RS1

       INC      R1              ;AND R1 INCREACE BY 1

       MOV      A,@R1

       MOVC     A,@A+DPTR       ;WE GET THE DATA WANTED TO SHOW ON LED

       MOV      R0,A            ;

       MOV      p0,r0           ;show

       CJNE     R1,#15,NEXT2

       MOV      R1,#9H

NEXT2:
       JNB      P1.5,KEY1

       MOV      P1,#10000000B   ;


;********************************************************************
;**********************************KEY*******************************

;DISCRIPTION:                   THE NEXT CODE WILL CHECK THE KEY STATU
                                ;
KEY1:


       JB       P2.1,KEY2       ;IF KEY1 HAVE NOT BEEN PRESS DOWN

       MOV      A,#20           ;KEEP PRESSED DOWN MORE THEN 40mS IS INVALID

       CJNE     A,02H,CHECKCY1   ;IF R2>A THEN CHECK "CY"

       INC      R2              ;IF A=R2 THEN R2 INCREACE BY STEP 1

       LJMP     CHANGE1         ;
CHECKCY1:
       JB       CY,CHANGE1      ;CHECK IF R2>A

       INC      R2              ;IF NOT R2>1 THEN R2 INCREACE BY STEP 1

       LJMP     CHANGE1         ;

KEY2:
       SETB     P2.4

       JB       P2.2,KEY3       ;IF KEY2 HAVE NOT BEEN PRESS DOWN

       MOV      A,#20           ;KEEP PRESSED DOWN MORE THEN 40mS IS INVALID

       CJNE     A,03H,CHECKCY2   ;IF R3>A THEN CHECK "CY"

       INC      R3              ;IF A=R3 THEN R3 INCREACE BY STEP 1

       LJMP     CHANGE1         ;
CHECKCY2:
       JB       CY,CHANGE1      ;CHECK IF R3>A

       INC      R3              ;IF NOT R3>A THEN R3 INCREACE BY STEP 1

       LJMP     CHANGE1         ;
KEY3:
       SETB     P2.5

       JB       P2.3,P26       ;IF KEY3 HAVE NOT BEEN PRESS DOWN

       MOV      A,#20           ;KEEP PRESSED DOWN MORE THEN 40mS IS INVALID

       CJNE     A,04H,CHECKCY3   ;IF R4>A THEN CHECK "CY"

       INC      R4              ;IF A=R4 THEN R4 INCREACE BY STEP 1

       LJMP     CHANGE1
P26:
       SETB     P2.6
CHECKCY3:
       JB       CY,CHANGE1      ;CHECK IF R4>A

       INC      R4              ;IF NOT R4>A THEN R4 INCREACE BY STEP 1

       LJMP     CHANGE1         ;
CHANGE1:
       JNB      P2.4,CHANGE2

       JNB      CY,RESETR2

       ;ADD HOUR

       MOV      R2,#0

       CLR      CY

       LJMP     CHANGE2

RESETR2:
       MOV      R2,#0

       LJMP     CHANGE2

CHANGE2:
       JNB      P2.2,CHANGE3

       JNB      CY,RESETR3

       ;ADD MINUTE

       MOV      R3,#0

       CLR      CY

       LJMP     CHANGE3

RESETR3:
       MOV      R3,#0

       LJMP     CHANGE3

CHANGE3:
       JNB      P2.3,CHANGE3

       JNB      CY,RESETR4

       ;CLEAR SECOND

       MOV      R4,#0

       CLR      CY

       LJMP     BACK

RESETR4:
       MOV      R3,#0

BACK:
       SETB     RS0             ;NEXT TIME WILL USE THE SECOND REGISTER GROUP

       CLR      RS1

       RETI
;********************************************************************
;********************************************************************

TABLE: DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
;  显示;====0====1====2====3===4===5===6====7===8===9====

;********************************************************************



;   IF R0!=0
;   LJMP    BACK
;   ELSE
;   LJMP    RESETR4
;   ENDIF

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -