logo头像

猪老大要进步!

单片机--点亮数码管

本文于 1108 天之前发表,文中内容可能已经过时。

经过几个晚上的初步学习,我渐渐结合起来一年前学习的微机原理的一些知识。虽然不一定能搞懂,但是现在确实是通过看原理图、看引脚,逐渐掌握了一点东西。本篇记录在点亮单片机数码管中遇到的问题。

1、动态数码管

  • 原理:动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

  • 位选就是数码管位置(亮灭)的选择;段选就是数码管笔段(亮灭)的选择。

  • 共阳和共阴:

    简单来讲,共阴数码管就是把com端接地,其他要点亮的某段就接高电平;共阳数码管,就把com接高电平,其他需要点亮的某段就接地。

  • LED代码表

    这个表很有用,编程的时候需要对照着它来摘取段选码。需要注意的是,段选码是十六进制的,因此编程时需要写成0x3F类似的格式。

  • 引脚图:

    当我们需要从头开始开发的时候,我们需要一个引脚图,如下所示。

    段选信号:单片机的P00-P07这8个IO口控制的是数码管的段选信号,因此所有数码管的段选都是一样的。

    位选信号:上面COM口连接的是非常重要的位选信号,为了节约IO口,单片机会通过38译码器来转换,通过查阅74HC138译码器得知对应的IO口为P22/P23/P24。

2、程序实现

1
2
3
typedef unsigned char u8;
u8 code smgduan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴

code的作用:code的作用是告诉单片机,定义的数据要放在ROM(程序存储区)里面,写入后就不能再更改。因为C语言中没办法详细描述存入的是ROM还是RAM(寄存器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有data是存入RAM的意思。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void digdisplay()//全部点亮,一次
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)//位选操作
{
case 0: LSA=0;LSB=0;LSC=0;break;
case 1: LSA=1;LSB=0;LSC=0;break;
case 2: LSA=0;LSB=1;LSC=0;break;
case 3: LSA=1;LSB=1;LSC=0;break;
case 4: LSA=0;LSB=0;LSC=1;break;
case 5: LSA=1;LSB=0;LSC=1;break;
case 6: LSA=0;LSB=1;LSC=1;break;
case 7: LSA=1;LSB=1;LSC=1;break;
}
P0=smgduan[i];//段选操作
delay(100);//太小会来不及清零,混合或相同;太大会不连续;
P0=0x00;//归零,消影
}
}

要注意delay的大小,如果delay太大会造成类似于流水灯的效果。

P0=0x00这句经过实测没有影响。

参考资料:

1、数码管的段选和位选是什么意思? https://www.uyuyao.com/zuoye/5576154

2、数码管共阳和共阴是什么意思?https://www.zhihu.com/question/39882534

3、C语言中的“code”是什么意思啊?https://zhidao.baidu.com/question/106734427.html

支付宝打赏 微信打赏

赞赏是不耍流氓的鼓励