20. Digital clock ﹝★﹞

Publisher:闪耀星空Latest update time:2016-09-21 Source: eefocus Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere
1.  Experimental tasks 
(1. When the machine is turned on, the time displayed is 12:00:00 and the time starts to count;
(2. P0.0/AD0 controls the adjustment of "seconds", and each press adds 1 second; 
(3. P0.1/AD1 controls the adjustment of "minutes", and each press adds 1 minute; 
(4. P0.2/AD2 controls the adjustment of "hours", and each press adds 1 hour; 
2.  Circuit diagram 

Figure 4.20.1
3.  Hardware connection on the system board 
(1. Connect the P1.0-P1.7 ports in the "MCU system" area to the A-H ports in the "dynamic digital display" area with an 8-core cable;
(2. Connect the P3.0-P3.7 ports in the "MCU system:" area to the S1-S8 ports in the "dynamic digital display" area with an 8-core cable; 
(3. Connect the P0.0/AD0, P0.1/AD1, and P0.2/AD2 ports in the "MCU system" area to the SP3, SP2, and SP1 ports in the "stand-alone keyboard" area with wires; 
4.  Related basic knowledge 
(1. Dynamic digital display method
(2. Stand-alone key recognition process 
(3. "Hour", "minute", and "second" data sending and display processing method 
5.  Program flowchart 
6.  Assembly source program 
SECOND EQU 30H 
MINITE EQU 31H 
HOUR EQU 32H 
HOURK BIT P0.0 
MINITEK BIT P0.1 
SECONDK BIT P0.2 
DISPBUF EQU 40H 
DISPBIT EQU 48H 
T2SCNTA EQU 49H 
T2SCNTB EQU 4AH 
TEMP EQU 4BH 
        ORG 00H 
        LJMP START 
        ORG 0BH 
        LJMP INT_T0 
START: MOV SECOND,#00H 
        MOV MINITE,#00H 
        MOV HOUR,#12 
        MOV DISPBIT,#00H 
        MOV T2SCNTA,#00H 
        MOV T2SCNTB,#00H 
        MOV TEMP,#0FEH 
        LCALL DISP 
        MOV TMOD,#01H 
        MOV TH0,#(65536-2000) / 256 
        MOV TL0,#(65536-2000) MOD 256 
        SETB TR0 
        SETB ET0 
        SETB EA 
WT: 
        LCALL  DISP
        CJNE A,          #60,NM60 MOV MINITE 
        ,          #00H  NM60: LCALL DISP          JNB MINITEK,$  NK2: JB  HOURK,  NK3         LCALL          DELY10MS          JB          HOURK  ,NK3         INC HOUR          MOV 
        A          ,          HOUR          CJNE A          ,#24,NH24          MOV HOUR,#00H          NH24  : LCALL DISP  JNB          HOURK          ,$  NK3: LJMP WT  DELY10MS:          MOV R6,#10  D1: MOV R7,#248          DJNZ R7,$          DJNZ R6,D1          RET  DISP:            MOV A,#DISPBUF          ADD A,#8          DEC A          MOV R1,A          MOV A,HOUR 



































        MOV B,#10 
        DIV AB 
        MOV @R1,A 
        DEC R1 
        MOV A,B 
        MOV @R1,A 
        DEC R1 
        MOV A,#10 
        MOV@R1,A 
        DEC R1 
        MOV A,MINITE 
        MOV B,#10 
        DIV AB 
        MOV @R1,A 
        DEC R1 
        MOV A,B 
        MOV @R1,A 
        DEC R1 
        MOV A,#10 
        MOV@R1,A 
        DEC R1 
        MOV A,SECOND 
        MOV B,#10 
        DIV AB 
        MOV @R1,A 
        DEC R1 
        MOV A,B 
        MOV @R1,A 
        DEC R1 
        RET 
INT_T0: 
        MOV TH0,#(65536-2000) / 256 
        MOV TL0,#(65536-2000) MOD 256 
        MOV A,#DISPBUF 
        ADD A,DISPBIT 
        MOV R0,A 
        MOV A,@R0 
        MOV DPTR,#TABLE 
        MOVC A,@A+DPTR 
        MOV P1,A 
        MOV A,DISPBIT 
        MOV DPTR,#TAB 
        MOVC A,@A+DPTR 
        MOV P3,A 
        INC DISPBIT 
        MOV A,DISPBIT 
        CJNE A,#08H,KNA 
        MOV DISPBIT,#00H 
KNA:    INC T2SCNTA 
        MOV A,T2SCNTA 
        CJNE A,#100,DONE 
        MOV T2SCNTA,#00H 
        INC T2SCNTB 
        MOV A,T2SCNTB 
        CJNE A,#05H,DONE 
        MOV T2SCNTB,#00H 
        INC SECOND 
        MOV A,SECOND 
        CJNE A,#60,NEXT 
        MOV SECOND,#00H 
        INC MINITE 
        MOV A,MINITE 
        CJNE A,#60,NEXT 
        MOV MINITE,#00H 
        INC HOUR 
        MOV A,HOUR 
        CJNE A,#24,NEXT 
        MOV HOUR,#00H 
NEXT:   LCALL DISP 
DONE:   RETI 
TABLE:  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H 
TAB:    DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH 
        END 
7. C语言源程序 
#include  
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 
                               0x66,0x6d,0x7d,0x07, 
                               0x7f,0x6f,0x77,0x7c, 
                               0x39,0x5e,0x79,0x71,0x00}; 
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7, 
                             0xef,0xdf,0xbf,0x7f}; 
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; 
unsigned char dispbitcnt; 
unsigned char second; 
unsigned char minite; 
unsigned char hour; 
unsigned int tcnt; 
unsigned char mstcnt; 
unsigned char i,j; 
void main(void) 

  TMOD=0x02; 
  TH0=0x06; 
  TL0=0x06; 
  TR0=1; 
  ET0=1; 
  EA=1; 
  while(1) 
    { 
      if(P0_0==0) 
        { 
          for(i=5;i>0;i--) 
          for(j=248;j>0;j--); 
          if(P0_0==0) 
            { 
              second++; 
              if(second==60) 
                { 
                  second=0; 
                } 
              dispbuf[0]=second%10; 
              dispbuf[1]=second/10; 
              while(P0_0==0); 
            } 
        } 
      if(P0_1==0) 
        { 
          for(i=5;i>0;i--) 
          for(j=248;j>0;j--); 
          if(P0_1==0) 
            { 
              minite++; 
              if(minite==60) 
                { 
                  minite=0; 
                } 
              dispbuf[3]=minite%10; 
              dispbuf[4]=minite/10; 
              while(P0_1==0); 
            } 
        } 
      if(P0_2==0) 
        { 
          for(i=5;i>0;i--) 
          for(j=248;j>0;j--); 
          if(P0_2==0) 
            { 
              hour++; 
              if(hour==24) 
                { 
                  hour=0; 
                } 
              dispbuf[6]=hour%10; 
              dispbuf[7]=hour/10; 
              while(P0_2==0); 
            } 
        } 
    } 

void t0(void) interrupt 1 using 0 

  mstcnt++; 
  if(mstcnt==8) 
    { 
      mstcnt=0; 
      P1=dispcode[dispbuf[dispbitcnt]]; 
      P3=dispbitcode[dispbitcnt]; 
      dispbitcnt++; 
      if(dispbitcnt==8) 
        { 
          dispbitcnt=0; 
        } 
    } 
  tcnt++; 
  if(tcnt==4000) 
    { 
      tcnt=0; 
      second++; 
      if(second==60) 
        { 
          second=0; 
          minite++; 
          if(minite==60) 
            { 
              minite=0; 
              hour++; 
              if(hour==24) 
                { 
                  hour=0; 
                } 
            } 
        } 
      dispbuf[0]=second%10; 
      dispbuf[1]=second/10; 
      dispbuf[3]=minite%10; 
      dispbuf[4]=minite/10; 
      dispbuf[6]=hour%10; 
      dispbuf[7]=hour/10; 
    } 
}  
Reference address:20. Digital clock ﹝★﹞

Previous article:21. Curtain-type digital display technology
Next article:19. Ding Dong doorbell

Latest Microcontroller Articles
  • Download from the Internet--ARM Getting Started Notes
    A brief introduction: From today on, the ARM notebook of the rookie is open, and it can be regarded as a place to store these notes. Why publish it? Maybe you are interested in it. In fact, the reason for these notes is ...
  • Learn ARM development(22)
    Turning off and on interrupts Interrupts are an efficient dialogue mechanism, but sometimes you don't want to interrupt the program while it is running. For example, when you are printing something, the program suddenly interrupts and another ...
  • Learn ARM development(21)
    First, declare the task pointer, because it will be used later. Task pointer volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • Learn ARM development(20)
    With the previous Tick interrupt, the basic task switching conditions are ready. However, this "easterly" is also difficult to understand. Only through continuous practice can we understand it. ...
  • Learn ARM development(19)
    After many days of hard work, I finally got the interrupt working. But in order to allow RTOS to use timer interrupts, what kind of interrupts can be implemented in S3C44B0? There are two methods in S3C44B0. ...
  • Learn ARM development(14)
  • Learn ARM development(15)
  • Learn ARM development(16)
  • Learn ARM development(17)
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号