单片机
返回首页

LED数码管汇编程序

2018-01-06 来源:eefocus

LED数码管汇编程序

DISPBUF EQU 50H   ;50H,51H,52H,53H是显示缓冲区 
LED1  EQU P2.0    ;第一位数码管的位控制 
LED2  EQU P2.1    ;第二位数码管的位控制

LED3  EQU P2.2    ;第三位数码管的位控制 
LED4  EQU P2.3    ;第四位数码管的位控制 
LED5  EQU P2.4 
LED6  EQU P2.5 
LED7  EQU P2.6 
LED8  EQU P2.7 
;============================================================== 
    org 0000h 
    LJMP MAIN 
    ORG 0003H 
    RETI 
    ORG 000BH 
    RETI 
    ORG 0013H 
    RETI 
    ORG 001BH 
    RETI 
    ORG 0023H 
    RETI 
MAIN: 
    MOV    R0,#50H 
    MOV    65H, #2 
    MOV    64H,  #3 
    MOV    63H,  #5 
    MOV    62H,  #9 
    MOV    61H,  #5 
    MOV    60H,  #9 
    MOV    59H,  #1 
    MOV    58H,  #2 

    ACALL    OUT 
LOOP1:ACALL DISP          ;调用显示程序 
       
      JNB   P3.2,K1 
      JNB   P3.3,K2 
       
      ACALL  TIME 
      AJMP  LOOP1 
K1:   LJMP   CLEAR 
K2:   LJMP   PAUSE 
TIME: 
      MOV    R0,#59H     ;指向毫秒计时单元 
      ACALL   ADD1        ;调用加1程序(加1毫秒操作) 
      MOV   A,R3          ;毫秒数据放入A(R3为2位十进制数组合) 
      CLR    C              ;清进位标志 
      CJNE     A,#60H,ADDS 
ADDS:  JC   OUT            ;小于60毫秒时中断退出 
      ACALL    CLR0        ;大于或等于60毫秒时对秒计时单元清0 
      MOV   R0,#61H        ;指向秒计时单元 
      ACALL   ADD1         ;调用加1程序(加1秒操作) 
      MOV   A,  R3         ;秒数据放入A(R3为2位十进制数组合) 
      CLR   C              ;清进位标志 
      CJNE     A,  #60H,ADDM 
ADDM:  JC   OUT             ;小于60秒时中断退出 
     ACALL    CLR0         ;大于或等于60秒时对秒计时单元清0 
      MOV    R0,#63H         ;指向分计时单元 
      ACALL   ADD1          ;分计时单元加1分钟 
      MOV    A,R3           ;分数据放入A 
      CLR   C               ;清进位标志 
      CJNE    A,#60H,ADDH 
ADDH:  JC   OUT              ;小于60分时中断退出 
      ACALL    CLR0          ;大于或等于60分时分计时单元清0 
      MOV    R0,#65H         ;指向小时计时单元 
      ACALL    ADD1          ;小时计时单元加1小时 
      MOV    A,R3             ;时数据放入A 
      CLR   C                 ;清进位标志 
      CJNE    A,#24H,HOUR 
HOUR:  JC   OUT             ;小于24小时中断退出 
       ACALL    CLR0          ;大于或等于24小时计时单元清零 
OUT: 
    MOV   DISPBUF,   65H 
    MOV   DISPBUF+1, 64H 
    MOV   DISPBUF+2, 63H 
    MOV   DISPBUF+3, 62H 
    MOV   DISPBUF+4,61H 
    MOV   DISPBUF+5, 60H 
    MOV    DISPBUF+6,59H 
    MOV    DISPBUF+7,58H 

    RETI 
;====================================================================== 
           ;清零程序 
;====================================================================== 
CLR0: 
    CLR   A            ;清累加器 
    MOV    @R0,A       ;清当前地址单元 
    DEC    R0          ;指向前一地址 
    MOV    @R0,A       ;前一地址单元清零 
    RET 

;====================================================================== 
                     ;加1子程序 
;====================================================================== 
ADD1: 
   MOV    A,@R0        ;取当前计时单元数据到A 
   DEC   R0            ;指向前一地址 
   SWAP     A          ;A中数据高四位与低四位交换 
   ORL    A,@R0        ;前一地址中数据放入A中低四位 
   ADD   A,#01H        ;A加1操作 
   DA    A             ;十进制调整 
   MOV    R3,A         ;移入R3寄存器 
   ANL    A,#0FH       ;高四位变0 
   MOV    @R0,A        ;放回前一地址单元 
   MOV    A,R3         ;取回R3中暂存数据 
   INC   R0            ;指向当前地址单元 
   SWAP    A           ;A中数据高四位与低四位交换 
   ANL    A,#0FH       ;高四位变0 
   MOV    @R0,A        ;数据放入当前地址单元中 
   RET 
;====================================================================== 
             ;显示程序 
;====================================================================== 
DISP: 
    ;----------------------------------------------------------- 
    MOV     A,DISPBUF   ;取第一个待显示数 
    MOV     DPTR,#DISPTAB 
    MOVC    A,@A+DPTR   ;取字形码 
    CPL A ; 
    MOV     P0,A        ;将字形码送P0位(段口) 
    CLR     LED1       ;开第一位显示器位口 
    LCALL   DELAY       ;延时5毫秒 
    SETB    LED1       ;关闭第一位显示器(开始准备第二位的数据) 
    ;----------------------------------------------------------- 
    MOV     A,DISPBUF+1 ;取显示缓冲区的第二位 
    MOV     DPTR,#DISPTAB 
    MOVC    A,@A+DPTR 
    CPL A ; 
    MOV     P0,A        ;将第二个字形码送P0口 
    CLR     LED2      ;开第二位显示器 
    LCALL   DELAY       ;延时5毫秒 
    SETB    LED2      ;关第二位显示 
    ;----------------------------------------------------------- 
    MOV     A,DISPBUF+2   ;取显示缓冲区的第三位 
    MOV     DPTR,#DISPTAB 
    MOVC    A,@A+DPTR   ;取字形码 
    CPL A ; 
    MOV     P0,A        ;将第三个字形码送P0位(段口) 
    CLR     LED3       ;开第三位显示器位口 
    LCALL   DELAY       ;延时5毫秒 
    SETB    LED3       ;关闭第三位显示器 
    ;----------------------------------------------------------- 
    MOV     A,DISPBUF+3   ;取显示缓冲区的第四位 
    MOV     DPTR,#DISPTAB 
    MOVC    A,@A+DPTR   ;取字形码 
    CPL A ; 
    MOV     P0,A        ;将第四个字形码送P0位(段口) 
    CLR     LED4       ;开第四位显示器位口 
    LCALL   DELAY       ;延时5毫秒 
    SETB    LED4       ;关闭第四位显示器 
    ;----------------------------------------------------------- 
    MOV     A,DISPBUF+4    ;取显示缓冲区的第五位 
    MOV     DPTR ,#DISPTAB 
    MOVC    A,@A+DPTR     ;取字形码 
    CPL  A 
    MOV    P0,A           ;将第五个字形码送P0位(段口) 
    CLR    LED5           ;开第五位显示器位口 
    LCALL   DELAY         ;延时5毫秒 
    SETB    LED5          ;关闭第五位显示器 

    ;----------------------------------------------------------- 
    MOV     A,DISPBUF+5    ;取显示缓冲区的第六位 
    MOV     DPTR  ,#DISPTAB 
    MOVC    A,@A+DPTR      ;取字形码 
    CPL    A 
    MOV    P0,A            ;将第六个字形码送P0位(段口) 
    CLR    LED6            ;开第六位显示器位口 
    LCALL   DELAY          ;延时5毫秒 
    SETB    LED6           ;关闭第六位显示器 

    ;----------------------------------------------------------- 
    MOV    A,DISPBUF+6     ;取显示缓冲区的第七位 
    MOV    DPTR   ,#DISPTAB 
    MOVC   A,@A+DPTR       ;取字形码 
    CPL    A 
    MOV     P0,A           ;将第七个字形码送P0位(段口) 
    CLR     LED7           ;开第七位显示器位口 
    LCALL      DELAY       ;延时5毫秒 
    SETB     LED7          ;关闭第七位显示器 

    ;----------------------------------------------------------- 

    MOV    A,DISPBUF+7    ;取显示缓冲区的第八位 
    MOV     DPTR  ,#DISPTAB 
    MOVC    A,@A+DPTR     ;取字形码 
    CPL     A 
    MOV    P0,A           ;将第八个字形码送P0位(段口) 
    CLR     LED8          ;开第八位显示器位口 
    LCALL     DELAY       ;延时5毫秒 
    SETB     LED8         ;关闭第八位显示器 

    ;----------------------------------------------------------- 
    RET 
PAUSE:                     
   ACALL DISP 
   JNB    P3.2,K3 
   AJMP PAUSE 
  K3:    acall CLEAR 
CLEAR:                      
         MOV   58H, #0 
         MOV   59H, #0 
         MOV   60H, #0 
         MOV   61H, #0 
         MOV   62H, #0 
         MOV   63H, #0 
         MOV   64H, #0 
         MOV   65H, #0 
         LJMP LOOP1 
         RETI 
  
       
         
      
;====================================================================== 
                ;延时程序 
;====================================================================== 
DELAY: 
    MOV     R6,#20H  ;延时约5mS 
D1: MOV     R7,#10H 
D2: DJNZ    R7,D2 
    DJNZ    R6,D1 
    RET 
;====================================================================== 
DISPTAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0ffh 


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章