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

📄 终结版.asm

📁 模拟时钟汇编语言程序设计
💻 ASM
📖 第 1 页 / 共 4 页
字号:

              MOV       DH,22
              MOV       DL,47
              CALL      b1002
              MOV       DL,'5'
              MOV       AH,2
              INT       21h 

              MOV       DH,22
              MOV       DL,32
              CALL      b1002
              MOV       DL,'7'
              MOV       AH,2
              INT       21h

              MOV       DH,19
              MOV       DL,26
              CALL      b1002
              MOV       DL,'8'
              MOV       AH,2
              INT       21h 

              MOV       DH,11
              MOV       DL,25
              CALL      b1002
              MOV       DL,'1'
              MOV       AH,2
              INT       21h
              MOV       DH,11
              MOV       DL,26
              CALL      b1002
              MOV       DL,'0'
              MOV       AH,2
              INT       21h 

              MOV       DH,8
              MOV       DL,30
              CALL      b1002
              MOV       DL,'1'
              MOV       AH,2
              INT       21h 
              MOV       DH,8
              MOV       DL,31
              CALL      b1002
              MOV       DL,'1'
              MOV       AH,2
              INT       21h
        
              MOV       DH,15
              MOV       DL,55
              CALL      b1002
              MOV       DL,'3'
              MOV       AH,2
              INT       21h         
              MOV       DH,23
              MOV       DL,40
              CALL      b1002
              MOV       DL,'6'
              MOV       AH,2
              INT       21h
              MOV       DH,15
              MOV       DL,24
              CALL      b1002
              MOV       DL,'9'
              MOV       AH,2
              INT       21h
              RET
                            
skin          ENDP             

msg           PROC      NEAR        ;in bp为输出字符串地址
              PUSH      ES
              PUSH      DS
              POP       ES
              MOV       CX,40h
              MOV       AL,0
              MOV       BX,2
              MOV       AH,13h
              INT       10h
              POP       ES
              RET
msg           ENDP

;*****************in dl  out al
bcd2          PROC      NEAR                            
              MOV       AH,0
              MOV       AL,DL
              SHR       AL,4
              AND       AL,0fh
              MOV       CL,10
              MUL       CL
              MOV       CL,AL
              MOV       AL,DL
              AND       AL,0fh
              ADD       AL,CL;;;;;      bcd转16进制
              RET
bcd2          ENDP                            
                                                                                            
;r0=bx    圆心cx 行 dx列********************               
yuan          PROC
              PUSHa
              MOV       CX,360
              MOV       AX,0
yuan_kk1:     PUSH      CX   
              PUSH      AX
              MOV       CX,y0
              MOV       DX,x0
              CALL      enovate
              CALL      dian
              POP       AX
              ADD       AX,1
              POP       CX
              LOOP      yuan_kk1
                         
              POPa
              RET
yuan          ENDP                                          
             
;*****************in ax度数    bx=半径r长度,cx 列 dx行  圆心 out  x,y************
enovate       PROC      NEAR
              PUSHa
              PUSH      DX
              PUSH      AX
              PUSH      CX
              CALL      SIn
              MOV       DX,0
              MOV       CX,BX
              DIV       CX
              POP       CX
              CMP       SI,1
              JE        ian
                         
              ADD       AX,CX
              JMP       enovate_kk1
ian:          SUB       CX,AX
              MOV       AX,CX
enovate_kk1:  MOV       y,AX
              POP       AX                            
              CALL      cos
              MOV       DX,0
              MOV       CX,BX
              DIV       CX
              POP       DX
              CMP       SI,1
              JE        ian2
              ADD       AX,DX
              JMP       enovate_kk2
ian2:         MOV       CX,DX
              SUB       CX,AX
              MOV       AX,CX
enovate_kk2:  MOV       x,AX                                   
              POPa
              RET
enovate     ENDP       

  ;***********************************************---------------------------------
;**************返回原位置显示**********
;************************************
;入口参数:无
;函数功能:使时钟原位置走时并显示
;出口参数;无
;************************************   
BACK_LOOP  PROC
    PUSH BX
    PUSH DX
    PUSH AX
    PUSH CX
    
    MOV BH,PAG ;显示页号
    MOV DH,05H ;
    MOV DL,00H ;列
    
    MOV AH,02H;设置光标位置
    INT 10H
;***********隐藏光标********
    MOV AX, 100H
    MOV CX, 2000H
    INT 10H
;***************************    
    POP CX
    POP AX    
    POP DX
    POP BX
    RET
BACK_LOOP ENDP


;*************************************
;          电子时钟显示程序          *
;入口参数         无                 * 
;                                    *
;出口参数         无                 * 
;           可以直接显示             * 
;*************************************

CLOCK  PROC
    
    PUSH BX    
    PUSH AX     
    
    MOV AH,2AH ;DOS功能调用,取日期
    INT 21H    ;CX--年,DH:DL--月:日(二进制)    
    
    MOV YEAR,CX ;保存数据(年月日)
    MOV MONTH,DH
    MOV DATE,DL   
    
;************将CX(即YEAR)拆分成高位和低位*************************
   MOV AX,YEAR
   MOV BL,100;除以100
   DIV BL
   MOV YEAR_H,AL;商存AL,作高位
   MOV YEAR_L,AH;余数存AH,作低位
 
;*****************************************************************
    MOV AL,YEAR_H ;显示年份(高位)
    CALL F2T10
    
    MOV AL,YEAR_L ;显示年份(低位)
    CALL F2T10

    LEA DX,CHAR1;显示提示性字符"-"
    MOV AH,09H
    INT 21H 
        
    MOV AL,MONTH ;显示月份
    CALL F2T10 ;调用二进制转十进制子程序
    
    LEA DX,CHAR1;显示提示性字符"-"
    MOV AH,09H
    INT 21H 
    
    MOV AL,DATE  ;显示日期
    CALL F2T10 ;调用二进制转十进制子程序  
    
;*************年月日显示完毕************************     
    
    MOV AH,2CH ;取系统时间
    INT 21H
    
    MOV HOUR1,CH ;保存数据(时分秒)
    MOV MIN1,CL
    MOV SEC1,DH
    
    LEA DX,NOTE2;回车换行
    MOV AH,09H
    INT 21H    
    
    MOV AL,HOUR1 ;显示小时
    CALL F2T10
        
    LEA DX,CHAR2;显示提示性字符":"
    MOV AH,09H
    INT 21H 
    
    MOV AL,MIN1 ;显示分钟
    CALL F2T10
    
    LEA DX,CHAR2;显示提示性字符":"
    MOV AH,09H
    INT 21H   
    
    MOV AL,SEC1 ;显示秒钟
    CALL F2T10
;*************时分秒显示完毕**********************       
    POP AX
   
    POP BX      
    
    RET
CLOCK  ENDP    


;*************************************
; 二进制转化为十进制子程序           *
;入口参数  AL--要转化的二进制数据    * 
;                                    *
;出口参数  BUF0--存放转化为的         * 
;               十进制字符串         * 
;       可以直接显示                 * 
;*************************************
	
F2T10  PROC
       PUSH BX
       PUSH DX
       PUSH SI
       PUSH AX
       LEA SI,BUF0
       OR AL,AL
       JNS PLUS 
       NEG AL
       MOV [SI],BYTE PTR '-'
       INC SI
PLUS:  MOV AH,0    
       MOV BX,10;10---要转换成十进制
     ;*****加0******  
       CMP AL,9
       JA  CALL_FUC
       MOV [SI],'0'
       INC SI
     ;************  
CALL_FUC:CALL RADIX1 
   
       MOV [SI],BYTE PTR '$'
       MOV DX,OFFSET BUF0
       MOV AH,9
       INT 21H
       POP AX
       POP SI
       POP DX
       POP BX
       RET
F2T10  ENDP

;*************************************
; 进制转换处理程序                   *
;入口参数  AX--要转化的二进制数据    * 
;          BX--要转换成BX进制的数据  *
;出口参数                            * 
;*************************************
               
RADIX1  PROC
       PUSH    CX
       PUSH    DX
       MOV     CX,0
LOP11:  MOV      DX,0
       DIV      BX
       PUSH     DX
       INC      CX
       OR      AX,AX
       JNE    LOP11
LOP2:   POP AX
       CMP AL,10
       JB    L11
       ADD AL,7
L11:   ADD AL,30H
       MOV [SI],AL
       INC SI
       DEC CX
       JNE    LOP2
       POP      DX
       POP      CX
       RET
RADIX1  ENDP

;****************************以下是闹钟程序部分**************************

;*************闹钟显示*************
;*********************
;函数功能:显示闹钟
;*********************
DIS_ALARM1 PROC NEAR
    PUSH DX
    PUSH AX
    PUSH BX
    PUSH CX
            
    LEA DX,NOTE12;显示提示性语句"---------ALARM---------"
    MOV AH,09H
    INT 21H
        
    LEA DX,NOTE2;回车换行
    MOV AH,09H
    INT 21H    
    
    MOV AL,AL_HOUR ;显示小时
    CALL F2T10
        
    LEA DX,CHAR2;显示提示性字符":"
    MOV AH,09H
    INT 21H 
    
    MOV AL,AL_MIN ;显示分钟
    CALL F2T10
    
    LEA DX,CHAR2;显示提示性字符":"
    MOV AH,09H
    INT 21H   
    
    MOV AL,AL_SEC ;显示秒钟
    CALL F2T10
;*************时分秒显示完毕**********************  
    POP CX   
    POP BX
    POP AX
    POP DX
    
    RET
DIS_ALARM1 ENDP

;*********闹钟触发***********
;*****************
;入口参数:无
;函数功能:判断闹钟时间是否到
;*****************  
ALARM_START PROC
    PUSH AX
    
    MOV AL,HOUR1
    CMP AL,AL_HOUR;比较小时--HOUR与AL_HOUR
    JNZ RETU3
    MOV AL,MIN1
    CMP AL,AL_MIN;比较分钟
    JNZ RETU3
    
    CALL ALARM;闹钟时间到,调用闹铃程序(发出声音)
    
RETU3:    
    POP AX   
     
    RET
ALARM_START ENDP

;**************闹铃**************   
;*********************
;函数功能:闹铃响
;*********************
ALARM    PROC  NEAR
         PUSH  DS
         PUSH  DX
         PUSH  CX
         PUSH  BX
         PUSH  AX
		 CMP flag,1
		 JZ KEEP_ON
		 RET
KEEP_ON: LEA   SI, MUS_FREQ
         LEA   BP, DS: MUS_TIME
FREQ:    MOV   DI, [SI]
         CMP   DI, -1 ;遇到-1,结束响零
         JE    END_MUS
         MOV   BX, DS: [BP]
         CALL  GEN_SOUND
         ADD   SI, 2
         ADD   BP, 2
         JMP   FREQ
END_MUS: POP AX
         POP BX
         POP CX
         POP DX
         POP DS
         RET
ALARM    ENDP

;**********发声程序***************
GEN_SOUND   PROC  near
           PUSH  AX       ;先保存各个寄存器
           PUSH  BX
           PUSH  CX
           PUSH  DX
           PUSH  DI
           MOV   AL, 0B6H ;8253通道地址
           OUT   43H, AL
           MOV   DX, 12H
           MOV   AX, 533H*896
           DIV   DI
           OUT   42H, AL
           MOV   AL, AH
           OUT   42H, AL
           IN    AL, 61H
           OR    AL,  3
           OUT   61H,  AL
WAIT1:     MOV   CX, 700
DE:        LOOP  DE
           DEC   BX
           JNZ   WAIT1
           MOV   AL, AH
           OUT   61H, AL
           POP   DI
           POP   DX
           POP   CX
           POP   BX
           POP   AX
           RET
GEN_SOUND   ENDP
;******************************************************----------------------------------                            
                                                                                         
   MAIN          ENDP                 
;------------------------------------------------------
CODE_SEG      ENDS
;******************************************************
              END       START    ;程序结束 

⌨️ 快捷键说明

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