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

📄 调时2.asm

📁 用单片机液晶显示1602实现时钟显示,并有时间设定功能
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;the definition of the port
SCLK    BIT    P1.0               ;DS1302的SCLK串行时钟与51的P1.0连接
IO      BIT    P1.1               ;IO数据输入输出与P1.1连接
RST     BIT    P1.2               ;RST复位与P1.2连接
RS      BIT    P2.0               ;the link of lcd&&mcu
RW      BIT    P2.1
E       BIT    P2.2 
; the definition of  RAM  in 51
BITCNT        EQU   30H      ;数据位计数单元
BYTECNT       EQU   31H      ;数据字节计数单元
COMMAND       EQU   32H      ;命令字节单元
RECDATA       EQU   40H      ;接受数据缓冲区
SENDATA       EQU   50H      ;发送数据缓冲区 
DATE1         EQU   90H      ;显示缓冲区,存储要显示的十位数
DATE2         EQU   91H      ;显示缓冲区,存储要显示的个位数
DATE          EQU   92H      ;存放写入LCD的数据
DATE_N        EQU   93H      ;存放写入LCD的数据的个数
DATE3         EQU   94H      ;暂时存放LCD的命令字节
;the main program of the design about time and stopwach
            ORG     0000H
            AJMP    LCDMAIN
            ORG     000BH
            AJMP    IT0P      ;转中断服务程序
            ORG     0030H
LCDMAIN:    ACALL  LCDINT         ;initialization of the lcd016l
LOOP:       ACALL   Read_Sec      ;调用读出秒程序
            MOV   DATE3,#8AH      ;the 11th word of the first line in the lcd
            ACALL   Display_Time  ;use of the program for displaying time
            ACALL   Display_Spot  ;display":"
            ACALL   Read_Min      ;调用读出分程序
            MOV   DATE3,#87H      ;the 8th word of the first line in the lcd
            ACALL   Display_Time  ;jump to the program for displaying time
            ACALL   Read_Hour     ;调用读出小时程序
            MOV   DATE3,#84H      ;the 5th word of the first line in the lcd
            ACALL   Display_Time  
            JNB   P3.0,YU         ;当按下KEY1(P3.0=0)
            JNB   P3.2,WEI        ;当按下KEY3

            AJMP    LOOP
    YU:     ACALL   Adjust_Time ;调时程序     
            AJMP    LOOP
   WEI:     ACALL   Stopwatch   ;秒表
            AJMP    LOOP

IT0P:       MOV   TL0,#0F0H     ;中断服务程序
            MOV   TH0,#0D8H 
            SETB  P3.1          
            JNB   P3.1,STOP     ;push the button key2           
            CJNE R0,#99,NO_99
            MOV  R0,#0
            CJNE R2,#59,NO_59
            MOV  R2,#0
            INC  R4
            AJMP  SHOW
    NO_59:  INC  R2
            AJMP  SHOW 
    NO_99:  INC  R0
            AJMP  SHOW
     STOP:  NOP
     KEY_2: ACALL DELAY
            SETB  P3.1
            JNB   P3.1,KEY_2
            CLR   TR0
     SHOW:  NOP
            MOV  A,R0
            MOV  DATE3,#8AH
            ACALL  Display_SW
            ACALL  Display_Spot_SW
            MOV  DATE3,#87H
            MOV  A,R2
            ACALL  Display_SW
            MOV  A,R4
            MOV  DATE3,#84H
            ACALL  Display_SW
            RETI
 
Display_SW: MOV  B,#10
            DIV  AB
            MOV  DATE1,A
            MOV  DATE2,B
            ORL  DATE2,#30H
            ORL  DATE1,#30H
            MOV  R3,DATE3
            ACALL  WRLCD_SW
            MOV  DATE,DATE1
            ACALL  WRDATE_SW
            INC  R3
            ACALL  WRLCD_SW
            MOV  DATE,DATE2
            ACALL  WRDATE_SW
            RET

Display_Spot_SW:  MOV  R3,#89H
                  ACALL   WRLCD_SW
                  MOV  DATE,#3AH
                  ACALL   WRDATE_SW
                  MOV  R3,#86H
                  ACALL   WRLCD_SW
                  MOV  DATE,#3AH
                  ACALL   WRDATE_SW
                  RET
       
WRLCD_SW:  ACALL    BUSY_SW
           PUSH     ACC
           MOV      A,R3
           CLR      RS
           CLR      RW
           MOV       P0,A
           CLR      E
           ACALL    DELAY_SW
           SETB   E
           POP    ACC
           RET

WRDATE_SW: ACALL     BUSY_SW
           SETB   RS
           CLR    RW
           MOV   P0,DATE
           CLR    E
           ACALL    DELAY_SW
           SETB   E
           RET

BUSY_SW:   CLR   RS
           SETB  RW
           MOV  A,P0
           CLR   E
           ACALL     DELAY_SW
           SETB  E
           JB     ACC.7,BUSY_SW    ;F=1忙碌
           RET 

DELAY_SW:  MOV   R6,#2
D2:        MOV   R5,#25
           DJNZ   R5,$
           DJNZ   R6,D2
           RET               

;利用定时器T0的方式1,首先对其及中断系统进行初始化
Stopwatch:  NOP
     KEY3:  ACALL   DELAY
            SETB    P3.2
            JNB  P3.2,KEY3
            MOV  DATE1,#30H
            MOV  DATE2,#30H
            MOV  DATE3,#8AH
            ACALL   Display_Time1
            ACALL   Display_Spot
            MOV  DATE3,#87H
            ACALL   Display_Time1
            MOV  DATE3,#84H
            ACALL   Display_Time1            ;显示00:00:00           
            
            MOV  R0,#0
            MOV  R2,#0
            MOV  R4,#0    
            MOV  TMOD,#01H        ;设置定时器0的方式1
            MOV  TL0,0F0H
            MOV  TH0,0D8H         ;T0置初值,0.01s计数一次
            SETB    TR0           ;允许T0计数
            SETB    EA            ;CPU开放中断
            SETB    ET0           ;允许T0中断
     HERE:  SETB     P3.2         ;等待
            JB  P3.2,HERE         ;按下KEY3则跳出
            CLR     TR0           ;stop counting
    KEY33:  ACALL   DELAY
            SETB    P3.2
            JNB  P3.2,KEY33
            NOP
            RET 

;调整时间程序
 
Adjust_Time:      ACALL  Clock_Unable
       KEY1_Fi:   ACALL  DELAY            ;延时,防止抖动
                 SETB    P3.0
                 JNB    P3.0, KEY1_Fi     ;键是否释放
       WAIT1:    MOV   DATE1,#30H
                 MOV   DATE2,#30H
                 MOV   DATE3,#8AH
                 ACALL    Display_Time1
                 ACALL     DELAY
                 JB    P3.0,WAIT1     ;P3.0=0则执行以下程序
       KEY1_S:   ACALL  DELAY
                 SETB   P3.0
                 JNB  P3.0,KEY1_S     ;键是否释放
                 ACALL  Adjust_Min
                 ACALL  Send_Enable
                 ACALL  Deal_M
                 ACALL  Send_Min
                 ACALL  Adjust_Hour
                 ACALL  Deal_H
                 ACALL  Send_Hour
                 ACALL  Clock_Enable
                 RET

Adjust_Min:          
      WAIT2:     MOV   DATE1,#30H
                 MOV   DATE2,#30H
                 MOV   DATE3,#87H
                 ACALL    Display_Time1
                 ACALL     DELAY
                 JB    P3.1,WAIT2    ;P3.1=0则执行以下程序
       KEY2:     ACALL  DELAY
                 SETB   P3.1
                 JNB  P3.1,KEY2    ;键是否释放
LOOP1:           MOV   A,DATE2
                 CJNE  A,#39H,NO9
                 MOV   DATE2,#30H 
                 MOV   A,DATE1
                 CJNE  A,#35H,NO5
                 MOV   DATE1,#30H
                 DEC   DATE1
       NO5:      INC   DATE1
                 DEC   DATE2
       NO9:      INC   DATE2
                 ACALL  DELAY
       WAIT3:   
                 MOV    DATE3,#87H
                 ACALL    Display_Time1
                 ACALL  DELAY
                 JNB    P3.0,JUMP
                 ACALL  DELAY
                 JB     P3.1,WAIT3    
       KEY22:    ACALL  DELAY
                 SETB   P3.1
                 JNB    P3.1,KEY22
                 AJMP   LOOP1
       JUMP:     NOP
       KEY1_T:   ACALL  DELAY
                 SETB   P3.0
                 JNB    P3.0,KEY1_T
                 RET

Adjust_Hour:     
      WAIT4:     MOV   DATE1,#30H
                 MOV   DATE2,#30H
                 MOV   DATE3,#84H
                 ACALL    Display_Time1
                 ACALL     DELAY
                 JB    P3.1,WAIT4    ;P3.1=0则执行以下程序
       KEY222:   ACALL  DELAY
                 SETB   P3.1
                 JNB  P3.1,KEY222    ;键是否释放

      LOOP2:     MOV   A,DATE1
                 CJNE  A,#32H,NO2   
                 MOV   A,DATE2
                 CJNE  A,#33H,NO3
                 MOV   DATE1,#30H
                 MOV   DATE2,#30H
                 DEC   DATE2
            NO3: INC   DATE2
                 AJMP  Equal_2

            NO2: MOV   A,DATE2
                 CJNE  A,#39H,NO99
                 MOV   DATE2,#30H
                 INC   DATE1
                 DEC   DATE2

⌨️ 快捷键说明

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