0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32数字电压电流表软件教程(三):数码管显示数字

jf_qE49KoVBr8 来源:CW32生态社区 2024-05-14 14:20 次阅读

4.1.数码管显示原理

数码管的显示原理是由多个发光的二极管共阴极或者共阳极组成的成“8”字形的显示器件。数码管通过不同的组合可用来显示数字0~9、字符A ~ F及小数点“.”。数码管的工作原理是通过控制外部的I/O端口进行驱动数码管的各个段码,使用不同的段码从而形成字符显示出我们要的数字。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母A、B、C、D、E、F、G、DP来表示。

当数码管特定的引脚加上高电平后,这些特定的发光二极管就会发亮,以形成我们眼睛看到的字样了。如:在一个共阴极数码管上显示一个“8”字,那么就对A、B、C、D、E、F、G对应的引脚置高电平。发光二极管的阳极共同连接至电源的正极称为共阳极数码管,这种类型的数码管点亮需要对引脚置低电平;发光二极管的阴极共同连接到电源的负极称为共阴极数码管,点亮共阴极数码管需要对相应的引脚置高电平。常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。

52982f4a-11a8-11ef-a297-92fbcf53809c.png

图4-1 数码管模型图

共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻

共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。

4.2.数码管原理图与实物图

如果数码管可以显示多位数字,如我们的电压电流表所示。那么除了控制段码来选择要显示的内容,还要选择位码来控制某一个数码管的亮灭。

52b6c46e-11a8-11ef-a297-92fbcf53809c.png

图4-2 电压电流表三位数码管

数码管的原理图如下,可以看出除了上述的段码引脚之外,还有COM1、COM2、COM3的位码引脚,三个位码引脚分别控制三个数码管的亮灭情况,且低电平有效。

52dcbf0c-11a8-11ef-a297-92fbcf53809c.png

图4-3 三位数码管原理图

4.3.数码管驱动显示

驱动显示数码管的思路是:先将A、B、C、D、E、F、G所代表的引脚从低到高编号,列出数码要显示数字的段码值。比如要显示数字5,则段码值为0x6d,二进制表示为01101101,这说明G置1,F置1,E置0,D置1,C置1,B置0,A置1,最高位则是DP的值。将要显示的数字以段码值的方式储存在数组里以供调用,可以简化程序。

接着以循环的方式结合switch语句对A、B、C、D、E、F、G的亮灭情况进行单独计算,先将段码值确定后再进行位码的选择,可以避免因单片机执行程序的时间而造成显示效果的不足。

具体程序如下,将所有与数码管显示相关的函数保存在新建的 Seg_Reg.c 文件

/*  共阴数码管编码表:
 0x3f   0x06   0x5b  0x4f  0x66  0x6d  0x7d  0x07  0x7f  0x6f 
  0      1      2     3     4     5     6     7     8     9 
 0xbf   0x86   0xdb  0xcf  0xe6  0xed  0xfd  0x87  0xff  0xef           
  0.     1.     2.    3.    4.    5.    6.    7.    8.    9. */
 
             
uint8_t Seg_Table[20] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,
                         0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef};
/*对段码值进行存储*/


void Seg_Init(void)      //查找原理图对数码管相关引脚进行初始化
{
  __RCC_GPIOA_CLK_ENABLE();//打开GPIOA的时钟
  __RCC_GPIOB_CLK_ENABLE();//打开GPIOB的时钟
  __RCC_GPIOC_CLK_ENABLE();//打开GPIOC的时钟
        
  GPIO_InitTypeDef GPIO_InitStruct; 
                
  GPIO_InitStruct.Pins = GPIO_PIN_0 | GPIO_PIN_4; //PA00,E;PA04,G
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.IT = GPIO_IT_NONE;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
        
  GPIO_InitStruct.Pins = GPIO_PIN_6 | GPIO_PIN_4 | GPIO_PIN_2 | GPIO_PIN_0 | GPIO_PIN_3 | GPIO_PIN_7; //PB06,B;PB04,C;PB02,D;PB00,F;PB03,DP  //PB07,COM1
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.IT = GPIO_IT_NONE;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
        
  GPIO_InitStruct.Pins = GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2; //PC04,A; //PC03,COM2;PC02,COM3
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.IT = GPIO_IT_NONE;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
}
void Seg_Dis(uint8_t Pos,uint8_t Num)   //Pos表示指定哪一个数码管亮,Num表示要显示的数字
{
  int i;
  uint8_t Dis_Value,Location;
  Location = Pos;
  Dis_Value = Seg_Table[Num];
        
  for(i = 0; i < 8; i++)      //通过循环确定每一个段码引脚的亮灭情况
  {
    switch(i)
      {
/*将Dis_Value右移i位,再和0x01(00000001)相与消除其他位的影响,可以确定该位的写入值,
  学员可以自己用一个实例比如0x6d(01101101)进行分析*/
        case 0:
          GPIO_WritePin(CW_GPIOC,GPIO_PIN_4,(Dis_Value >> i) & 0x01);    //PC04,A
          break;
        case 1:
          GPIO_WritePin(CW_GPIOB,GPIO_PIN_6,(Dis_Value >> i) & 0x01);    //PB06,B
          break;
        case 2:
          GPIO_WritePin(CW_GPIOB,GPIO_PIN_4,(Dis_Value >> i) & 0x01);    //PB04,C
          break;
        case 3:
          GPIO_WritePin(CW_GPIOB,GPIO_PIN_2,(Dis_Value >> i) & 0x01);    //PB02,D
          break;
        case 4:
          GPIO_WritePin(CW_GPIOA,GPIO_PIN_0,(Dis_Value >> i) & 0x01);    //PA00,E
          break;
        case 5:
          GPIO_WritePin(CW_GPIOB,GPIO_PIN_0,(Dis_Value >> i) & 0x01);    //PB00,F
          break;
        case 6:
          GPIO_WritePin(CW_GPIOA,GPIO_PIN_4,(Dis_Value >> i) & 0x01);    //PA04,G
          break;
        case 7:
          GPIO_WritePin(CW_GPIOB,GPIO_PIN_3,(Dis_Value >> i) & 0x01);    //PB03,DP
          break;
        default:
          break;
      }
  }
        
  switch(Location)    //确定段码后再选择位码
  {
    case 0:
      GPIO_WritePin(CW_GPIOB,GPIO_PIN_7,GPIO_Pin_RESET);  //PB07,COM1
      GPIO_WritePin(CW_GPIOC,GPIO_PIN_3,GPIO_Pin_SET);    //PC03,COM2
      GPIO_WritePin(CW_GPIOC,GPIO_PIN_2,GPIO_Pin_SET);    //PC02,COM3
      break;
    case 1:
      GPIO_WritePin(CW_GPIOB,GPIO_PIN_7,GPIO_Pin_SET);    //PB07,COM1
      GPIO_WritePin(CW_GPIOC,GPIO_PIN_3,GPIO_Pin_RESET);  //PC03,COM2
      GPIO_WritePin(CW_GPIOC,GPIO_PIN_2,GPIO_Pin_SET);    //PC02,COM3
      break;
    case 2:
      GPIO_WritePin(CW_GPIOB,GPIO_PIN_7,GPIO_Pin_SET);    //PB07,COM1
      GPIO_WritePin(CW_GPIOC,GPIO_PIN_3,GPIO_Pin_SET);    //PC03,COM2
      GPIO_WritePin(CW_GPIOC,GPIO_PIN_2,GPIO_Pin_RESET);  //PC02,COM3
      break;
    default:
      break;
  }
}
在主函数里调用Seg_Dis函数即可在对应位置显示相应数字(别忘了初始化),各位学员熟练之后可以通过define定义每个引脚的写入,使代码更加简洁美观。 程序下载接线如图4-4所示:

5308ea28-11a8-11ef-a297-92fbcf53809c.png

图4-4 电压电流表程序下载接线

4.4.实验效果

最终的实验效果如下图所示:

53299930-11a8-11ef-a297-92fbcf53809c.png

5359d12c-11a8-11ef-a297-92fbcf53809c.png

53856918-11a8-11ef-a297-92fbcf53809c.png

图4-5 数码管显示实验效果



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 发光二极管
    +关注

    关注

    13

    文章

    1198

    浏览量

    66282
  • 数码管
    +关注

    关注

    32

    文章

    1882

    浏览量

    91064
  • 驱动电路
    +关注

    关注

    153

    文章

    1529

    浏览量

    108493
  • 限流电阻
    +关注

    关注

    2

    文章

    85

    浏览量

    17201
  • 电压电流表
    +关注

    关注

    0

    文章

    25

    浏览量

    2076
  • CW32
    +关注

    关注

    1

    文章

    203

    浏览量

    628

原文标题:CW32数字电压电流表软件教程-实验三:数码管显示数字

文章出处:【微信号:武汉芯源半导体,微信公众号:武汉芯源半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CW32数字电压电流表-产品硬件设计要点

    主要功能: 1、对5-99V的电压与0.1-3A的电流进行测量与显示 2、通过蓝牙发送测得的数据 3、作为一款CW32+数码管的迷你开发板
    的头像 发表于 04-25 15:20 1905次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b>-产品硬件设计要点

    CW32数字电压电流表软件教程(五):ADC采样及显示

    模拟数字转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。通
    的头像 发表于 05-21 10:34 1138次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b><b class='flag-5'>软件教程</b>(五):ADC采样及<b class='flag-5'>显示</b>

    CW32数字电压电流表软件教程-实验数码管显示数字

    原理是由多个发光的二极共阴极或者共阳极组成的成“8”字形的显示器件。数码管通过不同的组合可用来显示数字0~9、字符A ~ F及小数点“.”
    的头像 发表于 05-31 15:21 953次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b><b class='flag-5'>软件教程</b>-实验<b class='flag-5'>三</b>:<b class='flag-5'>数码管</b><b class='flag-5'>显示</b><b class='flag-5'>数字</b>

    数字电流表的设计

    1 应用背景1.1设计意义数字电流表的诞生打破了传统电子测量仪器的模式和格局。它显示清晰直观、读数准确,采用了先进的数显威廉希尔官方网站 ,大大地减少了因人为因素所造成的测量误差事件。数字
    发表于 08-06 06:22

    数码管显示电压电路图大全(六款数码管显示电压电路原理图详解)

    本文主要介绍了数码管显示电压电路图大全(六款数码管显示电压电路原理图详解)。测得的
    发表于 03-26 13:53 19.3w次阅读
    <b class='flag-5'>数码管</b><b class='flag-5'>显示</b><b class='flag-5'>电压电</b>路图大全(六款<b class='flag-5'>数码管</b><b class='flag-5'>显示</b><b class='flag-5'>电压电</b>路原理图详解)

    用JLCPCB制造数字电压表/电流表

    用JLCPCB制造数字电压表/电流表教程。
    发表于 04-11 14:45 0次下载

    CW32数字电压电流表-产品制作注意事项

    焊接排针再焊接数码管,且需要像上图一样确保排针底部不要凸出PCB,否则会与数码管发生干涉 2、外壳安装 如果您计划使用淘宝或其他渠道购买的公版外壳,在焊接数码管前请先仔细阅读下方内容 注:建议先焊接
    的头像 发表于 04-24 17:29 420次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b>-产品制作注意事项

    CW32数字电压电流表软件教程-实验四:数码管动态显示

    5.1.数码管动态显示原理 所谓动态扫描显示即轮流向各位数码管送出段码和位码,利用发光的余辉和人眼视觉暂留作用,使人眼的感觉好像各位
    的头像 发表于 05-31 15:23 507次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b><b class='flag-5'>软件教程</b>-实验四:<b class='flag-5'>数码管</b>动态<b class='flag-5'>显示</b>

    CW32数字电压电流表软件教程-实验五:ADC采样及显示

    数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。 6.1.2.
    的头像 发表于 05-31 15:28 549次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b><b class='flag-5'>软件教程</b>-实验五:ADC采样及<b class='flag-5'>显示</b>

    CW32数字电压电流表软件教程-实验七:基本数据处理算法(均值滤波)

    有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m,m为该模板中包含当前像素在内的像素总个数。这本是数字图像处理的一种方法,但也可以用在我们数字电压电流表
    的头像 发表于 05-31 15:47 364次阅读

    CW32数字电压电流表软件进阶教程-1.电压电流同时显示

    基于[CW32数字电压电流表软件教程-实验七:基本数据处理算法(均值滤波)],可以对电压电流进行同时采集
    的头像 发表于 05-31 15:50 721次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b><b class='flag-5'>软件</b>进阶教程-1.<b class='flag-5'>电压电流</b>同时<b class='flag-5'>显示</b>

    CW32数字电压电流表软件进阶教程-2.电压电流值做均值滤波

    在实验运行7.1章节例程时 [CW32数字电压电流表软件进阶教程-1.电压电流同时显示] ,会发
    的头像 发表于 05-31 15:57 490次阅读

    CW32数字电压电流表软件进阶教程-3.电压电流标定

    标定是通过测量标准器的偏差来补偿仪器系统误差,从而改善仪器或系统准确度、精度的操作。为了提高电压电流表在测量时的测量精度和准确度,需要对电压电流进行标定校准。 常见的标定原理如下:假设一个采样系统
    的头像 发表于 05-31 16:20 712次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b><b class='flag-5'>软件</b>进阶教程-3.<b class='flag-5'>电压电流</b>标定

    基于CW32F003E4P7的数字电压电流表产品方案

    产品实物: 一、产品概述 数字电压电流表,又称为数显电流电压表,是以数字形式显示,能够同时检测电流
    的头像 发表于 06-25 11:55 925次阅读
    基于<b class='flag-5'>CW</b>32F003E4P7的<b class='flag-5'>数字</b><b class='flag-5'>电压电流表</b>产品方案

    8位数码管怎么不显示数字

    8位数码管是一种常见的电子显示设备,用于显示数字或字符。然而,有时8位数码管可能无法正常显示
    的头像 发表于 08-28 16:34 864次阅读