找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1326|回复: 1
打印 上一主题 下一主题
收起左侧

基于89C51单片机的时钟汇编程序设计显示出现问题

[复制链接]
跳转到指定楼层
楼主
这是根某个共阳极数码管的程序修改来的,替换为了阴极数码管,对程序也进行了相应的改动,但显示时间时无法按照应有的顺序进行正常的显示,求助各位大神,希望能指出被我忽略的错误和有效的思路。



单片机源程序如下:
  1. ORG 0000H
  2. AJMP MAIN
  3. ORG 000BH
  4. LJMP INTT0

  5. ORG 0030H
  6. MAIN:
  7. MOV SP,#60H ;确立堆栈区
  8. MOV PSW,#00H
  9. MOV R0,#20H   ;RAM区首地址
  10. MOV R7,#5FH ;RAM区单元个数

  11. QL:
  12. MOV @R0,#00H ;RAM清零       
  13. INC R0
  14. DJNZ R7,QL

  15. MOV IP,#02H ;IP初始化,优先定时器0
  16. MOV IE,#82H ;IE初始化
  17. MOV TMOD,#01H ;定时器0方式1工作
  18. LCALL PP ;调P.子程序

  19. NEXT:
  20. LCALL KEY ;按键检测子程序
  21. JB ACC.0,RUNF ;A键按下运行
  22. LCALL DISP ;调用显示子程序
  23. SJMP NEXT

  24. RUNF:
  25. LCALL OUTT ;调传送子程序
  26. LCALL TIME ;开电子钟
  27. JK:
  28. LCALL DISP
  29. LCALL KEY
  30. JZ JK
  31. LCALL ANKEY        ;调用键功能子程序
  32. LCALL DISP
  33. SJMP JK

  34. ;P点显示的8LED段码初始化子程序
  35. PP:
  36. MOV 37H,#12 ;P点编码送寄存器,对应最左LED  (共阳极,0CH )
  37. MOV R0,#30H ;第8个LED,最右LED,段码存储的地址
  38. MOV R7,#07H         ;第8到第2个LED,共7个,初始化段码显示空白
  39. PPP:
  40. MOV @R0,#10  ;显示空白
  41. INC R0
  42. DJNZ R7,PPP
  43. RET

  44. ;键扫描子程序
  45. KEY:
  46. LCALL KEYS ;调用键值处理子程序
  47. JZ EXIT ;没有键按下转到返回
  48. LCALL DISP
  49. LCALL DISP ;调用显示去抖动
  50. LCALL KEYS
  51. JZ EXIT
  52. MOV B,20H ;保存键值
  53. KEYSF:
  54. LCALL KEYS
  55. JZ KEYY ;键释放,转到恢复键值
  56. LCALL DISP ;调显示子程序延时
  57. AJMP KEYSF ;等到键释放

  58. KEYY:
  59. MOV A,B ;键值送A
  60. EXIT:RET

  61. KEYS:
  62. MOV P1,#0FFH ;先向P1口写1
  63. MOV A,P1 ;P1口值送A         (有按键按下,对应0,取反后1)
  64. CPL A
  65. ANL A,#0FH ;保存P1口的低4位
  66. MOV 20H,A ;A值送20H保存
  67. RET

  68. ;键功能子程序
  69. ANKEY:
  70. CLR EA ;关中断
  71. CHECK:
  72. JB TR0,YXZ ;判断是否运行
  73. K0:
  74. CJNE A,#01H,K1
  75. AJMP RUN ;A键按下,恢复运行,转运行
  76. K1:
  77. CJNE A,#02H,K2
  78. AJMP KEY1 ;转时调整
  79. K2:
  80. CJNE A,#40H,K3
  81. AJMP KEY2 ;转分调整
  82. K3:
  83. CJNE A,#08H,OUT          ;转
  84. AJMP KEY3 ;转秒调整

  85. YXZ:
  86. JB ACC.0,STOP        ;A键按下,暂停
  87. AJMP OUT

  88. KEY1:
  89. MOV R0,#45H ;时调整
  90. LCALL ADD1 ;调加一子程序
  91. CLR C
  92. CJNE A,#24H,OUTT ;转传送显示数据子程序
  93. ACALL CLR0 ;调时间清理子程序
  94. AJMP OUTT
  95. KEY2:
  96. MOV R0,#43H ;分调整
  97. LCALL ADD1
  98. CLR C
  99. CJNE A,#60H,OUTT
  100. ACALL CLR0
  101. AJMP OUTT
  102. KEY3:
  103. MOV R0,#41H ;秒调整
  104. ACALL ADD1
  105. CLR C
  106. CJNE A,#60H,OUTT
  107. ACALL CLR0

  108. ;传送显示数据子程序
  109. OUTT:
  110. MOV 30H,40H ;秒显示单元40H-41H
  111. MOV 31H,41H
  112. MOV 32H,#11 ;"-"
  113. MOV 33H,42H ;分显示单元42H-43H
  114. MOV 34H,43H
  115. MOV 35H,#11 ;"-"
  116. MOV 36H,44H ;时显示单元44H-45H               
  117. MOV 37H,45H
  118. RET
  119. STOP:
  120. CLR TR0
  121. RET
  122. RUN:
  123. LCALL TIME ;调运行电子钟子程序
  124. OUT:
  125. SETB EA ;无键按下或完成功能跳出
  126. RET

  127. ;运行电子钟子程序                                                                       
  128. TIME:
  129. SETB EA
  130. MOV TL0,#0B0H  ;3CB0H
  131. MOV TH0,#3CH
  132. MOV R4,#20  ;50ms,20次循环
  133. SETB TR0 ;启动定时器0
  134. RET

  135. ;定时器0中断处理子程序
  136. INTT0:
  137. PUSH ACC
  138. PUSH PSW
  139. CLR ET0
  140. CLR TR0                                                                         
  141. MOV TL0,#0B0H  ;重新设置定时初值
  142. MOV TH0,#3CH
  143. SETB TR0
  144. DJNZ R4,OUTT0  ;r4-1 != 0 1秒未到,转OUTTO
  145. ADDSS:
  146. MOV R4,#14H  ;20次计数
  147. MOV R0,#41H  ;秒十位
  148. ACALL ADD1
  149. CLR C
  150. CJNE A,#60H,ADDMM ;1分到
  151. ADDMM:
  152. JC OUTT0         ;1分,60秒未到
  153. ACALL CLR0         ;1分到,清零
  154. MOV R0,#43H         ;分十位
  155. ACALL ADD1
  156. CLR C
  157. CJNE A,#60H,ADDHH ;1小时到
  158. ADDHH:
  159. JC OUTT0
  160. ACALL CLR0
  161. MOV R0,#45H          ;时十位
  162. ACALL ADD1
  163. CLR C
  164. CJNE A,#24H,HOUR ;1天到
  165. HOUR:
  166. JC OUTT0
  167. ACALL CLR0

  168. OUTT0:
  169. MOV 30H,40H ;秒显示单元40H-41H
  170. MOV 31H,41H
  171. MOV 32H,#11 ;"-"
  172. MOV 33H,42H ;分显示单元42H-43H
  173. MOV 34H,43H
  174. MOV 35H,#11 ;"-"
  175. MOV 36H,44H ;时显示单元44H-45H               
  176. MOV 37H,45H
  177. POP PSW
  178. POP ACC
  179. SETB ET0
  180. RETI

  181. ;时间清理子程序
  182. CLR0:
  183. CLR A
  184. MOV @R0,A
  185. DEC R0
  186. MOV @R0,A
  187. RET

  188. ;加一子程序
  189. ADD1:
  190. MOV A ,@R0  ;取十位
  191. DEC R0
  192. SWAP A
  193. ORL A,@R0  ;组合十位与个位          
  194. ADD A,#01H  ;加1
  195. DA A ;十进制调整
  196. MOV R3,A  ;暂存
  197. ANL A,#0FH  ;屏蔽十位
  198. MOV @R0,A  ;放入个位单元
  199. MOV A,R3  ;取值
  200. INC R0
  201. SWAP A
  202. ANL A,#0FH  ;屏蔽个位
  203. MOV @R0,A  ;放入十位单元
  204. MOV A,R3  
  205. RET

  206. DISP:
  207. MOV R1,#30H  
  208. MOV R2,#01H
  209. DISP1:
  210. MOV P2,R2
  211. MOV A,@R1
  212. MOV DPTR,#TAB
  213. MOVC A,@A+DPTR
  214. MOV P0,A
  215. CPL P0.0
  216. CPL P0.1
  217. CPL P0.2
  218. CPL P0.3
  219. CPL P0.4
  220. CPL P0.5
  221. CPL P0.6
  222. CPL P0.7
  223. ACALL DL  
  224. MOV A,R2
  225. JB ACC.7,DISP2          
  226. RL A                       
  227. INC R1
  228. MOV R2,A
  229. AJMP DISP1
  230. DISP2:RET
  231. TAB:DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,0FFH,0BFH,0CH         


  232. DL:
  233. MOV R6,#14H  
  234. DL1:
  235. MOV R7,#19H
  236. DL2:
  237. DJNZ R7,DL2
  238. DJNZ R6,DL1
  239. RET
  240. END
复制代码

全部资料51hei下载地址:
shizhong.rar (30.47 KB, 下载次数: 8)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2019-12-14 16:38 | 只看该作者
MOV P0,A
CPL P0.0
CPL P0.1
CPL P0.2
CPL P0.3
CPL P0.4
CPL P0.5
CPL P0.6
CPL P0.7
显示程序中这一段完全没必要这么写
只需要把数据表中的数据对应取反就变为了共阴极
TAB:DB 0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H,0FFH,0BFH,0CH
另外,位码放在R2中,共阴是MOV R2,#01H,换共阴就是MOV R2,#0FEH
所以,如果共阳是正常显示的话,只要改数据表和R2的值就变为了共阴
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表