开篇简介

相信玩过单片机的人都不会对数码管感到陌生!这次的分享也是近期在做的一个小项目里面用到的实例,代码均是自编、自测,保质保量?相信对各位初学者能起到快速上手的作用。(主控基于STM32F103ZCT6)。

数码管的分类

俗话说的好,“工欲善其事,必先利其器”,在我们最先开始学习数码管的编程时,要先了解数码管的分类,数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。其实还蛮好理解的?

数码管的驱动方式

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。

静态显示驱动

静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

动态显示驱动

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

在给出代码之前还需给出共阳数码管和主控的原理图,这样大家才看的清楚。

共阳数码管:前四位


共阳数码管:后四位


内部原理图



部分主控引脚分配图:(可根据自己的选择不同而改变?)

程序源码

安拉安拉,相信刚才上面的一堆理论大家已经看烦了,那么我们现在直奔主题吧!(本次编译的是共阳数码管,大家别弄混哦!)好了,上代码!!!!

#include "shumaguan.h"
#include "stm32f10x.h"
void shumaguan(int i,int j)//定义共阳数码管控制函数,参数1为位选,参数2为段选;
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG,ENABLE);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOE, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOF, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化端口引脚;switch(i)//开位选;{case 1:GPIO_SetBits(GPIOF,GPIO_Pin_13);break;case 2:GPIO_SetBits(GPIOG,GPIO_Pin_0);break;case 3:GPIO_SetBits(GPIOE,GPIO_Pin_9);break;  case 4:GPIO_SetBits(GPIOF,GPIO_Pin_12);break;case 5:GPIO_SetBits(GPIOE,GPIO_Pin_8);break;case 6:GPIO_SetBits(GPIOE,GPIO_Pin_7);break;case 7:GPIO_SetBits(GPIOE,GPIO_Pin_10);break;case 8:GPIO_SetBits(GPIOF,GPIO_Pin_11);break;}if (j==0)//匹配段选;{GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_SetBits(GPIOC,GPIO_Pin_6);GPIO_ResetBits(GPIOC,GPIO_Pin_7);GPIO_ResetBits(GPIOG,GPIO_Pin_4);GPIO_ResetBits(GPIOG,GPIO_Pin_5);GPIO_ResetBits(GPIOG,GPIO_Pin_6);GPIO_ResetBits(GPIOG,GPIO_Pin_7);}else if(j==1){GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_SetBits(GPIOC,GPIO_Pin_6);GPIO_SetBits(GPIOC,GPIO_Pin_7);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_SetBits(GPIOG,GPIO_Pin_4);GPIO_ResetBits(GPIOG,GPIO_Pin_5);GPIO_ResetBits(GPIOG,GPIO_Pin_6);GPIO_SetBits(GPIOG,GPIO_Pin_7);}else if(j==2){GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_ResetBits(GPIOC,GPIO_Pin_6);GPIO_SetBits(GPIOC,GPIO_Pin_7);GPIO_ResetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOG,GPIO_Pin_4);GPIO_SetBits(GPIOG,GPIO_Pin_5);GPIO_ResetBits(GPIOG,GPIO_Pin_6);GPIO_ResetBits(GPIOG,GPIO_Pin_7);}else if(j==3){GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_ResetBits(GPIOC,GPIO_Pin_6);GPIO_SetBits(GPIOC,GPIO_Pin_7);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOG,GPIO_Pin_4);GPIO_ResetBits(GPIOG,GPIO_Pin_5);GPIO_ResetBits(GPIOG,GPIO_Pin_6);GPIO_ResetBits(GPIOG,GPIO_Pin_7);}else if(j==4){GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_ResetBits(GPIOC,GPIO_Pin_6);GPIO_ResetBits(GPIOC,GPIO_Pin_7);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_SetBits(GPIOG,GPIO_Pin_4);GPIO_ResetBits(GPIOG,GPIO_Pin_5);GPIO_ResetBits(GPIOG,GPIO_Pin_6);  GPIO_SetBits(GPIOG,GPIO_Pin_7);}else if(j==5){GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_ResetBits(GPIOC,GPIO_Pin_6);GPIO_ResetBits(GPIOC,GPIO_Pin_7);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOG,GPIO_Pin_4);GPIO_ResetBits(GPIOG,GPIO_Pin_5);GPIO_SetBits(GPIOG,GPIO_Pin_6);  GPIO_ResetBits(GPIOG,GPIO_Pin_7);}else if(j==6){GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_ResetBits(GPIOC,GPIO_Pin_6);GPIO_ResetBits(GPIOC,GPIO_Pin_7);GPIO_ResetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOG,GPIO_Pin_4);GPIO_ResetBits(GPIOG,GPIO_Pin_5);GPIO_SetBits(GPIOG,GPIO_Pin_6);  GPIO_ResetBits(GPIOG,GPIO_Pin_7);}else if(j==7){GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_SetBits(GPIOC,GPIO_Pin_6);GPIO_SetBits(GPIOC,GPIO_Pin_7);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_SetBits(GPIOG,GPIO_Pin_4);GPIO_ResetBits(GPIOG,GPIO_Pin_5);GPIO_ResetBits(GPIOG,GPIO_Pin_6);  GPIO_ResetBits(GPIOG,GPIO_Pin_7);}else if(j==8){GPIO_SetBits(GPIOG,GPIO_Pin_8);GPIO_ResetBits(GPIOC,GPIO_Pin_6);GPIO_ResetBits(GPIOC,GPIO_Pin_7);GPIO_ResetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOG,GPIO_Pin_4);GPIO_ResetBits(GPIOG,GPIO_Pin_5);GPIO_ResetBits(GPIOG,GPIO_Pin_6);  GPIO_ResetBits(GPIOG,GPIO_Pin_7);}else if(j==9){GPIO_ResetBits(GPIOG,GPIO_Pin_8);GPIO_SetBits(GPIOC,GPIO_Pin_6);GPIO_SetBits(GPIOC,GPIO_Pin_7);GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_SetBits(GPIOG,GPIO_Pin_4);GPIO_SetBits(GPIOG,GPIO_Pin_5);GPIO_SetBits(GPIOG,GPIO_Pin_6);  GPIO_SetBits(GPIOG,GPIO_Pin_7);}switch(i)//关段选;{case 1:GPIO_ResetBits(GPIOF,GPIO_Pin_13);break;case 2:GPIO_ResetBits(GPIOG,GPIO_Pin_0);break; case 3:GPIO_ResetBits(GPIOE,GPIO_Pin_9);break;  case 4:GPIO_ResetBits(GPIOF,GPIO_Pin_12);break;case 5:GPIO_ResetBits(GPIOE,GPIO_Pin_8);break;case 6:GPIO_ResetBits(GPIOE,GPIO_Pin_7);break;case 7:GPIO_ResetBits(GPIOE,GPIO_Pin_10);break;case 8:GPIO_ResetBits(GPIOF,GPIO_Pin_11);break;}
}

由于本人的性格原因,总是喜欢把代码往复杂了写?(自认为有可靠感)大家看完这段代码后可以直接定义自己的宏定义来修改代码的篇幅因为本段代码中有许多地方可以用宏定义后替代冗杂的代码,根据大家的喜好来吧,(因为本次代码是从一个整体项目中摘出来的,其中定义端口包含了本次项目其他跟本次数码管无关的初始化,大家自己删除即可)

显而易见,这段程序定义的函数第一个参数就是位选,这边板子上位选为高电平才会被选中,而第二个参数段选就按共阳数码管的规则来,低电平选中即可。封装成函数是为了以后编程32时工程调用方便,GPIO_ResetBits()和GPIO_SetBits()这两个函数作用就是具体到某个端口置0还是1的。。。有过32

编程基础的基本都懂?所以就不赘述了。

STM32共阳数码管编程分享相关推荐

  1. c语言一位共阳数码管编程,求一个共阳四位数码管滚动显示1234的程序

    /******************************************************************************* * 文件名: 数码管 * 描  述: ...

  2. 共阳数码管段码表_C51编程7数码管显示原理

    如果将单片机的比喻计算的主机,而按键相当于电脑的输入设备(键盘或者鼠标),那么LED灯可以作为输出设备的显示器:如果8位数据,使用8个LED显示数据表示,相当于是以二进制显示数据,非常不利于阅读. 为 ...

  3. stm32用库函数控制一位共阳数码管以及共阴数码管

    一.数码管原理: 见上图,上图是一个数码管的内部示意图,它们的发光原理和普通发光二极管是一样的,所以可将数码管的亮段当成几个发光二极管.根据内部发光二极管的共连接端不同,可以分为共阳极接法和共阴极接法 ...

  4. stm32控制共阳数码管以及共阴数码管

    共阳数码管 #include "stm32f10x.h" u8table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};//共阳 ...

  5. STM32F103C8T6 I/O口驱动4位共阳数码管

    STM32F103C8T6 I/O口驱动4位共阳数码管 看了网上很多的资料.很少有单独讲解STM32 I/O口直接驱动数码管的资料,有的网上还禁用了JTAG和SWD口,对很多刚入门的学者会造成不必要的 ...

  6. 使用TMS320F28335控制四位共阳数码管

    目录 1 要实现的功能 2 数码管的原理 2.1 数码管发光显示原理 2.2 数码管控制原理 3 功能实现过程 3.1 GPIO配置 3.2 数字显示 3.3 显示控制 3.4 其他代码 4 调试修改 ...

  7. 共阳数码管段码表_正点原子开拓者FPGA开发板资料连载第十一章 静态数码管显示实验...

    1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...

  8. 蓝桥杯单片机备战(四)共阳数码管的静态显示

    1.共阳数码管原理实现 这是共阳数码管,所谓共阳的意思就是共阳极,每一个LED共用一个阳极,当控制LED的阴极为低电平时被点亮,如下图: 这里com1到com8为共阳口,例: 当com1设置为高电平时 ...

  9. 四、共阳数码管的动态显示

    目录 1.什么是 静态显示和动态显示? 2.数码管的动态显示 1.什么是 静态显示和动态显示? ①静态显示:COM1~4都是由P0控制,例如:P0给8,则COM1~4都是显示8: 如果要显示2018: ...

最新文章

  1. anaconda安装scrapy失败的解决方法(2020.7.7)
  2. Yii2 restful 分页支持
  3. et文件怎么转成excel_微软推出Office App,Word、Excel、PowerPoint三合一(附下载)
  4. windows下生成zlib1.dll
  5. Win7查看开机记录
  6. IIS6.0目录解析漏洞原理/复现
  7. linux 下 dhcp failover相关
  8. 对FT证券系统故障的分析与思考
  9. 世界3大IT服务品牌之一塔塔咨询服务公司发布新品牌宣言
  10. 陶瓷天线和PCB天线以及IPEX天线三者间区别
  11. Fritzing软件绘制Arduino面包板接线图传感器模块库文件170
  12. invalid operands of types‘const char [7]‘and ‘char [32]‘ to binary
  13. setSingleChoiceItems和setPositiveButton两者触发时期
  14. 课堂派考试可以切屏吗_雨课堂考试可以切屏吗?能切出去搜答案吗
  15. Element-Ui组件 Radio 单选框 修改点击激活时的文本颜色,填充色和边框色
  16. 塞北村镇旅游网站设计(论文+PPT+源码)
  17. 泊松分酒 泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。
  18. 中兴B860AV2.1B电视盒子刷机固件
  19. 不可错过的五款开源图形处理软件
  20. 日常计算机网络英语对话,日常话题英语口语

热门文章

  1. java井字游戏_java井字棋源代码(双人对战版)
  2. cad隐藏图层命令快捷键_Auto CAD如何隐藏全部图层,快捷键是什么?
  3. 11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?
  4. 如何下载网页上的视频
  5. 比特大陆之争终落幕,吴忌寒为爱和平退出?
  6. 2021-2027全球与中国5G独立组网非独立组网基础设施市场现状及未来发展趋势
  7. linux插网卡不能识别,linux-解决添加的网卡无法识别的问题
  8. html鼠标手状态,css html 鼠标手型,鼠标形状,鼠标效果,样式
  9. Autosar Nm机制
  10. 移动云API开放平台助力开发者驰骋云端