仿真电路

  • 元件:
英文名 中文名 属性
7SEG-COM-AN-GRN 7段共阳极数码管(绿色) -
74HC273 8位锁存器 -
RX8 8位电阻排 元件值设置为100
BUTTON 按键 -
RES 电阻 元件值设置为10K
  • 电路图:
    电路图

  • 仿真图:
    仿真图

    按键1 数码管1 加1
    按键2 数码管2 加1
    按键3 重置锁存器

程序设计

  • main.c:
    #include <AT89X51.H>
    #define uchar unsigned char
    #define uint unsigned int
    //字形码(0-9)
    uchar ca[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
                0x92, 0x82, 0xf8, 0x80, 0x90};
    //延时函数 t为毫秒(不准)
    void delay(uint t)
    {
    uint i;
    while (t--)
    {
    for (i = 1200; i; i--)
      ;
    }
    }
    //刷新两个数码管
    void display(uchar m, uchar n)
    {
    P2_0 = 0;
    P3 = ca[m];
    P2_0 = 1;//更新锁存器1
    P2_1 = 0;
    P3 = ca[n];
    P2_1 = 1;//更新锁存器2
    }
    //主程入口
    void main()
    {
    uchar m = 0; //数码管1显示的数字
    uchar n = 0; //数码管2显示的数字
    P1 = 0xff;   //P1所有脚输出高电平
    display();   //更新显示
    for (;;)
    //死循环,和while(1)等价
    {
    if ((P1 & 0x07) != 0x07)
    //判断P1的1,2,3脚是不是高电平
    {
      delay(10); //延时消除抖动
      if (!(P1 & 0x01))
      //按键1
      {
        if (++m > 9)
        {
          m = 0;
        }
        display(m, n);
      }
      if (!(P1 & 0x02))
      //按键2
      {
        if (++n > 9)
        {
          n = 0;
        }
        display(m, n);
      }
      if (!(P1 & 0x04))
      //按键3,清除锁存器
      {
        P2_2 = 0;
        delay(10);
        P2_2 = 1;
      }
    }
    delay(10); //粗略延时
    }
    }

注解

锁存器

  • 锁存器
    • 锁存器顾名思义,可以把输出信号锁住。一般用于引脚复用,扩充引脚数量。
    • 引脚类型: 清除引脚MR,时钟引脚CLK,数据输入引脚D,数据输出引脚Q
      清除引脚MR: 低电平时将锁存器锁住的信号清除,输出Q置为低电平
      时钟引脚CLK: 收到上升沿信号时解锁,输入D的信号可以传到输出Q,其余时候输出Q会被锁住,保持当前状态
    • 上升沿与下降沿

74HC273真值表

清除引脚MR 时钟引脚CLK 数据输入引脚D 数据输出引脚Q
L * * L
H 上升沿 H H
H 上升沿 L L
H 非上升沿 * Q

L:低电平,H:高电平

最后修改:2020 年 04 月 06 日
如果觉得我的文章对你有用,请随意赞赏