你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 数码管显示

[复制链接]
STMCU小助手 发布时间:2022-5-25 18:00
一 认识二级管

常用的二级管分为两种

1,(b)图共阴极结构:是把所有 LED 的阴极作为公共端(COM) 连起来,接低电平,通常接地。通过控制每一个 LED 的阳极电平使其发光或熄灭,阳极为高电平时LED 发光,为低电平时 LED熄灭。如显示数字0时,a、b、ad.e、t端为高电平,其他各端为低电平。

2,(c)图共阳极结构:是把所有 LED 的阳极作为公共端(COM) 连起来,接高电平,通常接电源(如+5V )。通过控制每一 个LED 的阴极电平使其发光或熄灭,阴极为低电平时LED 发光,为高电平时 LED熄灭。

如下图

c5a6bf63ee9247ec8fc75c99cb9b856b.jpg

f51d5de3e4be4e2c9fac3fee15a90f74.jpg

我们以共阴极结构举例,进行计算,其过程就是二进制转化为16进制,做法如下

a13ad5e8585849269a282c8547c96e16.jpg
fc2f9ece545b49ff92a7f86093186183.jpg

以此列表可以看出,对于同一个字符,共阴极和共阳极的字形码是相反的

二 程序的实现

数码管静态显示电路图

cdf72a536b1e4bdfaf5501c650c29559.jpg

代码实现数码管也有两种方式

一如上电路图,亮两个数码管

  1. #include "stm32f10x.h"
  2. //定义0~9十个数字的字形码表
  3. uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x7d,0x07,0x7f,0x6f};
  4. uint16_t disp[2];
  5. uint16_t temp,i;

  6. void Delay(unsigned int count)               //延时函数
  7. {
  8.     unsigned int i;
  9.     for(;count!=0;count--)
  10.     {
  11.         i=5000;
  12.         while(i--);
  13.     }
  14. }
  15. void main(void)
  16. {
  17.                 GPIO_InitTypeDef GPIO_InitStructure;
  18.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                 //使能GPIOB时钟
  19.                 GPIO_InitStructure.GPIO_Pin = 0xffff;                       //PC0-PC15引脚配置
  20.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;            //配置引脚为推挽输出
  21.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //GPIOB速度为50MHz
  22.                 GPIO_Init(GPIOB, &GPIO_InitStructure);                      //初始化PC0-PC15
  23.         while(1)               
  24.         {
  25.             for(i=0;i<=20;i++)
  26.             {
  27.               disp[1] = table[i/10];              //数码管显示十位数字的字形码
  28.               disp[0] = table[i%10];              //数码管显示个位数字的字形码
  29.               //十位数的字形码左移8位,然后与各位数的字形码合并
  30.               temp = (disp[1]<<8)|(disp[0]&0x0ff);
  31.               GPIO_Write(GPIOC,temp);
  32.               Delay(100);
  33.             }                                 
  34.         }

  35. }
复制代码

代码说明:

(1)语句"GPIO_InitStructure.GP1O_ Pin = Oxfff:” 用来配置 PCO~PC15 引1脚。为什么使用Oxfit)参数就可以配置 PCO-PC15引1脚呢?可以参考stm32110x_gpio.h 头对 GPIO Pin_x的定义。
(2)disp1数组存放数码管将显示十位和个位数字的字形码,是经常用到的显示缓冲区。

(3)语句"temp = (disp[1]<<8)|(disp[0]&0x0ff);” 的作用:disp[1]<<8是把显示十位数字的字形码左移8 位(移到高 8位),disp[0]&0x0ff 是保留低8位,其他位清零(高8 位清零),然后把高8位(十位)和低8 位(个位)合并,完成循环显示 0-20字形码的显示效果。

二 第二种代码实现的方法

  1. //头文件
  2. #include "stm32f10x.h"
  3. #include "GPIOLIKE51.h"        


  4. #define CLK  PBout(8)
  5. #define DAT  PBout(9)
  6. #define W1   PBout(4)
  7. #define W2   PBout(5)
  8. #define W3   PBout(6)
  9. #define W4   PBout(7)


  10. //函数声明
  11. void GPIO_Configuration(void);

  12. void delay(int m)   
  13. {
  14.    int i,j;
  15.    for(i=0;i<m;i++)
  16.       for(j=0;j<1000;j++);
  17. }

  18. void Delay(uint32_t nCount)           //延时函数
  19. {
  20.   for(; nCount != 0; nCount--);           //函数说明:nCount:延时长短
  21. }

  22. void Smginit(void)                  //定义数码管,进行配置
  23. {
  24.     GPIO_InitTypeDef GPIO_InitStructure;
  25.         
  26.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);         
  27.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);            
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  29.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  31.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  32.         
  33.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);                 
  34.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
  35.                                    GPIO_Pin_8 | GPIO_Pin_9;
  36.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  37.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  38.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  39. }

  40. //定义字形码
  41. unsigned char code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  42. void Disled(int m)  
  43. {
  44.    int i;
  45.    CLK=0;  
  46.    for(i=0;i<8;i++)
  47.    {
  48.       CLK=0;
  49.           delay(1);
  50.       if (m&0x80)
  51.       DAT=1;
  52.       else
  53.       DAT=0;
  54.       CLK=1;
  55.           delay(1);
  56.       m=m<<1;
  57.    }
  58. }

  59. int main(void)
  60. {
  61.           int i;
  62.           Smginit();
  63.           W1=1;            
  64.           W2=1;
  65.           W3=1;
  66.           W4=1;
  67.     while (1)
  68.                 {
  69.                         for(i=0;i<10;i++)
  70.                         {
  71.                          Disled(code<i>);
  72.                          delay(10000);
  73.                         }
  74.     }
  75. }</i>
复制代码

代码说明:

(1)这个程序是电亮4个数码管。

(2)头文件第二行“#include "GPIOLIKE51.h" ”这个是一个点h文件

(3)“nCount”这是一个没有返回值的带形式参数的函数函数名称是Delay,同时函数的参数部分中的_IO是类型修饰符;u32是数据类型,同等于uint_32_t同等于unsigned int型。



收藏 评论0 发布时间:2022-5-25 18:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版