×
单片机 > 单片机程序设计 > 详情

LED数码管汇编程序

发布时间:2020-06-08 发布时间:
|

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 





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单