我与单片机的日子——(三)

数码管显示原理

      又折腾了一个上午,经过昨晚 加上今天上午的奋斗,我终于弄懂了这个编辑文档的HTML方式,不得不吐槽一下,然后一个博客改了几次,辛苦那边的工作人员了。好,废话少说了,来整理一下今天的成果——数码管显示原理。
学一个东西最好按照需求来学,就比如今天的数码管显示原理,本意是要使用单片机上的数码管资源显示数字,为了能做到这一点,所投入的时间就会给我们带来收获。
      要说明这个好像很复杂,那就从我要做的步骤开始。
      1.数码管如何显示:
      关于数码管的外形,看到单片机就知道,那就不上图了。首先整理一下所需要的基础知识。数码管其实就是8个LED灯,如果按照一位数码管来说的话。当然一组数码管含有许多位数码管,每位数码管含有7跟线条和一个小数点,跟控制LED灯一样控制就可以。数码管是封装好的电子器件,有共阴极和共阳极的区别,其区别就是点亮所需要的电平的高低不同。我所使用的单片机数码管是共阴极的,也就是说给高电平就可以点亮。一般不同的位置有不同的字母标注,可以控制哪个亮。
      当然,数码管也由74HC573锁存器控制电平,8个输出端依次连接,锁存器输入端有不同的寄存器控制,这个不同是相对于前面控制LED灯而言的。
      2.位选与段选:
      现在正是开始点亮数码管了,好开心。前面说一组数码管含有许多位,如果是静态显示的话就要涉及到位选了,位选就是在一组数码管里面选出一个。这里有个问题,数码管一次其实只能显示一位,但是经常看到有好几位数码管显示了,这个数动态的不停扫描,利用视觉的残留形成的。好,开始位选了。不同的硬件,也就是不同的单片机位选系统是不一样的,有的是把位选的接口接到控制数码管的寄存器上,我学的书上就是这样,但是不凑巧,我的单片机是另外一种方式。将每个数码管接到138译码器上,通过控制LED的三个输出端有二进制控制数码管。关于138译码器的真值表在后面,当然我没有学数字电路,不知道逻辑运算的规则,但是可以理解成三个输入端口的二进制数的大小从右往左的控制。关于数码管的具体控制系统可以查看单片机电路原理图,后面也有我的单片机电路原理图。
位选之后就是段选,这个好理解,就是选择不同的根数进行点亮。
      3.编写程序:
现在就是程序的落地了,从程序最容易了解这个知识。
      1.1 静态显示

#include<reg51.h>
sbit s1  = P2^2;
sbit s2  = P2^3;
sbit s3  = P2^4;
void main()
{
    s1 = 0;
    s2 = 0;
    s3 = 0;
    P0 = 0xff;
}

      分析一下这个代码。首先是把P2的三个特殊端口拿出来赋值,这三个就是位选的控制端。数对(0.0.0)可以组成二进制数000,当然可以组成其他的数字控制不一样的数码管。后面的P0好理解,这个时候位选已经好了,那么就可以给控制端输入信号开始段选了,0xff就是全部点亮。
      1.2 动态扫描

#include<reg51.h>
sbit s1 = P2^2;
sbit s2 = P2^3;
sbit s3 = P2^4;
unsigned int code _code[] = {0xff};
void delay(unsigned int t);
void main()
{
    while(1)
    {
        P0 = _code[0];

        s1 = 0;
        s2 = 0;
        s3 = 0;
        delay(100);

        s1 = 0;
        s2 = 0;
        s3 = 1;
        delay(100);

        s1 = 0;
        s2 = 1;
        s3 = 0;
        delay(100);

        s1 = 0;
        s2 = 1;
        s3 = 1;
        delay(100);

        s1 = 1;
        s2 = 0;
        s3 = 0;
        delay(100);

        s1 = 1;
        s2 = 0;
        s3 = 1;
        delay(100);

        s1 = 1;
        s2 = 1;
        s3 = 0;
        delay(100);

        s1 = 1;
        s2 = 1;
        s3 = 1;
        delay(100);
    }
}
void delay(unsigned int t)
{
    unsigned int i;
    for(t;t > 0;t--)
        for(i = 100;i > 0;i--)
            ;
}

      这个是个傻逼程序,我直接枚举了所有的情况,但是具体意思到看。就是没有可能的组合都组合出来,不停地更换所操作的数码管。加了个延时可以更好的观察切换的过程。
坑爹的大一成绩
138译码器真值表
138译码器
数码管原理图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值