数码管显示 0-9999计数器

前几天,回答了一个问题:数码管显示0-9999计数器,两个按键,一个按键复位,一个按键累加计数。
可见:http://hi.baidu.com/do_sermon/item/620ab2cadf946422e90f2e91

呵呵,刚刚提交了程序,就被提问者选为最佳答案!
其实,提交的当时,只是准备看看回答的效果,因为百度知道有时犯混,提交的回答显示不出来。
结果,电路也没有来得及附上;另外在程序中,还忽略了消除无效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 

仿真电路图可以看前面给出的链接。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
<h3>回答1:</h3><br/>使用以下代码可以实现 Arduino 按键控制数字显示 0-9: ```c++ int num = 0; // 定义计数变量 num void setup() { pinMode(2, INPUT_PULLUP); // 设置数字 2 引脚为上拉输入模式 pinMode(3, OUTPUT); // 设置数字 3 引脚为输出模式 } void loop(){ if(digitalRead(2) == LOW){ // 当数字 2 引脚检测到按键按下 num++; // 计数器 num 自增 1 if(num > 9){ // 如果计数器 num 超过 9 num = 0; // 重新从 0 开始计数 } } digitalWrite(3, num == 0b00000001 || num == 0b00111001 || num == 0b00001100 || num == 0b00011110 || num == 0b00110010 || num == 0b01010000 || num == 0b01000000 || num == 0b00011100 || num == 0b00000000); // 根据计数器 num 值控制数字管显示数码 0-9 delay(100); // 等待 100 毫秒 } ``` <h3>回答2:</h3><br/>首先,需要准备一块Arduino主板、一个CD4511数码管驱动芯片、一个共阳数码管、数根跳线和2个电阻。 将共阳数码管连接到CD4511芯片的输出引脚(1-7)上,通过跳线把芯片的输入引脚(A、B、C、D)与Arduino主板上的数字引脚连接。同时,还需要把芯片的Latch(锁存)引脚和E(使能)引脚接到主板上的数字引脚。 在Arduino主板上编写程序,其中包含了按键控制CD4511芯片的输入,指定数码管显示的数字。在按下按键时,发送特定的数字到CD4511芯片的输入端,即可控制数码管显示相应数字。 具体步骤: 1.连接数码管和驱动芯片。在Arduino主板上接好CD4511芯片和数码管,将数码管的各引脚连接到芯片的输出引脚1-7上,连好焊点,根据芯片功能图正确连接锁存引脚和E引脚。 2.连接开关。将两个电阻以及按键连接到Arduino主板上的数字引脚,同时跳线把开关连接到数字引脚上。 3.编写程序。在Arduino IDE编写程序,程序包括读取按键的数据,根据按键的信息发送数据到CD4511芯片的输入端。程序还可以设计延时,使显示数字更生动。 以下是参考程序: ``` int button = 7; //设置数字引脚 int digit = 0; //显示数字的变量,初始化为0 const int LatchPin = 8; //锁存引脚 const int Enable = 9; //使能引脚 void SendNumber(int number) { digitalWrite(LatchPin, LOW); shiftOut(1, 2, MSBFIRST, number); digitalWrite(LatchPin, HIGH); } void setup() { pinMode(button, INPUT); pinMode(LatchPin, OUTPUT); pinMode(Enable, OUTPUT); SendNumber(digit); //显示数字0 } void loop() { if(digitalRead(button) == LOW){ //检测开关是否按下 digit++; //数字加1 if(digit == 10){ //如果数字达到10就循环回0 digit = 0; } SendNumber(digit); //显示数字 delay(500); //延时,避免按键反弹 } } ``` 在程序中,首先定义了按键的数字引脚为7,设置了显示数字的初始值为0。然后设置了锁存引脚和使能引脚,使用SendNumber函数把需要显示的数字发送到CD4511芯片的输入端。 在setup函数中,在数字引脚上设置输入和输出模式,并且让按键保持在OFF状态下,并把数字0发送给芯片,以便开始时显示0。 在loop函数中,使用digitalRead函数检测开关是否按下,如果按下,数字加1。如果数字达到10就循环回0。delay函数是为了防止按键反弹。 这样就完成了按键控制数码管显示0-9的设计。注意在连接电路时,要仔细检查引脚连接是否正确,以免烧毁元件。 <h3>回答3:</h3><br/>Arduino是一种基于开源硬件平台的微控制器,可以实现许多简单的电子和物理原型的开发,包括控制LED灯、数码管、舵机等等。本文主要介绍如何利用Arduino控制按键和数码管,实现数字的显示。 步骤如下: 1. 准备材料 Arduino开发板、830点面包板、1个4位数码管、4个220欧姆电阻、4个开关按键、20根杜邦线、一个面包板电源模块。 2. 搭建电路 将4个按钮分别连接到数字引脚2、3、4和5上,并使每个按钮连接到地线。将4个电阻连接到数码管的4个引脚上,并将其连接到电源正极。 3. 编写程序 在Arduino IDE中编写程序。程序需要完成以下任务:1)等待用户按下按键;2)确定是哪个按键被按下;3)根据按键确定显示的数字;4)循环1到3步骤,保持运行。 int numPin[4]={2,3,4,5}; int keyPin[4]={6,7,8,9}; int num[10][4]={ {LOW,LOW,LOW,LOW}, // 0 {HIGH,LOW,LOW,LOW}, // 1 {LOW,HIGH,LOW,LOW}, // 2 {HIGH,HIGH,LOW,LOW}, // 3 {LOW,LOW,HIGH,LOW}, // 4 {HIGH,LOW,HIGH,LOW}, // 5 {LOW,HIGH,HIGH,LOW}, // 6 {HIGH,HIGH,HIGH,LOW}, // 7 {LOW,LOW,LOW,HIGH}, // 8 {HIGH,LOW,LOW,HIGH} // 9 }; void setup() { for(int i=0;i<4;i++){ pinMode(numPin[i],OUTPUT); pinMode(keyPin[i],INPUT); } } void loop() { for(int i=0;i<4;i++){ int value=digitalRead(keyPin[i]); if(value==HIGH){ for(int n=0;n<10;n++){ digitalWrite(numPin[0],num[n][0]); digitalWrite(numPin[1],num[n][1]); digitalWrite(numPin[2],num[n][2]); digitalWrite(numPin[3],num[n][3]); delay(1000); } } } 4. 运行程序 将编写好的程序上传到Arduino开发板中,按下按钮,就可以在数码管上显示数字0到9。 通过以上步骤,您可以轻松地使用Arduino开发板控制按键和数码管,实现数字的显示。此外,您还可以自由地对程序进行修改,以满足更复杂的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做而论道_CS

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值