3、数码管原理及驱动

一、发光二极管与数码管基础

1、发光二极管

圆头塑封发光二极管的正负极判断

  1. 长脚为正极,短脚为负极
  2. 电极小的为正极,电极大的为负极
  3. 圆弧形边缘的为正极,直线型边缘的为负极
  4. 以上方法都无法判断,则可以借助万用表进行测量
    在这里插入图片描述
    普通二极管的正向导通电压普遍在1.2V或以上,而一般的指示用发光二极管工作电流在2至20mA内。

2、数码管

数码管的“位”指的是有多少个数码管。
数码管的“段”指的是一个数码管有多少个发光二极管。
位码是决定那一个数码管能够被点亮,而段码是决定被选中的数码管点亮一个什么样的数字。

  1. 数码管的内部结构

共阴与共阴数码管来减少引脚的引出其中A表示共阳的公共端,而K来表示共阴的公共端
在这里插入图片描述
共阳和共阴的排列顺序是相同的,其排列如图所示:
在这里插入图片描述
共阳数码管清0来显示数码,共阴数码管置1来显示数码;
配置段亮灭状态的值叫做段码,使能多位公共端的值称为位码。

  1. 共阳数码管的段码和位码的设定
    在这里插入图片描述
    共阳数码管段码0-F的表示形式如下:
u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  1. 共阴数码管的段码和位码的设定
    在这里插入图片描述
    共阴数码管段码0-F的表示形式如下:
u8 Buff[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

二、数码管显示操作

1、共阳数码管显示

u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

void Digital_Led_Play(void)
{
  u8 num;
  PC_DDR=0xFF;//配置PC端口为输出模式
  PC_CR1=0xFF;//配置PC端口为推挽输出模式
  PC_CR2=0x00;//配置PC端口低速率输出
  while(1)
  {
    for(num=0;num<=9;num++)
    {
      LED=Buff[num];
      delay(300);//延时便于观察LED情况
    }
  }
}

2、共阴数码管显示

u8 Buff[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void Digital_Led_Play(void)
{
  u8 num;
  PC_DDR=0xFF;//配置PC端口为输出模式
  PC_CR1=0xFF;//配置PC端口为推挽输出模式
  PC_CR2=0x00;//配置PC端口低速率输出
  while(1)
  {
    for(num=0;num<=9;num++)
    {
      LED=Buff[num];
      delay(300);//延时便于观察LED情况
    }
  }
}

3、串行数码管

原理与如下:
在这里插入图片描述
代码如下:

#define DIO     PG_ODR_ODR7//串行数据输入
#define RCLK    PG_ODR_ODR6//锁存控制信号(上升沿有效)
#define SCLK    PG_ODR_ODR5//时钟脉冲信号(上升沿有效)

//共阳数码管段码“0123456789AbCdEF熄灭-”
u8 Buff[16] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//位码数组
u8 wei_table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void Digital_Led_Play(void)
{
  PG_DDR=0xFF;//配置PG端口为输出模式
  PG_CR1=0xFF;//配置PG端口为推挽输出模式
  PG_CR2=0x00;//配置PG端口低速率输出
  PG_ODR=0x00;//初始化PG端口全部输出低电平
  while(1)
  {
    LED8_Display(3,10);//显示数码"5"
    LED8_Display(7,6);//显示数码"6"
  }
}

void LED8_Display(u8 x,u8 y)
{
  LED_OUT(LED_table[y]);//送出段码
  LED_OUT(wei_table[x]);//送出位码		
  RCLK=0;
  RCLK=1;//RCLK产生上升沿
  delay(1);
}

void LED_OUT(u8 outdata)
{
  u8 i;
  for(i=0;i<8;i++)//循环8次
  {
    if (outdata & 0x80)//逐一取出最高位
      DIO=1;//送出“1”
    else 
      DIO=0;//送出“0”
    outdata<<=1;//执行左移一位操作
    SCLK=0;
    SCLK=1;//SCLK产生上升沿
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_44751294/article/details/106668810