我在用51做一个数字时钟,显示时老是串着显示(已解决)

2020-01-21 21:35发布

本帖最后由 thy110 于 2014-12-17 18:14 编辑

我在用51做一个数字时钟,显示时老是串着显示,
我单独测试时,每个位都正常显示的是正确的时间,
但是一起显示时,显示很混乱,仔细观察了一下,秒钟个位同时在秒钟的十位和个位显示,秒钟的十位同时在秒钟的十位和分钟的个位显示,分钟的个位在分钟的各位和十位显示,造成了显示重叠了。但是我的程序逻辑上不应该这样啊
不知道怎么回事啊,求助
  1. BUF_HOUR_H        DATA        30H                ; 小时十位
  2. BUF_HOUR_L        DATA        31H        ; 小时个位
  3. BUF_MIN_H        DATA        32H        ; 分十位
  4. BUF_MIN_L        DATA        33H        ; 分个位
  5. BUF_SEC_H        DATA    34H        ; 秒十位
  6. BUF_SEC_L        DATA        35H        ; 秒个位

  7. ORG 0000H
  8. LJMP MAIN
  9. ORG 001BH
  10. AJMP SERVE1
  11. ORG 0100H

  12. MAIN:
  13.      MOV P1,#0FFH
  14.          MOV P0,#0FFH
  15.          MOV R0,#00H
  16.          MOV R1,#00H
  17.          MOV R2,#00H  
  18.          MOV R3,#14H   //20
  19.          MOV BUF_HOUR_H,#0FFH
  20.          MOV BUF_HOUR_L,#0FFH
  21.          MOV BUF_MIN_H,#0FFH
  22.          MOV BUF_MIN_L,#0FFH
  23.          MOV BUF_SEC_H,#0FFH
  24.          MOV BUF_SEC_L,#0FFH
  25.          MOV TMOD,#10H
  26.          MOV TL1,#0B0H                 //50MS
  27.          MOV TH1,#3CH
  28.          SETB TR1
  29.          SETB ET1
  30.          SETB EA

  31.         LJMP DISPLAY   //显示函数
  32. SERVE1:
  33.       MOV TL1,#0B0H
  34.           MOV TH1,#3CH
  35.       DJNZ R3,LOOP     ;是否中断20次(达到1s)
  36.           MOV R3,#14H    ; 达到1s
  37.           CPL P0.4  
  38.           LCALL        INC_SEC                        ;秒加1           
  39. LOOP:RETI
  40. INC_SEC:INC          R0                ;秒加1
  41.             MOV          A,        R0   
  42.             SETB         C
  43.             SUBB         A,#59                        ;如果秒等于60,则秒清0,分加1
  44.             JC           L1                  ;显示秒
  45.             MOV          R0,#00H
  46.             LCALL        INC_MIN
  47. L1: MOV          A,R0
  48.         MOV          B,#10
  49.         DIV          AB                        ; A = SEC / 10
  50.         MOV          DPTR,#DIS_CODE
  51.         MOVC         A,@A+DPTR                ;
  52.         MOV          BUF_SEC_H,A                ;
  53.        
  54.         MOV          A,R0
  55.         MOV          B,#10
  56.         DIV          AB
  57.         MOV          A,B                        ; A = SEC % 10
  58.         MOVC         A,@A+DPTR
  59.         MOV          BUF_SEC_L,A
  60.         RET         
  61. INC_MIN:
  62.         INC          R1                        ; 分钟加1
  63.         MOV          A,R1                        ;
  64.         SETB         C
  65.         SUBB         A,#59       
  66.         JC           L2                ; 如果分钟等于60,则分清0,小时加1
  67.         MOV          R1,#00H
  68.         LCALL        INC_HOUR                ; 小时加1
  69. L2:  MOV          A,R1
  70.         MOV          B,#10
  71.         DIV          AB                        ; A = MIN / 10       
  72.         MOV          DPTR,#DIS_CODE
  73.         MOVC         A,@A+DPTR
  74.         MOV          BUF_MIN_H,A                ; 更新分十位       
  75.         MOV          A,R1
  76.         MOV          B,#10
  77.         DIV          AB
  78.         MOV          A,B                        ; A = MIN % 10
  79.         MOVC         A,@A+DPTR
  80.         MOV          BUF_MIN_L,A                ; 更新分个位       
  81.         RET         
  82. INC_HOUR:
  83.         INC          R2                ; 小时加1
  84.         MOV          A,R2
  85.         SETB         C
  86.         SUBB         A,#24
  87.         JC           L3                ; 如果小时等于24,则小时清0
  88.         MOV     R2,#00H                ; 小时清0                  
  89. L3: MOV          A,R2
  90.         SETB         C
  91.         SUBB         A,#10
  92.         JC           L4        ; 如果小时小于10,则十位0不显示
  93.       MOV A,R2  //时 十位
  94.           MOV B,#10
  95.           DIV AB
  96.             MOV          A,R2
  97.              MOV          B,#10
  98.             DIV          AB
  99.             MOV          DPTR,#DIS_CODE
  100.             MOVC         A,@A+DPTR                ;
  101.             MOV          BUF_HOUR_H,A
  102.           SJMP L5
  103. L4:  MOV          BUF_HOUR_H,#0FFH                 //时 十位         
  104. L5:  MOV         A,R2   //时 个位
  105.          MOV          B,#10
  106.            DIV          AB
  107.          MOV          A,B
  108.          MOV          DPTR,#DIS_CODE
  109.          MOVC         A,@A+DPTR
  110.          MOV          BUF_HOUR_L,A
  111.          RET  
  112. DISPLAY:   /*SETB P0.0         
  113.            MOV P1,BUF_HOUR_H
  114.                CLR P0.0
  115.                ACALL DELAY_1MS
  116.                SETB P0.1
  117.                MOV P1,#01H
  118.                CLR P0.1
  119.                ACALL DELAY_1MS

  120.                    SETB P0.0         
  121.            MOV P1,BUF_HOUR_L
  122.                CLR P0.0
  123.                ACALL DELAY_1MS
  124.                SETB P0.1
  125.                MOV P1,#02H
  126.                CLR P0.1
  127.                ACALL DELAY_1MS

  128.                    SETB P0.0         
  129.            MOV P1,BUF_MIN_H
  130.                CLR P0.0
  131.                ACALL DELAY_1MS         
  132.                SETB P0.1
  133.                MOV P1,#04H
  134.                CLR P0.1
  135.                ACALL DELAY_1MS */

  136.                    SETB P0.0         
  137.            MOV P1,BUF_MIN_L
  138.                CLR P0.0
  139.                ACALL DELAY_1MS         
  140.                SETB P0.1
  141.                MOV P1,#08H
  142.                CLR P0.1
  143.                ACALL DELAY_1MS         

  144.                   
  145.                   /* SETB P0.0         
  146.            MOV P1,BUF_SEC_H
  147.                CLR P0.0
  148.                ACALL DELAY_1MS         
  149.                SETB P0.1
  150.                MOV P1,#10H
  151.                CLR P0.1
  152.                ACALL DELAY_1MS
  153.                   SETB P0.0                            
  154.            MOV P1,BUF_SEC_L
  155.                CLR P0.0
  156.                ACALL DELAY_1MS         
  157.                SETB P0.1
  158.                MOV P1,#20H
  159.                CLR P0.1
  160.                ACALL DELAY_1MS*/
  161.                    SJMP DISPLAY

  162. DELAY_1MS:MOV R7,#01H
  163. TS1:       MOV R6,#0FFH
  164. TS2:       DJNZ R6,TS2
  165.            DJNZ R7,TS1
  166.                    RET
  167. DIS_CODE:
  168.         DB        0C0H
  169.         DB        0F9H
  170.         DB        0A4H
  171.         DB        0B0H
  172.         DB        099H
  173.         DB        092H
  174.         DB        082H
  175.         DB        0F8H
  176.         DB        080H
  177.         DB        090H
  178.         DB        0FFH
  179.       END
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
磊磊映画
2020-01-22 09:23
thy110 发表于 2014-12-17 17:09
位选我是一个一个设置的 啊

P0口你作为位选了P1口作为 段选了,我看你P0口只是循环P0.0 和P0.1         了也就是只有这两位
参考一下我之前做的代码





  1. DISP:  
  2. MOV   A,A_BIT
  3. MOV   DPTR,#TAB
  4. MOVC   A,@A+DPTR
  5. MOV   P0,A   
  6. CLR   P1.2  
  7. ACALL   D1MS  
  8. SETB   P1.2

  9. MOV   A,B_BIT  
  10. MOVC   A,@A+DPTR  
  11. MOV   P0,A   
  12. CLR   P1.3  
  13. ACALL   D1MS   
  14. SETB P1.3
  15.   
  16. MOV A,C_BIT
  17. MOVC   A,@A+DPTR   
  18. MOV   P0,A
  19. SETB P0.7   
  20. CLR   P1.4
  21. ACALL   D1MS   ;显示1ms
  22. SETB P1.4

  23. MOV   A,D_BIT  ;取
  24. MOVC   A,@A+DPTR  ;
  25. MOV   P0,A   
  26. CLR  P1.5  
  27. ACALL   D1MS   ;显示1ms
  28. SETB P1.5

  29. MOV   A,E_BIT  ;取
  30. MOVC   A,@A+DPTR  ;
  31. MOV   P0,A
  32. SETB P0.7   
  33. CLR   P1.6  
  34. ACALL   D1MS   ;显示1ms
  35. SETB P1.6

  36. MOV   A,F_BIT  ;取
  37. MOVC   A,@A+DPTR  ;
  38. MOV   P0,A   
  39. CLR   P1.7  
  40. ACALL   D1MS   ;显示1ms
  41. SETB P1.7
  42. RET
复制代码




一周热门 更多>