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

📄 闹钟_ok2.txt

📁 这个是个4个数码管显示时间的程序
💻 TXT
字号:
;----------------------------------------------------------
 ;文件名称:SZ01.ASM
 ;程序功能:时钟
 ;----------------------------------------------------------
 
 ;----- ――― 程序初始化 ――――――――――
 ; 定义存放计时单元地址
         
     BUF   EQU  30H      ;30~33H 连续4字节存放显示器数据
     MIN   EQU  34H      ;存放小时变量
     HOUR  EQU  35H      ;存放分钟变量
     SEC   EQU  36H      ;存放秒钟变量
     DEDA  EQU  37H      ;存放5 ms 计数值
     SEVEN EQU  P1
     SEG   EQU  P2
       
 ;按键输入引脚定义
    K1    EQU  P2.4     ;按键1引脚定义
    K2    EQU  P2.5     ;按键2引脚定义
    K3    EQU  P2.6     ;按键3引脚定义
    K4    EQU  P2.7     ;按键4引脚定义
 
 ;压电喇叭和指示灯引脚定义 
    SPK   EQU  P3.4     ;压电喇叭控制信号
    WLED  EQU  P0.0     ;工作指示灯引脚定义
 
 ;程序开始执行地址 
    ORG   0H          ;程序代码由地址0开始执行
    JMP   MAIN
    ORG   0BH         ;定时器 0 中断地址设置
    JMP   TO_SRV

 ;--------- 主 程 序 --------――
 
  MAIN:                ;开始
      
    ACALL  BZ          ;压电喇叭连续两次鸣响一声
    ACALL  BZ          
    ACALL  LED_BL      ;LED 闪动,表示程序开始执行
    ACALL  INIT        ;初始变化量
    ACALL  INIT_TIMER  ;设置定时器
 
 ;加载显示器初值数据
  MOV   A, #0C0H  
  MOV   SEVEN,A
 
 ;无穷循环
 LOOP:                 ;无穷循环
    ACALL  CONV        ;转换 时时 分分 数据
    ACALL  DISP        ;扫描显示  
 
    JB    K1, M1       ;未按下K1键则继续扫描
    ACALL  LED_BL      ;LED闪动
    ACALL  SET_TIME    ;设置目前时间
    JMP    LOOP        ;继续循环执行
  
  
  M1:JB   K2,M2        ;未按下K2键则继续扫描
    JMP    LOOP        ;继续循环执行
  
  M2:JB  K3, M3        ;未按下K3键则继续扫描 
    JMP   LOOP         ;继续循环执行
 
  M3:JB  K4,M4         ;未按下K4键则继续扫描
    JMP  LOOP          ;继续循环执行
     
  M4:
    JMP   LOOP         ;继续循环执行
 
 ;----- 实现走时功能的子程序 ------――

 ;使用定时器0模式1计时
 INIT_TIMER:   ;初始化定时器,使用定时器0模式0计时
    MOV TMOD,#00000001B    ;设置定时器0工作模式为1
    MOV IE,  #10000010B    ;启用定时器0中断产生
    MOV  TL0, #33H    ;加载低字节
    MOV  TH0, #0FEH     ;加载高字节
    SETB TR0               ;启动定时器0开始计时
    RET
 ;-----------―――
 ;中断服务程序
 TO_SRV:    ;定时器0计时中断程序每隔5ms中断一次
    PUSH  ACC                  ;将累加器放入堆栈
    MOV  TL0, #33H   ;加载低字节
    MOV  TH0, #0FEH      ;加载高字节
    INC  DEDA                    ;5ms计数值加1    
  ;秒输出
    MOV  A, DEDA
    CJNE  A,#200,TT1      ;是否1s到了
    MOV  DEDA,  #0        ;计数值清除为0
    CPL  WLED             ;LED灯亮灭变换
    INC  SEC              ;秒计数加1
    MOV  A,  SEC
    CJNE  A, #60, TT1;是否1min到了
  ;分输出
   INC  MIN            ;分计数加1
   MOV  SEC,  #0      ;秒计数清除为0
   MOV  A,  MIN
   CJNE  A, #60, TT1  ;是否1h到了
  ;时输出
    INC  HOUR          ;小时计数加1
    MOV  MIN,  #0      ;分计数清除为0
    MOV  A,  HOUR
    CJNE  A,#24, TT1  ;是否24h到了
    MOV   SEC,  #0    ;秒钟变量清除为0
    MOV   MIN,  #0    ;分钟变量清除为0
    MOV   HOUR, #0   ;小时变量清除为0
  TT1:
    POP  ACC         ;将累加器由堆栈取出
    RETI

 ;----―― 实现显示功能的子程序 ---――――

 ;转换 时时:分分 数据
 CONV:
  ;转换小时数据
    MOV  A,  HOUR
    MOV  B,  #10
    DIV  AB
    MOV  DPTR,#TABLE  ;查表转换
    MOVC  A,  @A+DPTR
    MOV  BUF,  A
    MOV  A, B
    MOVC  A,  @A+DPTR
    MOV  BUF+1,  A
  ;转换分钟数据
    MOV  A,  MIN
    MOV  B,  #10
    DIV  AB
    MOV  DPTR,#TABLE  ;查表转换
    MOVC  A,  @A+DPTR
    MOV  BUF+2,  A
    MOV  A, B
    MOVC  A,  @A+DPTR
    MOV  BUF+3,  A
    RET
 
 ;字型数据编码表
 TABLE:
    DB  0C0H,0F9H,0A4H,0B0H
    DB  99H,92H,82H,0F8H
    DB  80H,90H,88H,83H
    DB  0C6H,0A1H,86H,8EH
 
 ;---------――――
 ;扫描显示
 DISP:
    MOV  R0,  #BUF   ;指向显示器显示缓冲区起始地址
    MOV  R2,  #4     ;循环执行4次
    MOV  ACC, #11111000B;加载扫描信号初值11110111B
  S1:
    PUSH  ACC
    MOV  A, @R0      ;取出显示器数据
    MOV  SEVEN, A       ;由P1送出一位显示器数据
    POP  ACC
    MOV  SEG, A     ;由P3送出扫描输出信号  
    MOV  R5, #5      ;延迟一会儿
    ACALL  DELAY
 ;低四位向友移移位
    ANL  A,#00001111B
    RR   A           ;累加器向右循环移动一位
    ORL  A,#11110000B;累加器高四位恢复
    INC  R0          ;显示器显示缓冲区地址加1
    DJNZ R2, S1      ;循环判断是否继续执行
    RET

 
 ;---―― 实现调整时间子程序 ――――――

 ;设置目前时间
 SET_TIME:
    CLR   TR0          ;定时器动作暂停
    MOV   SEC, #0      ;秒钟变量清除为0
  L0:
    ACALL  DISP        ;扫描显示
 
    JB   K2,  L1       ;未按下K2键则继续扫描
    JNB  K2,  $        ;有按下则等待放开来
   ;K2小时调整   
    INC  HOUR          ;小时计数加1
    MOV  A, HOUR
    CJNE  A,#24, L11   ;是否24H到了
    MOV  HOUR, #0      ;小时变量清除为0
  L11:
    ACALL  CONV        ;转换显示数据
    ACALL  DISP        ;扫描显示
    JMP    L0          ;继续程序执行
 
  L1:JB  K3, L2        ;未按下K3键则继续扫描
     JNB  K3,$      ;有按下则等待放开来
   ;K3分钟调整.
    INC  MIN           ;分钟计数加1
    MOV  A,  MIN
    CJNE  A,#60, L21   ;是否60 min到了
    MOV  MIN, #0       ;分钟变量清除为0
  L21:
    ACALL  CONV        ;转换显示数据
    ACALL  DISP        ;扫描显示
    JMP    L0          ;继续程序执行
 
  L2: JB   K4,L0       ;未按下K4键则继续扫描
    JNB    K4, $       ;有按下则等待放开来
    ACALL  BZ          ;压电喇叭鸣响一声
   ;K4设置完成
    ACALL  LED_BL      ;LED闪动
    SETB   TR0         ;启动定时器
    RET 


 ;----―喇叭和指示灯等其它子程序 ----――

 ;计时单元清零
 INIT:              
    MOV  DEDA,   #0   ;5ms计数值清除为0
    MOV  SEC,    #0   ;秒钟变量清除为0
    MOV  MIN,    #0   ;分钟变量清除为0
    MOV  HOUR,   #0   ;小时变量清除为0
    RET
 ;――――――――
  BZ:          ;―――――
 ;压电喇叭        ;压电喇叭鸣响一声
      MOV   R6, #250
  B1: ACALL DEX
      CPL   SPK
      DJNZ  R6,B1
      MOV   R5, #50 ;#10
      ACALL  DELAY
      RET
 
 ;----------―――
 ;工作指示
  LED_BL:             ;工作指示灯闪烁
      MOV   R4,#6
  LE1:CPL   WLED      ;位反向
      MOV   R5,#25 ;#5
      ACALL  DELAY
      DJNZ  R4, LE1   ;延迟50ms
      RET
 ;----------―――
 ;延时子程序
  DELAY:               ;;总延迟时间 R5* 2ms
     MOV   R6,#10 ;#50
  D1:MOV   R7,#100
     DJNZ  R7,$
     DJNZ  R6,D1
     DJNZ  R5,DELAY
     RET 
 ;----------―――
 ; 压电喇叭短暂延时子程序
 DEX:  MOV   R7,#180   ;短暂延时
  DE1: NOP
       DJNZ  R7, DE1
       RET
 ;----------―――

     END 

⌨️ 快捷键说明

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