汇编电子钟的设计编程


      写在前面:

  前天晚上断网之后闲来无事忽然心血来潮想起和谁说过以我现在的水平做个时钟没有什么问题,就准备将它实现了。借用老师的学习板子,一直搞到凌晨2点做出了一个24小时的计数器显示,因为没有学过按键的使用方法,昨天实验课下课后问了老师,她给出了查询方式。昨晚搞了下,可以置数,但是不能实现0~60范围加,只能0~99加。今天上午在老师的指导下,终于可以了,总算没有食言啊。呵呵,下面贴出程序了。  

  先来个效果图:

8.jpg

        mini_second    equ    30h      ;设置0.05秒、秒、分、时的地址 ­

            second  equ    31h ­

            minute  equ    32h ­

            ck  equ    33h ­

            k1      equ    p3.2            ;设置按键地址,为外部中断口int0和int1 ­

            k2      equ    p3.3 ­

    ­

            org    0000h ­

            ljmp    start ­

            org    000bh ­

            ljmp    t0_x                      ;使用中断计时 ­

            org    0050h ­

    start:  mov    mini_second,#00h          ;清零 ­

            mov    second,#00h ­

            mov    minute,#00h ­

            mov    clock,#00h ­

            mov    tmod,#01h                ;置工作方式1,开定时器 ­

            mov    th0,#3ch ­

            mov    tl0,#0b0h ­

            setb    ea ­

            setb    et0 ­

            setb    tr0 ­

    start1: lcall  show_                ;主程序跳转程序显示 ­

            lcall  key_d                    ;置数程序 ­

            ljmp    start1                  ;一直循环显示 ­

    t0_x: ­

            push    a                      ;保护现场 ­

            push    psw ­

            mov    th0,#3ch                ;置初值,这个不是很准确, ­

            mov    tl0,#0b4h                ;估计一分钟慢个2~3秒 ­

            inc    mini_second ­

            mov    a,mini_second ­

            cjne    a,#20,ret0                ;20次为1秒,没有20次均跳出中断重新跳 ­

            mov    mini_second, #00h        ­

            mov    a,second ­

            add    a,#01h ­

            da      a ­

            mov    second,a ­

            cjne    a,#60h,ret0              ;1秒后出循环,每秒后秒清零,跳到分计时加1 ­

            mov    second,#00h ­

            mov    a,minute ­

            add    a,#01h                    ;分同秒 ­

            da      a ­

            mov    minute,a ­

            cjne    a,#60h,ret0 ­

            mov    minute,#00h ­

            mov    a,clock ­

            add    a,#01h ­

            da      a ­

            mov    clock,a ­

            cjne    a,#24h,ret0 ­

            mov    clock,#00h ­

    ret0:  pop    psw                      ;结束保护,跳出 ­

            pop    acc ­

            reti ­

            nop ­

            nop ­

            nop ­

    ;======================================显示子程序 ­

    show_led: ­

              mov        a,second            ;个位秒显示 ­

              anl        a,#0fh ­

              mov        40h,a ­

              clr        p1.5                ;片选 ­

              clr        p1.6 ­

              setb      p1.7 ­

              mov        a,40h ­

              lcall      led_x ­

              lcall      delay ­

              mov        a,second          ;十位秒显示 ­

              anl        a,#0f0h ­

              swap      a ­

              mov        41h,a ­

              setb      p1.5 ­

              clr        p1.6 ­

              setb      p1.7 ­

              mov        a,41h ­

              lcall      led_x ­

              lcall      delay ­

    ­

              mov        a,minute            ;个位分显示 ­

              anl        a,#0fh ­

              mov        42h,a ­

              setb      p1.5 ­

              setb      p1.6 ­

              setb      p1.7 ­

              mov        a,42h ­

              lcall      led_x ­

              lcall      delay ­

              mov        a,minute            ;十位分显示 ­

              anl        a,#0f0h ­

              swap      a ­

              mov        43h,a ­

              clr        p1.5 ­

              clr        p1.6 ­

              clr        p1.7 ­

              mov        a,43h ­

              lcall      led_x          ­

              lcall      delay ­

    ­

              mov        a,clock                  ;个位时显示 ­

              anl        a,#0fh ­

              mov        44h,a ­

              clr        p1.5 ­

              setb      p1.6 ­

              clr        p1.7 ­

              mov        a,44h ­

              lcall      led_x ­

              lcall      delay ­

              mov        a,clock                  ;十位时显示 ­

              anl        a,#0f0h ­

              swap      a ­

              mov        45h,a ­

              setb      p1.5 ­

              setb      p1.6 ­

              clr        p1.7 ­

              mov        a,45h ­

              lcall      led_x ­

              lcall      delay ­

              ret ­

    ­

    led_x:    mov        dptr,#led_data          ­

              movc        a,@a+dptr ­

              mov        p0,a ­

              ret ­

    ;====================================延迟子程序 ­

    delay:    mov        r7,#10 ­

    de1:      mov        r6,#100            ;延时1ms多一点,因为为11.0592M ­

              djnz      r6,$ ­

              djnz      r7,de1 ­

              ret ­

    ;===================================数码管的段选码 ­

    led_data:      db      0c0h,0f9h,0a4h,0b0h,099h,92h,82h,0f8h,80h,90h ­

    ;=====================================置数子程序 ­

    key_d:  jnb    k1,key1 ­

            jnb    k2,key2 ­

            ret ­

    key1:  mov    a,minute                ;查询方式 ————>          分位置数 ­

            clr    c                      ;清零进位,防止干扰da和cjne指令的操作 ­

            inc    a                      ;累加器自加一  ,此为加法置数 ­

            da      a                      ;十进制处理 ­

            cjne    a, #60h, k_01          ;判断是否为60,为60清零,跳出    ­

            mov    a,#00h ­

    k_01:  mov    minute,a ­

            jnb    k1,$ ­

            ret ­

    ­

    key2:  mov    a,clock                  ;时位 置数同上 ­

          clr    c ­

          inc    a ­

          da      a ­

          cjne    a, #24h,k_11 ­

          mov    a,#00h ­

    k_11:  mov    clock,a ­

          jnb    k2,$ ­

          ret ­
本程序如有雷同,纯属不可能 ?

    我的不够成熟或称之为幼稚的汇编编程,郑文老师的独特学习板子(显示数码管是p0口,片选竟然是用p1口3个I/O口接138,——!这个独特方式让我程序写得这么长),郑子含老师对我置数程序的修改,才出来的程序,虽然不是什么成功,至少是一个开始,我会继续疯下去的。这个时钟的弊端挺多的,比如置数的时候,会有闪屏现象,程序我会再改进的。 ?

    后记:对于院系电子设计竞赛我的失败我得向我的组员道歉,虽然我知道那些所谓成功的几组也比我们好不到哪里去(看过答辩了),但是我会继续我们的课题,加油吧 ?

    编译工具:wave6000 ?

    烧制工具:stc-isp(话说国产的stc公司要统一全球51市场,呵呵) 、RS232串口