历史上的今天
返回首页

历史上的今天

今天是:2025年01月06日(星期一)

正在发生

2018年01月06日 | 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 


推荐阅读

史海拾趣

Amphenol Nexus公司的发展小趣事

Amphenol Nexus Technologies的故事始于1961年,由William H. Flanagan和Randolph K. Byers两位创业者共同创立。当时,公司的核心业务是设计和制造高品质的音频插头、插孔和MIL-S-8805/3按钮开关。在创始人的领导下,公司凭借精湛的工艺和可靠的产品质量,逐渐在军事和商业通信耳机市场赢得了声誉。随着业务的扩展,Amphenol Nexus Technologies的产品线不断丰富,满足了市场日益增长的需求。

DRI Relays Inc公司的发展小趣事

为了满足全球客户的需求,DRI Relays Inc公司开始实施全球化战略。公司先后在亚洲、欧洲和美洲等地设立了分公司和研发中心,以便更好地了解当地市场需求和提供定制化服务。同时,公司还积极参与国际展览和交流活动,加强与全球客户的沟通和合作。这些举措不仅提高了公司的国际知名度,还为公司赢得了更多的订单和市场份额。

Gulf Semiconductor公司的发展小趣事

DRI Relays Inc公司成立于XX年代,当时电子继电器市场正处于快速发展阶段。公司创始人XXX凭借对市场趋势的敏锐洞察,决定投身于这一领域。然而,创业之初,公司面临资金短缺、技术瓶颈和市场竞争激烈等多重挑战。为了突破困境,XXX带领团队日夜兼程地研发新产品,不断改进技术,同时积极寻找投资者。在一次行业展会上,公司的新产品因其独特的设计和高性能吸引了众多客户的关注,为公司赢得了宝贵的订单和资金支持。

AK-Nord_GmbH公司的发展小趣事

为了确保产品质量和客户满意度,AK-Nord_GmbH投入大量资源建设质量管理体系。公司引入了国际先进的质量管理标准和流程,对产品的研发、生产、测试等各个环节进行严格把控。同时,公司还建立了完善的客户服务体系,及时响应客户需求和处理问题。这些举措有效提升了公司的产品质量和客户满意度,为公司赢得了良好的口碑。

Fermionics Lasertech Inc公司的发展小趣事

作为一家有社会责任感的企业,Fermionics Lasertech Inc公司始终关注环境保护和社会公益事业。他们积极推行绿色制造理念,采用环保材料和节能技术生产产品;同时,公司还积极参与各类公益活动,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了强大动力。

Dau Semiconductor Inc公司的发展小趣事

随着全球电子市场的不断发展壮大,Dau Semiconductor Inc公司开始将目光投向全球市场。公司积极开拓海外市场,与全球各地的电子产品制造商建立合作关系。同时,公司还加强了与国际知名半导体企业的合作与交流,共同推动半导体技术的发展和应用。展望未来,Dau Semiconductor Inc公司将继续秉承创新、卓越、服务的企业精神,为全球电子行业的发展做出更大的贡献。

问答坊 | AI 解惑

msp430单片机C语言程序设计实例精讲

    msp430单片机C语言程序设计实例精讲…

查看全部问答>

AVR单片机学习资料

看看有没有需要的 [ 本帖最后由 sanmaodeai 于 2009-10-22 15:52 编辑 ]…

查看全部问答>

汽车电子EMC设计测试基础

有很多的图例详细说明了一些测试设备测试方法,也展示了一些干扰耦合的途径,对初学者受益匪浅。 [ 本帖最后由 zero3360 于 2010-2-26 17:07 编辑 ]…

查看全部问答>

PBL405

那位大侠给看一下整流桥PBL405的基本参数是? 交流输入电压?输出等参数?  …

查看全部问答>

散分,看看一个3路AD采样的问题

大家好,前面发了两个帖子基本上在avr上开发入门了,有个3路ad采样的问题向大家再请教下 我用的是mage16,有一个传感器,分别3路连到PA0.PA1.PA2上,现在需要实时收集这个传感器的数据,看了下网上的资料 我在整理了下思路: 由ADC的中断启动 连 ...…

查看全部问答>

看不懂这个网表文件的两句话

网表文件如下,是别人在AIM SPICE软件里写的代码,有几句话没有看懂,能不能懂行的同志来帮忙解释一下。 *analog to PV cell I1 0 1 dc 4 d1 1 0 diode1 rsh1 1 0 100 rs1 1 2 .1 e1 2 0 20 0 1 I11 0 11 dc 4 d11 11 0 diode2 rsh11 11 ...…

查看全部问答>

手写开发请教

YC开发板手写开发请教我需要实现全屏手写的功能,目前为止得到的方法就是要自己写一个触摸屏的驱动,因为系统本身就有一个touch.dll,所以我其实只是做了一个包装,把touch.dll的函数用GetProcAddress得到后在调用,生成一个伪驱动mytouch.dll 我 ...…

查看全部问答>

能用PWM控制芯片做隔离充电吗?

最近想做一个隔离充电,发射端输入是~220V,接收端主要是给4.8V的镍氢电池组充电,电池组容量是800mAH,为了缩短充电时间,因此,接收端的充电电流希望能达到400mA左右。想用开关电源里面常用的PWM控制管理芯片(viper22a ,thx203h),不知道能不 ...…

查看全部问答>

哈哈,我也来一个launchpad低功耗时钟的设计~~~

其实构思了有一阵子了,不过因为事情太多没仔细想,今天稍微整理一下,以后再慢慢做吧,心急的筒子们可要耐住性子啦之前坛子里就有低功耗时钟的DIY,不过看来看去好像还是用的成品屏,多一个控制芯片就多一个耗电的地方啊,最好是直接驱动笔段屏那 ...…

查看全部问答>

给大家推荐一款加密IC--AT88SA102S

    AT88SA102S是ATMEL新推出基于高安全性的安全认证加密IC。采用标准SHA-256 哈希散列算法,消息总长度为704位(88字节),产生256位(32字节)消息摘要。SOT-23-3 封装,体积微小,有很强的隐蔽性。单线通信,占用资源少。开发简单, ...…

查看全部问答>