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

📄 clock.asm

📁 在c51上实现电子时钟的功能。为汇编程序。用wave6000编译。已在51上使用过。
💻 ASM
字号:
       ORG 0000H
       LJMP START
       ORG 000BH    ;TO的中断入口
       LJMP PIT0
       ORG 0030H
START:
      MOV SP,#90H
      MOV R0,#70H    ;段显得起存地址
      MOV TMOD,#01H ;选择TO的方式1
      MOV TL0,#70H   ;时钟定时初始化
      MOV TH0,#3CH
      CLR 29H
      SETB EA        ;开中断
      SETB ET0
      SETB TR0

DISP: MOV 70H,#00H               ;分秒时都从0开始计时
      MOV 71H,#00H
      MOV 72H,#00H
      MOV 73H,#00H
      MOV 74H,#00H
      MOV 75H,#00H
      MOV 76H,#00H


DISPLAY: LJMP KEYI
      
      

         MOV R1,#70H
         MOV R2,#80H
DISPLAY0:
          INC R1
          MOV A,@R1     ;用查表方式取段码
          MOV DPTR,#TAB
          MOVC A,@A+DPTR

          MOV B,A
          MOV A,R2
          RL A
          MOV R2,A

          CJNE R2,#04H,DP1    ;显示第3,5位上的小数点
          MOV A,B
          ADD A,#80H
          MOV B,A

      DP1:CJNE R2,#10H,DP2
          MOV A,B
          ADD A,#80H
          MOV B,A

      DP2:MOV A,B             ;段码位码送入输出
          MOV P0,A
          MOV P1,R2
          LCALL DELAY
          CJNE R2,#20H,DISPLAY0
          LJMP DISPLAY




TAB: DB 3FH,06H,5BH,4FH,66H
     DB 6DH,7DH,07H,7FH,6FH

 ;定时器0的中断服务程序

PIT0: PUSH PSW          ; 保护现场
       PUSH ACC
       CLR TF0
       MOV TH0,#3CH      ;重装定时器的时间常数
       MOV TL0,#70H
       SETB TR0          ;开定时器
       INC 70H
       MOV R3,70H        ;进位
       CJNE R3,#20,RETI0
       MOV 70H,#00
       INC 71H
       MOV R3,71H
       CJNE R3,#10,RETI0
       MOV 71H,#00
       INC 72H
       MOV R3,72H
       CJNE R3,#06,RETI0
       MOV 72H,#00
       INC 73H
       MOV R3,73H
       CJNE R3,#10,RETI0
       MOV 73H,#00
       INC 74H
       MOV R3,74H
       CJNE R3,#06,RETI0
       MOV 74H,#00
       INC  75H
       MOV R3, 75H
       CJNE R3,#10,RETI0
       MOV 75H,#00
       INC 76H
       MOV R3,76H
       CJNE R3,#02,RETI0
       MOV 76H,#00
       LJMP RETI0

RETI0: POP ACC           ;中断返回
       POP PSW
       RETI



DELAY: MOV R7,#04
   D1: MOV R6,#250
   D2: DJNZ R6,D2
       DJNZ R7,D1
       RET

KEYI:LCALL KSI
     JNZ LK1      ;有键按下,跳到LK1 无键按下返回
     CLR 29H
     SJMP CALLDIS

LK1: JB 29H,CALLDIS
     ACALL DELAYS     ;有键按下,调用延时程序消抖
     ACALL KSI         ;消抖后看是否真的有键闭合
     JNZ  LK2          ;有键闭合就转键扫描
     LJMP CALLDIS                ;无键闭合就返回

   


LK2:CLR EA
    MOV R2,#0FEH         ;键扫描,找出在哪个位置
    MOV R4,#0

LK4:MOV P2,R2           ;扫描字从P2口输出,高四位本来就是高电平
    MOV A,P2            ;从P2口再把电平读入
    
    JB ACC.4,LONE       ;第4位为高电平,不在这列,转下列
    MOV A,#0            ;在这列,把列首键好保存到A
    SJMP LKP

LONE:JB ACC.5,LTWO
     MOV A,#4
     SJMP LKP

LTWO:JB ACC.6, LTHD
     MOV A,#8
     SJMP LKP

LTHD:JB ACC.7,NEXT
     MOV A,#12

LKP:ADD A,R4
    MOV 27H,A          ;键号保存在0F7H中
    SETB 29H            ;关闭中断
    SETB 28H
    LJMP KKY

NEXT:INC R4
     MOV A,R2
     JNB ACC.3,KND       ;行扫描到第三行后扫描结束,返回
     RL A                 ;未扫描完则移到下行
     MOV R2,A             ;扫描字从新放回R2
     SJMP LK4             ;从新开始下一行的扫描

KND:LJMP CALLDIS

KSI: MOV P2,#0FFH
     ANL P2,#0F0H
     CLR A
     MOV A,P2     
     ORL A,#0FH
     CPL A
     RET
KKY:JNB 28H,KKY4           ;查询键处理标志,如果01没置位,则返回
    CLR 28H                ;清除键申请标志,开始键处理
    INC R0
    MOV A,R0
    CJNE A,#77H,JUMP        ;71到76 内的段码没有都赋完值,则继续赋值,调时
    MOV R0,#70H           ;赋完值R0从新回到70,可从新赋值,调时
    SETB EA                  ;调时完从新开中断
    LJMP  CALLDIS
JUMP:MOV @R0,27H           ;把键值作为段的偏移量
     LJMP CALLDIS


DELAYS: MOV R5,#025          ;去抖得延时,10毫秒
    D3: MOV R4,#250
    D4: DJNZ R4,D4
        DJNZ R5,D3
        RET
KKY4:LJMP  CALLDIS

CALLDIS:MOV R1,#70H
        MOV R2,#80H
        LJMP DISPLAY0

⌨️ 快捷键说明

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