Scan4Disp.asm
上传用户:cnlazy
上传日期:2021-04-25
资源大小:163k
文件大小:2k
源码类别:

单片机开发

开发平台:

DOS

  1. ;要求将R5中的值显示在二个数码管上 
  2. ;编程思路:  有4个数码管 用30H、31H、32H、33H作显示缓存 30H存个位 31H存十位 32H存百位 33H存千位 
  3. ;但R5中的值最大为255 不会超过百位 所以没有千位上的显示 那么就让千位始终显示0  将R5中的值用三个
  4. ;BCD码显示在三个数码管上
  5. ORG  0000H
  6. AJMP Main
  7. Main: MOV SP,#60H
  8.         MOV R5,#89H 
  9. LOOP: CLR P1.0
  10.         CALL DispProtec
  11.         CALL Disp
  12.         CALL DELAY
  13. SETB P1.0
  14. CALL DELAY
  15. AJMP  LOOP
  16. DispProtec: MOV A,R5
  17.             MOV B,#100
  18. DIV AB
  19. MOV 32H,A ;百位存入32H
  20. MOV A,B
  21. MOV B,#10
  22. DIV AB
  23. MOV 31H,A ;十位存入31H           
  24. MOV A,B
  25. MOV 30H,A ;个位存入30H
  26. MOV 33H,#0 ;33H为千位 没有数据要存入 就让其一直为0  
  27. RET
  28.        DELAY: MOV R7,#0DH
  29. DE10: MOV R6,#0FFH
  30. DE01: DJNZ R6,DE01
  31.         DJNZ R7,DE10
  32. RET
  33. Disp: MOV DPTR,#TAB1      ;DPTR指向7段数码显示的译码表(亦即段选)
  34.             MOV A,@R0           ;R0为显示缓存单元指针,初始值指向个位的30H,个位显示后 加1指向下一位,当R1超过33H后又回到30H
  35. MOVC A,@A+DPTR
  36. MOV P0,#0
  37. MOV P0,A
  38. MOV DPTR,#TAB2     ;DPTR指向位选表
  39. MOV A,R0            ;A中的值为当前要显示的缓存地址,由于缓存地址从30H开始,如果A减去30H,就得到当前正显示的是个、十、百、千中的哪一位
  40. CLR  CY             ;因为带借位减 CY清0
  41. SUBB A,#30H
  42. MOVC A,@A+DPTR
  43. MOV P2,A
  44. INC R0               ;显示下一位
  45. CJNE R0,#34H,Over
  46. MOV R0,#30H
  47. Over: RET
  48.         TAB1: DB 3FH,06H,5BH,4FH,66H ,6DH ,7DH ,07H ,7FH ,6FH ,77H,7CH,39H,5EH,79H,71H
  49. TAB2: DB 0F7H,0FBH,0FDH,0FEH
  50. END