首先,我们先知道,数码管结构:
它也就是由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就是数码管刷新程序,其他程序我没写,如果对数码管还有疑问的,在下面评论里面留言,很高兴和大家探讨。