单片机(二)__seg数码管

首先,我们先知道,数码管结构:

它也就是由8个led灯组成,可以根据led规则选择亮灭, 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,这是0~f的灯的表示,

然后通过断码和位码往数码管上写数字,断码作用:写数字几。位码作用:写在哪里。要知道数码管有八个上面图片所示的东西。通过断码和位码,我们就能在想要的位置写上想要的数字了。

接着我们只要人眼的视觉暂留大概2ms,我们只要在每一个小的数码管上显示数字,并且一个一个从左至右刷一遍,并且时间小于2ms,我们是不是就可以理解一些数字,直接显示在数码管上面了。


#include <reg52.h>//头文件

#define SEGPORT P0//定义P0口为数码管连接

sbit seg_select = P2^1;//定义P2^1口为断码
sbit bit_select = P2^0;//定义P2^2口为位码


unsigned char TempData[8];
unsigned char weima[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位码的8个地方事先写好
unsigned char duanma[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//断码的16个数字事先写好


void display()
{
      static unsigned char i = 0;     
      SEGPORT = 0x0;         //消重影,重影就是串位了,就是第一个位置本应该只有1,现在不但有1,2也有,原因:就是我们刷的时候毕竟是先刷数字,然后在刷位置,当我们刷数字时,数字就在前一个位置上了。解决方法就是每次刷之前,先初始化
      seg_select = 1;
      seg_select = 0;
    
      SEGPORT = 0xff;
      bit_select = 1;
      bit_select = 0;
    
      SEGPORT = duanma[i];  //刷断码
      seg_select = 1;
      seg_select = 0;
    
      SEGPORT = weima[i];    //刷位码
      bit_select = 1;
      bit_select = 0;
    
      i++;
      if(8 == i)//8个位置,重复刷
        {
              i = 0;
    }
}


这个display就是数码管刷新程序,其他程序我没写,如果对数码管还有疑问的,在下面评论里面留言,很高兴和大家探讨。

好的,以下是每行代码的注释说明: ```c #include <reg51.h> // 引入51单片机的头文件 #include "seg.h" // 引入数码管头文件 #include "delay.h" // 引入延时函数头文件 #define Duan_Port P0 // 定义数码管段码输出口 #define Wei_Port P2 // 定义数码管位选输出口 sbit wei1=P2^0; // 定义第1个数码管的位选控制引脚 sbit wei2=P2^1; // 定义第2个数码管的位选控制引脚 sbit wei3=P2^2; // 定义第3个数码管的位选控制引脚 sbit wei4=P2^3; // 定义第4个数码管的位选控制引脚 // 显示0~F的值 unsigned char code Seg_Duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0xf1}; // 数码管显示函数 void Seg_dis(unsigned int dat) { wei1 = 0; // 选通高位数码管(左边第1位) Duan_Port = Seg_Duan[dat/1000%10]; // 赋段码 Delay_xus(50); // 延时一段时间 wei1 = 1; // 取消选通 Duan_Port = 0xff; // 关闭消影 wei2 = 0; // 选通第2位数码管 Duan_Port = Seg_Duan[dat/100%10]; // 赋段码 Delay_xus(50); // 延时一段时间 wei2 = 1; // 取消选通 Duan_Port = 0xff; // 关闭消影 wei3 = 0; // 选通第3位数码管 Duan_Port = Seg_Duan[dat/10%10]; // 赋段码 Delay_xus(50); // 延时一段时间 wei3 = 1; // 取消选通 Duan_Port = 0xff; // 关闭消影 wei4 = 0; // 选通低位数码管(右边第4位) Duan_Port = Seg_Duan[dat%10]; // 赋段码 Delay_xus(50); // 延时一段时间 wei4 = 1; // 取消选通 Duan_Port = 0xff; // 关闭消影 } ``` 希望以上注释能够帮助你理解代码的实现过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值