PLC
直播中

孔妞妞

12年用户 481经验值
私信 关注

怎样去设计一种数码管显示0-9999的计数器

怎样去设计一种数码管显示0-9999的计数器?其代码程序是怎样的?

回帖(1)

陈畅妮

2021-10-8 16:09:05
  前几天,回答了一个问题:数码管显示0-9999计数器,两个按键,一个按键复位,一个按键累加计数。
  呵呵,刚刚提交了程序,就被提问者选为最佳答案!
  其实,提交的当时,只是准备看看回答的效果,因为百度知道有时犯混,提交的回答显示不出来。
  结果,电路也没有来得及附上;另外在程序中,还忽略了消除无效0的功能。
  下面把消除无效0的功能进行简单的介绍,并给出完整的程序。
  四位显示器,是可以显示0000~9999的,但是在设计工程实际的产品时,前三个0,是不应该显示的。
  一个成熟的程序,都应该有消除无效0的程序段。
  消除无效0,其实就是用“空白”的代码来代替“0”。
  在程序中,大家都知道有个七段码表,一般是把0123.。.的七段码依次排列在里面,那么第0~15个,通常就是0~F的七段码。
  如果把“空白”七段码FFH,排在第16个位置,那么“空白”的代码就是16。
  消除无效0的程序,应该从高位到低位(千位、百位、十位)依次判断,个位的0,是应该显示的,则不用判断。
  某一位是0,就替换为16,如果不是0,不仅不用替换,还要停止判断后面其它的位。
  比如:
  千位是0:替换成16;
  百位不是0:不用改,正常显示百位;
  十位:无论是不是0,都应该正常显示,不用判断了。
  做而论道看过不少大学的教材和参考书,都没有看到消除无效0的程序(也许,还是没有看全)。
  呵呵,这大概就是“教学”和“工程”的区别吧。
  ;===========================================
  下面做而论道把自己编写的“消除无效0的程序”公布出来,希望能够抛砖引玉。
  消除无效0,话是说了很多,可是做而论道编写的程序,都是很简练的,看了不要失望。
  程序如下:
  ;
  ORG 0000H
  LJMP MAIN
  ORG 0030H
  MAIN:
  MOV 70H, #0 ;显示缓冲区。
  MOV 71H, #0
  MOV 72H, #0
  MOV 73H, #0
  MOV 74H, #00H ;计数单元。
  MOV 75H, #80H ;都是 BCD 码。
  ;-------------------------------
  M_LOOP:
  LCALL DISP
  JNB P3.2, JIA_YI
  JNB P3.3, QING_L
  AJMP M_LOOP
  ;-------------------------------
  JIA_YI:
  LCALL DISP
  JB P3.2, M_LOOP
  MOV A, 75H
  ADD A, #1
  DA A
  MOV 75H, A
  MOV A, 74H
  ADDC A, #0
  DA A
  MOV 74H, A
  J_L:
  LCALL DISP
  JNB P3.2, J_L
  AJMP M_LOOP
  ;-------------------------------
  QING_L:
  LCALL DISP
  JB P3.3, M_LOOP
  MOV 74H, #0
  MOV 75H, #0
  AJMP M_LOOP
  ;-------------------------------
  DISP:
  MOV R0, #70H
  MOV A, 74H
  SWAP A
  ANL A, #0FH
  MOV @R0, A
  INC R0
  MOV A, 74H
  ANL A, #0FH
  MOV @R0, A
  INC R0
  MOV A, 75H
  SWAP A
  ANL A, #0FH
  MOV @R0, A
  INC R0
  MOV A, 75H
  ANL A, #0FH
  MOV @R0, A
  ;---------------------------下面是消除无效的0
  MOV R0, #70H
  LL:
  CJNE @R0, #0, QQ
  MOV @R0, #16
  PP:
  INC R0
  CJNE R0, #73H, LL
  QQ:
  ;---------------------------下面是显示部分
  MOV DPTR, #D_TAB
  MOV R2, #254
  MOV R0, #70H
  D_LOOP:
  MOV A, @R0
  MOVC A, @A+DPTR
  MOV P2, #255 ;消隐。
  MOV P0, A ;输出段码。
  MOV P2, R2 ;输出位码。
  LCALL DL_1MS
  MOV A, R2
  RL A
  MOV R2, A
  INC R0
  CJNE R0, #74H, D_LOOP
  RET
  D_TAB:
  DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H
  DB 80H, 90H, 88H, 83H, 86H, 0A1H, 86H, 8EH, 0FFH ;FF是空白的代码
  ;-------------------------------
  DL_1MS:
  DJNZ R7, $
  DJNZ R7, $
  RET
  ;-------------------------------
  END
  仿真电路图可以看前面给出的链接。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分