4.1  数码管的原理分析

数码管的原理图也是需要数码管的内部原理图的,下面我们先看一下数码管的内部原理图,就以本次的0.36“-3-A的解答,首先看到这个型号第一个0.36代表大小,就是数码管的尺寸。然后3是指有三位,再然后有一个A,这里的A是指共阳极。因为每家的数码管都是不一样的数据不一样的,所以在开发设计时,一定要看一下是哪家的数码管,然后仔细阅读他的数据手册。

上面是我们本次使用的数码管的尺寸图,这个是在供应商的数据手册中截取的,如需要下载的话,可以在右边下面。

这里是有一个原理图的,可以看出来每个笔端都有一个灯珠,共阳极脚位分别对应在8,9,12三个脚位上。三个数码管的A-G以及DP(就是右下角的点)是连接在一起的,然后我们再看最上面我们自己的原理图,可以看出来是通过程序来控制我们点亮的到底是哪个地方的灯珠,我们继续看下面的程序

4.2  数码管点亮一个笔段

/**********************************
包含头文件
**********************************/
#include "main.h"
#include "smgduan.h"
/**********************************
函数名: usleep
传递参数: ms
返回参数: 无
函数作用: 延时1ms函数
**********************************/
void usleep(unsigned int ms)
{
  unsigned int m,n;
	for(m=ms;m>0;m--)
	for(n=110;n>0;n--);
}
/**********************************
函数名: main
传递参数:无
返回参数:无
函数作用:主函数
**********************************/
void main(void)
{
  while(1) 
  {
    LSA=0;
    LED=0;
  }
}

通过控制共阳极和笔端的高低电平可以控制我们数码管的笔端。

4.3  单个数码管点亮

smgduan.c

/**********************************
包含头文件
**********************************/
#include "smgduan.h"

/**********************************
变量定义
**********************************/
uchar code smgduan[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//显示0~F的值

/******************************************
* 函 数 名   : DigDisplay
* 传递参数   :  wei 位选  dis_num 显示的字符
* 函数功能	 : 循环扫描3个数码管显示
*******************************************/
void DigDisplay(uchar wei ,uchar dis_num)
{
  switch(wei)	 //位选,选择点亮的数码管,
  {
    case(0):
      LSA=0;LSB=1;LSC=1; break;//显示第0位
    case(1):
      LSA=1;LSB=0;LSC=1; break;//显示第1位
    case(2):
      LSA=1;LSB=1;LSC=0; break;//显示第2位

  }
  P0=~smgduan[dis_num];//发送段码
  usleep(2); //间隔一段时间扫描	
  P0=0xff;//消隐
}


smgduan.h

#ifndef _SMGDUAN_H_
#define _SMGDUAN_H_
/**********************************
包含头文件
**********************************/
#include "main.h"
/**********************************
PIN口定义
**********************************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/**********************************
函数声明
**********************************/
void DigDisplay(uchar wei ,uchar dis_num);
#endif

通过控制void DigDisplay(uchar wei ,uchar dis_num); 函数的位选和显示的字符可以让单个数码管显示我们需要的字符。比如

void main(void)
{
  while(1) 
  {
     DigDisplay(0,1);
  }
}

在第一个位置显示数字1

4.4  多位数码管扫描点亮

smgduan.c

/**********************************
包含头文件
**********************************/
#include "smgduan.h"

/**********************************
变量定义
**********************************/
uchar code smgduan[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//显示0~F的值

/******************************************
* 函 数 名   : DigDisplay
* 传递参数   :  wei 位选  dis_num 显示的字符
* 函数功能	 : 循环扫描3个数码管显示
*******************************************/
void DigDisplay(uchar wei ,uchar dis_num)
{
  switch(wei)	 //位选,选择点亮的数码管,
  {
    case(0):
      LSA=0;LSB=1;LSC=1; break;//显示第0位
    case(1):
      LSA=1;LSB=0;LSC=1; break;//显示第1位
    case(2):
      LSA=1;LSB=1;LSC=0; break;//显示第2位
  }
  P0=~smgduan[dis_num];//发送段码
  usleep(2); //间隔一段时间扫描	
  P0=0xff;//消隐
}

/******************************************
* 函 数 名   : DigDisplay
* 传递参数   : dis_num 显示的字符
* 函数功能	 : 封装一下显示
*******************************************/
void ThereDisplay(uint dis_num)
{
  if(dis_num<10)
  {
    DigDisplay(2,dis_num);
  }
  else if(dis_num<100)
  {
    DigDisplay(1,dis_num/10);
    DigDisplay(2,dis_num%10);
  }
  else if(dis_num<1000)
  {
    DigDisplay(0,dis_num/100%10);
    DigDisplay(1,dis_num/10%10);
    DigDisplay(2,dis_num/1%10);
  }
}

smgduan.h

#ifndef _SMGDUAN_H_
#define _SMGDUAN_H_
/**********************************
包含头文件
**********************************/
#include "main.h"
/**********************************
PIN口定义
**********************************/
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
/**********************************
函数声明
**********************************/
void DigDisplay(uchar wei ,uchar dis_num);
void ThereDisplay(uint dis_num);
#endif

本次主要是封装了显示的函数这样在后续使用中会有很好的效果。

发表回复

后才能评论