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

📄 调时2.asm

📁 用单片机液晶显示1602实现时钟显示,并有时间设定功能
💻 ASM
📖 第 1 页 / 共 2 页
字号:
           NO99: INC  DATE2
       Equal_2: 
                 ACALL  DELAY
        WAIT5:   MOV    DATE3,#84H
                 ACALL    Display_Time1
                 ACALL  DELAY
                 JNB    P3.0,JUMP1
                 ACALL  DELAY
                 JB     P3.1,WAIT5   
       KEY2222:  ACALL  DELAY
                 SETB   P3.1
                 JNB    P3.1,KEY2222
                 AJMP   LOOP2
       JUMP1:    
       KEY1_Fo:  ACALL  DELAY
                 SETB   P3.0
                 JNB    P3.0,KEY1_Fo
                 RET
                

;显示字符:程序
Display_Spot:    MOV  R3,#89H
                 ACALL   WRLCD
                 MOV  DATE,#3AH
                 ACALL   WRDATE
                 MOV  R3,#86H
                 ACALL   WRLCD
                 MOV  DATE,#3AH
                 ACALL   WRDATE
                 RET
           
;显示秒分时程序
Display_Time:      ACALL   Deal_SMH
                   MOV R3,DATE3
                   ACALL   WRLCD
                   MOV  DATE,DATE1
                   ACALL  WRDATE
                   INC  R3
                   ACALL  WRLCD
                   MOV   DATE,DATE2
                   ACALL  WRDATE
                   RET 
;按下KEY后显示等待程序
Display_Time1:     MOV  R3,DATE3
                   ACALL   WRLCD
                   MOV  DATE,DATE1
                   ACALL   WRDATE
                   INC  R3
                   ACALL   WRLCD
                   MOV   DATE,DATE2
                   ACALL   WRDATE
                   RET

                     
;the programme of the initialization of lcd016l(load the command code to R3)
LCDINT:   MOV  R3,#01H          ;清屏
          ACALL     WRLCD     ;写入指令
          MOV  R3,#3CH         ;功能设定:8位字符,2行,5X10点阵
          ACALL     WRLCD
          MOV  R3,#06H         ;I/D=1,AC自动+1,S=0整体显示不移动
          ACALL     WRLCD
          MOV  R3,#0CH         ;D=1开显示,C=0关光标,B=0字符不闪耀
          ACALL     WRLCD
          RET 

;写命令子程序,R3中存放要写入的命令
WRLCD:    ACALL    BUSY
          MOV     A,R3
          CLR      RS
          CLR      RW
          MOV     P0,A
          CLR      E
          ACALL    DELAY
          SETB   E
          RET

;查询“忙碌”(BF)子程序
BUSY:     CLR   RS
          SETB  RW
          MOV  A,P0
          CLR   E
          ACALL     DELAY
          SETB  E
          JB     ACC.7,BUSY    ;F=1忙碌
          RET 

;延时子程序
DELAY:   MOV   R6,#5
D1:      MOV   R5,#25
         DJNZ   R5,$
         DJNZ   R6,D1
         RET 

;写一位字符数据子程序,DATE中存放要写入的数据
WRDATE:    ACALL     BUSY
           SETB   RS         ;RS=1,RW=0,可以显示各字符
           CLR    RW
           MOV   P0,DATE
           CLR    E          ;读写使能(下降沿使能)
           ACALL    DELAY    ;让一个字节的数据顺利写入LCD
           SETB   E
           RET 
;时钟允许运行程序
Clock_Enable: MOV  COMMAND,#80H;命令字节为80H
              MOV  BYTECNT,#1    ;单字节传送模式   
              MOV  SENDATA,#00H;数据内容为0,振荡器工作允许,时钟运行开始
              ACALL   Send_Data   ;调用写入DS1302数据程序
              RET
;时钟停止程序
Clock_Unable: MOV COMMAND,#80H
              MOV BYTECNT,#1
              MOV SENDATA,#80H
              ACALL   Send_Data
              RET


;从DS1302的秒,分,时register 中读出数据程序(采用单字节模式)
Read_Sec:   MOV  COMMAND,#81H  ;命令字节为81H
            MOV  BYTECNT,#1     ;单字节读出模式
            ACALL    Rec_Data       ;调用读出DS1302数据程序
            RET
Read_Min:   MOV  COMMAND,#83H
            MOV  BYTECNT,#1
            ACALL    Rec_Data
            RET
Read_Hour:  MOV  COMMAND,#85H   
            MOV  BYTECNT,#1
            ACALL    Rec_Data
            RET
                  
;将分,时数据写入DS1302相应register程序
Send_Min:   MOV  COMMAND,#82H
            MOV  BYTECNT,#1
            MOV  SENDATA,A
            ACALL    Send_Data
            RET
Send_Hour:  MOV  COMMAND,#84H
            MOV  BYTECNT,#1
            MOV  SENDATA,A
            ACALL    Send_Data
            RET
Send_Enable:MOV  COMMAND,#8EH
            MOV  BYTECNT,#1
            MOV  SENDATA,#00H
            ACALL    Send_Data
            RET

;发送命令字节Send_Cmd程序
;描述:命令字节即DS1302的控制字,要与DS1302通信,首先要发送命令字节(具体作用
;见说明书)
Send_Cmd:       CLR       RST     ;复位pin为低电平所有数据传送终止
                NOP               ;空操作
                CLR       SCLK   ;使串行时钟信号为低电平
                NOP
                SETB      RST    ;在读写数据期间RST只能为高
                NOP
                MOV   A ,COMMAND;将命令字节中的内容送到累加器A
                MOV   BITCNT,#8    ;    BITCNT此时为8位
  Sent_Bit:
                RRC    A        ;累加器A的内容和进位标志Cy一起向右环移一位,
                                ;A.0进入Cy,Cy进入A.7
                MOV   IO,C     ;将Cy位中的内容经IO端口送到DS1302中
                NOP
                SETB   SCLK    ;SCLK时钟的上沿时数据被写入DS1302
                NOP
                CLR    SCLK
                DJNZ   BITCNT, Sent_Bit  ;BITCNT减1不为0则转移到Sent_Cmd
                NOP
                RET              ;返回主程序

;发送数据程序Sent_Data
;描述:将BYETCNT个字节发送到DS1302中,要发送的数据存放在SENDAT开始的发送
;数据缓冲区中(从P1.1发送到IO),此程序由Sent_Cmd和Sent_Byte两部分组成
Send_Data:      ACALL   Send_Cmd ;发送命令字节
               ;下面开始写入字节数据
  Sent_Byte0:
               MOV   R0,#SENDATA;将SENTDATA的地址传给R0
               MOV   A,@R0     ;将发送数据缓冲区的第一个字节送给A 寄存器间接
                               ;寻址
               MOV   BITCNT,#8  ;令数据位计数器为8位 
  Sent_Byte1:
               RRC    A          ;以下7行程序和传送命令是一个道理
               MOV   IO,C
               NOP
               SETB   SCLK
               NOP
               CLR    SCLK
               DJNZ   BITCNT,Sent_Byte1;完成一个字节的传送
               INC    R0               ;R0中的内容自加1即使地址字节加1来到下
                                       ;个要传送的缓冲区单元
               DJNZ   BYTECNT,Sent_Byte0;查看所需传送的字节是否已传完如没有则
                                        ;继续传送此为一循环程序
               NOP
               CLR    RST                ;复位信号为低所有读写数据停止
               RET 

;接受数据Rec_Data程序
;描述:从DS1302中读出数据(IO到P1.1),此程序由发送命令字节程序和读出数据程序两部
;分组成,发送的数据字节存放在RECDATA开始的接受数据缓冲区单元中
Rec_Data:     ACALL  Send_Cmd    ;传送命令字节
               ;下面开始接受数据
              Rec_Data0:
              CLR     A            ;清累加器
              CLR     C            ;清Cy
              MOV    BITCNT,#8
              Rec_Data1:
              MOV    C,IO         
              SETB    SCLK         
              NOP
              CLR     SCLK         ;SCLK时钟下沿将IO的数据位传送到Cy
              RRC     A
              DJNZ    BITCNT,Rec_Data1;查看一个字节是否传完
              MOV    R1,#RECDATA   ;将接受数据缓冲区的开始地址传给R1
              MOV    @R1,A          ;将A的内容传给缓冲区单元
              INC     R1              ;缓冲区单元地址自加1
              DJNZ    BYTECNT,Rec_Data0;查看读入字节数是否符合要求
              NOP
              CLR     RST              ;所有数据读写终止
              RET                       ;返回主程序 


;对在接受数据缓冲区中的秒数据单元分成高四位和低四位分别放在两个显示缓冲单元中的低四位中
Deal_SMH:         CLR     A            ;令累加器A的各位为0
                  MOV  R1,#RECDATA   ;将接受数据缓冲区的首地址传送给R1
                  XCHD  A,@R1  ;累加器A的低4位与R1中地址所存储数据的低四
                                ;位交换
                  MOV  DATE2,A    ;在低四位存放秒的个位
                  CLR     A 
                  MOV  A,@R1
                  SWAP   A
                  MOV  DATE1,A    ;在低四位存放秒的十位
                  ORL  DATE2,#30H
                  ORL  DATE1,#30H
                  RET

Deal_M:           ANL  DATE1,#0FH
                  ANL  DATE2,#0FH
                  CLR  A
                  MOV  A,DATE1
                  SWAP A
                  ORL  A,DATE2
                  RET

Deal_H:           ANL  DATE1,#0FH
                  ANL  DATE2,#0FH
                  CLR  A 
                  MOV  A,DATE1
                  SWAP A
                  ORL  A,DATE2
                  RET
END

                  
                  
                  
                  

                  
                 
                  

⌨️ 快捷键说明

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