proteus.asm
Upload User: cyl1202
Upload Date: 2020-01-10
Package Size: 2k
Code Size: 3k
Category:

SCM

Development Platform:

DOS

  1.  MS     EQU   7FH          ;50ms定时计数单元
  2. BUFF   DATA  40H        ; BUFF~BUFF+5存放计数值BCD码,BUFF最
  3. ;低位
  4. THH    EQU   51H         ;脉冲计数值(二进制)高位地址单元
  5.  TLL     EQU   50H    ;脉冲计数值(二进制)低位地址单元
  6. BTOD   EQU   60H          ;计数值BCD码的首地址,BTOD单元保存最低
  7. ;字节,BTOD+2单元保存最高位
  8. BINA   EQU    70H      ;脉冲计数值(二进制)地址单元,BINA保存低
  9. ;位,BINA+1 保存高位
  10. INTF0  BIT  20H.0   ;秒计时到标志
  11. ORG    0000H         
  12. LJMP    START       ;转到开始程序入口
  13. ORG     000BH
  14. LJMP    INT0S    ;转到T0中断程序入口
  15. START: MOV    MS,#20    ;软计数初值
  16. MOV    TMOD,#51H    ;T0定时、T1计数模式,工作方式1
  17. MOV    TH0,#3CH     ;T0定时初值,(晶振频率12MHz,定时50ms)
  18. MOV    TL0,#0B0H    
  19.  MOV    TH1,#0             ;计数值从0开始
  20.  MOV    TL1,#0
  21. SETB   TR0           ;启动T0
  22. SETB   TR1          ;启动T1
  23. MOV    SP,#30H
  24.   SETB   EA           ;允许T0中断
  25. SETB   ET0
  26. MAIN: JBC    INTF0,CONVT   ;判断秒计时到否?秒计时到转CONVT
  27. LCALL  DISP
  28. SETB   EA
  29.  LJMP   MAIN
  30. CONVT: NOP
  31.  MOV   BINA,TLL
  32.  MOV   BINA+1,THH
  33. LCALL  B2BCD
  34.   LCALL SLIP
  35.  LJMP   MAIN
  36.  B2BCD: CLR    A             ;二进制数转换BCD码程序
  37. MOV    R0,#BTOD       ;BTOD~BTOD+2单元清0
  38. MOV    R1,#03H
  39. D0: MOV    @R0,A
  40. INC     R0
  41. DJNZ    R1,D0
  42. MOV    R6,#10H       ;二进制位数存于R6中
  43. D1: MOV    R0,#BINA            ;BINA~BINA+1单元二进制数左移一位
  44. ;后存入原单元中
  45. MOV   R1,#02H
  46. D2: MOV   A,@R0
  47. RLC    A
  48. MOV   @R0,A
  49. INC    R0
  50. DJNZ   R1,D2
  51. MOV    R0,#BTOD     ;BTOD~BTOD+2结果单元内容乘2+Cy并进行
  52. ;调整后存入原单元
  53. MOV    R1,#03H
  54. D3: MOV    A,@R0
  55. ADDC   A,@R0
  56. DA     A
  57. MOV    @R0,A
  58. INC    R0
  59. DJNZ   R1,D3
  60. DJNZ   R6,D1         ;外循环直到全部处理完毕
  61.   RET
  62. SLIP: MOV    R0,#BTOD     ;显示数据送到显示缓冲区中,最低位数据在
  63. ;BUFF单
  64. ;元,最高位显示数据在BUFF+5单元
  65. MOV    R1,#BUFF     ;显示缓冲区首地址
  66. MOV    R2,#03H       ;分离次数
  67. SLIP1: MOV    A,@R0         ;取显示数据
  68. ANL    A,#0FH        ;将压缩BCD码低4位送到指定显示缓冲区存储
  69. ;单元中
  70. MOV   @R1,A
  71. INC    R1            ;调整显示缓冲区地址
  72. MOV    A,@R0
  73. ANL    A,#0F0H       ;将压缩BCD码低4位送到指定显示缓冲区存储
  74. ;单元中
  75. SWAP  A
  76. MOV   @R1,A
  77. INC    R1            ;调整显示缓冲区地址
  78. INC    R0           ;调整显示数据地址
  79. DJNZ   R2,SLIP1     
  80. RET
  81. DISP: MOV    R0,#BUFF       ;显示程序(动态显示,P0口显示码,P2口位
  82. ;码)
  83. MOV    R2,#06H        ;数码管位数
  84. MOV    R3,#01H        ;最右面数码管位码
  85. MOV    DPTR,#TABLE   ;表首地址
  86. DISP1: MOV    A,R3
  87. MOV    P2,A           ;输出位码
  88. RL      A             ;调整位码
  89. MOV    R3,A             ;保存位码
  90. MOV    A,@R0           ;取显示数值
  91. MOVC  A,@A+DPTR       ;查表得到相应显示码
  92. MOV    P0,A             ;输出显示码
  93. INC    R0                ;调整显示缓冲区指针
  94. LCALL DELAY             ;延时 
  95. DJNZ   R2,DISP1    ;判断6位是否显示完成?没完成转DISP1继续
  96. ;显示下一位
  97. RET
  98. TABLE: DB   3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 
  99. ;0~9的共阴极显示码
  100. DELAY: MOV    R7,#10            ;延时程序
  101. DELAY0:MOV    R6,#100
  102. DELAY1:DJNZ   R6,DELAY1  
  103. DJNZ   R7,DELAY0
  104.  RET
  105. INT0S: MOV   TH0,#3CH      ;定时器0中断服务程序
  106. MOV   TL0,#0B0H     ;恢复定时初值
  107. DJNZ   MS, T0END      ;判断秒计时到否?
  108. MOV   MS,#20        ;恢复软计数
  109. SETB   INTF0       ;建立秒标志
  110. MOV   THH,TH1       ;读T1计数值
  111. MOV   TLL,TL1      
  112. MOV   TH1,#00H         ;T1计数初值
  113. MOV   TL1,#00H
  114. T0END: RETI     
  115. END