仿真电路

  • 元件:
英文名 中文名 属性
7SEG-MPX4-CA 共阳极4位数码管 -
RX8 8位电阻排 元件值设置为1k
BUTTON 按键 -
RES 电阻 元件值设置为10K
  • 电路图:
    电路图

  • 仿真图:
    仿真图

    四个按键对应数码管4位数字

程序设计

  • main.c:

    #include <AT89X51.H>
    #define uchar unsigned char
    #define uint unsigned int
    //字形码
    uchar cc[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,
                0x6d, 0x7d, 0x07, 0x7f, 0x6f};
    //数码管显示缓存
    uchar disp[4] = {0, 0, 0, 0};
    //延时函数 t为毫秒(不准)
    void delay(uint t)
    {
    uint i;
    while (t--)
    {
    for (i = 125; i; i--)
      ;
    }
    }
    //刷新数码管显示
    void flash_display()
    {
    uchar seg; //当前操作的位数
    for (seg = 0; seg < 4; seg++)
    {
    P3 = ~(1 << seg);   //只点亮某一个数码管
    P2 = cc[disp[seg]]; //显示disp中的数字
    delay(10);          //等待数码管响应
    P3 = 0xff;
    //delay(1); //熄灭数码管,防止残留显示
    }
    }
    //主程入口
    void main()
    {
    uchar flag = 0; //标记按键是否按下,1按下,0松开
    P1 = 0xff;      //P1所有脚输出高电平
    for (;;)
    //死循环,和while(1)等价
    {
    if ((P1 & 0x0f) != 0x0f)
    //判断有无按键按下
    {
      delay(10); //延时消除抖动
      if ((P1 & 0x0f) != 0x0f)
      {
        if (!flag)
        {//第一次按下
          flag = 1;
    
          if (!(P1 & 0x01))
          //P1.0相连的按键被按下
          {
            if (++disp[0] > 9)
            {
              disp[0] = 0;
            }
          }
          if (!(P1 & 0x02))
          //P1.1相连的按键被按下
          {
            if (++disp[1] > 9)
            {
              disp[1] = 0;
            }
          }
          if (!(P1 & 0x04))
          //P1.2相连的按键被按下
          {
            if (++disp[2] > 9)
            {
              disp[2] = 0;
            }
          }
          if (!(P1 & 0x08))
          //P1.3相连的按键被按下
          {
            if (++disp[3] > 9)
            {
              disp[3] = 0;
            }
          }
        }
      }
      else
      {//按键松开,将flag置0
        flag = 0;
      }
    }
    else
    {//按键松开,将flag置0
      flag = 0;
    }
    flash_display();//刷新数码管
    }
    }

注解

动态显示

  • 动态显示
    • 把多个数码管的普通脚合并,公共脚保持独立,就组成了多位数码管
    • 因为引脚共用,所以没有办法单独控制某一只数码管
    • 利用公共脚可以让数码管在某一时间段内只点亮一个,控制好切换的速度即可达到“同时显示”的效果
    • 上图是把flash_display();中的延时改成100的效果
最后修改:2020 年 04 月 06 日
如果觉得我的文章对你有用,请随意赞赏