仿真电路

  • 元件:

英文名|中文名|属性
:-|:-|:-|:-
7SEG-MPX1-CA|共阳极数码管|-
7SEG-MPX1-CC|共阴极数码管|-
BUTTON|按键|-
RES|电阻|元件值设置为10K

  • 电路图:
    电路图

  • 仿真图:
    仿真图

    按键1 数字减1(0123456789.)
    按键2 数字加1
    按键3 切换字形码

程序设计

  • main.c:
    #include <AT89X51.H>
    #define uchar unsigned char
    #define uint unsigned int
    uchar ca[11] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99,
                  0x92, 0x82, 0xf8, 0x80, 0x90,
                  0x7f}; //CA(共阳极)数码管字形码
    uchar cc[11] = {0x3f, 0x06, 0x5b, 0x4f, 0x66,
                  0x6d, 0x7d, 0x07, 0x7f, 0x6f,
                  0x80}; //CC(共阴极)数码管字形码
    //延时函数 t为毫秒(不准)
    void delay(uint t)
    {
    uint i;
    while (t--)
    {
      for (i = 120; i; i--)
        ;
    }
    }
    //主程入口
    void main()
    {
    uchar *p = ca; //指针,用于切换字形码
    char n = 0;    //当前显示的数字
    P1 = 0xff;     //P1所有脚输出高电平
    for (;;)
    //死循环,和while(1)等价
    {
      if ((P1 & 0x07) != 0x07)
      //判断P2的1,2脚是不是高电平
      {
        delay(10); //延时消除抖动
        if (!(P1 & 0x01))
        //P1.0相连的按键被按下
        {
          if (--n < 0)
          {
            n = 10;
          }
        }
        if (!(P1 & 0x02))
        //P1.1相连的按键被按下
        {
          if (++n > 10)
          {
            n = 0;
          }
        }
        if (!(P1 & 0x04))
        //P1.2相连的按键被按下
        {
          if (*p == 0xc0)
          //指针p指向ca
          {
            p = cc;
          }
          else
          {
            p = ca;
          }
        }
      }
      P2 = *(p + n); //控制P1输出
      delay(200);     //粗略延时
    }
    }

注解

数码管

  • 数码管

    数码管由8个LED组成,8个LED有一脚连在一起,称为公共极
    如果公共极是正极,称作共阳极(CA)数码管,反之称作共阴极(CC)数码管。
    数码管的引脚从左到右对应LED的顺序如图所示

字形码表

字形码表:

字符 共阳极 共阴极
0 0xC0 0x3F
1 0xF9 0x06
2 0xA4 0x5B
3 0xB0 0x4F
4 0x99 0x66
5 0x92 0x6D
6 0x82 0x7D
7 0xF8 0x07
8 0x80 0x7F
9 0x90 0x6F
A 0x88 0x77
B 0x83 0x7C
C 0xC6 0x39
D 0xA1 0x5E
E 0x86 0x79
F 0x8E 0x71
H 0x89 0x76
L 0xC7 0x38
P 0x8C 0x73
R 0xCE 0x31
U 0xC1 0x3E
Y 0x91 0x6E
- 0xBF 0x40
. 0x7F 0x80
0xFF 0x00

  • 指针的使用

    p = ca; 等价于p = *ca[0],指向数组的第一个元素
    指针p指向cacc两个数组
    使用*(p+n)访问数组中的元素,n称为偏移
    使用指针的时候小心超过数组的上下限

最后修改:2020 年 04 月 06 日
Null