嵌入式实验2--数码管显示(基础+进阶)

一、数码管显示

0.想实现效果:

数码管交替或同时显示数字

图片

1.电路设计

使用proteus 设计电路

1.1 STM32最小系统

搭建STM32工作基础条件

1.2 数码管电路

1.2.1 数码管
a.共阴极

abg dp都是led灯,这些led灯的公共端接地,就是共阴极,这时候控制灯泡亮,就在a上加高电位

b.共阳极

这些led灯的公共端接高电位电源,就是共阳极,这时候控制灯泡灭,就在a上加高电位

c.引脚配置外形图

abcdef分别对应数码管中数字的边,控制灯泡亮灭即可构建不同的形状

例如,使数码管显示6,就控制afedcg亮,b和dp灭,dp代表小数点

1.2.2 晶体管

NPN型晶体管连通,在右上为电源的情况下,B1端需要高电位,也就是基极高电位

PNP型晶体管连通,B1端需要低电位,也就是基极低电位

在proteus中添加晶体管,需要在devices中pick一个NPN或者PNP

1.2.3 排阻

排阻(Network Resistor),即网络电阻器(Wire-wound Resistor)。排阻是将若干个参数完全相同的电阻集中封装在一起,组合制成的。它们的一个引脚都连到一起,作为公共引脚。其余引脚正常引出。

在proteus中添加排阻,在devices 中pick一个RES16DIPIS

2.引脚配置

1.proteus设置

1.1 数码管引脚

由数码管的引脚配置图可知,共需要8个引脚(因为数字需要7个边,再加1个小数点)

设置好八个引脚后再一一对应上面数码管引脚的编号备注命名

1.2 晶体管引脚

如图,在晶体管上添加B1、B2引脚,连接到PA9和PA10.(PA1-PA8一一对应数码管引脚)

由GPIOA控制晶体管和数码管引脚的高低电位,B1接高电位时,晶体管Q1接通,那么P1连接处也就是数码管的左边屏幕就会亮。

2.stm32cubeMX设置

对照图中四步,

1.首先在最右侧芯片依次找到PA1-PA10,鼠标左键选择GPIO_OUTPUT,如图中绿颜色部分

2.最左侧找到GPIO

3.检查一下是否引脚都设置了OUTPUT

4.依次重命名为与proteus中相同的引脚名称

完成后直接创建工程文件,然后打开工程文件跳转到keil5

3.数码管显示数字

在while{}里输入以下代码

1.使能数码管位选信号,这里选择使B1导通,于是最后一位参数填了GPIO_PIN_SET,也就是高电位导通,先不让B2导通,给B2低电位

2.使能数码管段选信号,对应上面提到过的数码管引脚图,这里ABC这些引脚连接的公共端是P1P2,也就是电源,所以是共阳极,那么想让谁亮,就给谁添加低电位。

这里想做成6数字,就使afedcg亮,b和dp灭

      HAL_GPIO_WritePin(B1_GPIO_Port,B1_Pin,GPIO_PIN_SET);      //使能数码管位选信号,NPN型基极高电平导通
      HAL_GPIO_WritePin(B2_GPIO_Port,B2_Pin,GPIO_PIN_RESET);
            
    /* USER CODE END WHILE */
      HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);      //使能数码管段选信号
      HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_SET);
      HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);

效果:

4. 2位数码管显示

想使左右屏幕都亮,不能同时让p1,p2同时为高电平,可以让P1P2相继接通高电平

这里就要用到HAL_DELAY函数,括号内参数是毫秒

若毫秒值够小,那么就能实现左右屏同时亮;若毫秒值够大,就能实现左右屏相继点亮

在P1和P2两端代码中间和结尾各加一个delay效果即可实现左右屏亮屏

      HAL_GPIO_WritePin(B1_GPIO_Port,B1_Pin,GPIO_PIN_SET);      //使能数码管位选信号,NPN型基极高电平导通
      HAL_GPIO_WritePin(B2_GPIO_Port,B2_Pin,GPIO_PIN_RESET);
            
    /* USER CODE END WHILE */
      HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);      //使能数码管段选信号
      HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_SET);
      HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
​
​
        HAL_Delay(500);
      HAL_GPIO_WritePin(B1_GPIO_Port,B1_Pin,GPIO_PIN_RESET);      //使能数码管位选信号,NPN型基极高电平导通
      HAL_GPIO_WritePin(B2_GPIO_Port,B2_Pin,GPIO_PIN_SET);
            
    /* USER CODE END WHILE */
      HAL_GPIO_WritePin(A_GPIO_Port,A_Pin,GPIO_PIN_RESET);      //使能数码管段选信号
      HAL_GPIO_WritePin(B_GPIO_Port,B_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(C_GPIO_Port,C_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(D_GPIO_Port,D_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(E_GPIO_Port,E_Pin,GPIO_PIN_SET);
      HAL_GPIO_WritePin(F_GPIO_Port,F_Pin,GPIO_PIN_SET);
      HAL_GPIO_WritePin(G_GPIO_Port,G_Pin,GPIO_PIN_RESET);
      HAL_GPIO_WritePin(DP_GPIO_Port,DP_Pin,GPIO_PIN_SET);
​
        HAL_Delay(500);

二、数码管显示进阶

图片

0.实现效果:

左右两个屏幕一个表示十位数,一个表示个位数,从0遍历到99

1.电路设计

1.1 基本电路

以上面的第一个实验“数码管显示”电路为基础

1.2 修改数码管连线

重新分配数码管连线,如图

1.3 修改STM32芯片频率

仿真模型条件限制,为降低出错率,修改STM32芯片频率为8MHz

2.引脚配置

修改STM32CubeMX中的引脚配置

2.1 分配引脚修改

根据电路设计重新分配引脚

2.2 时钟频率修改

将时钟频率修改为8MHz

3.数码管显示任意数字

3.1 创建数码管断码数组

共阳极数码管段码:

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

分别对应PA7-PA0上的8个引脚的高低电位,从00000000到11110000,分别表示0-9数字

3.2 编写显示display函数

寄存器调用语句:GPIOA->ODR ,可以直接处理A引脚的输出值

3.3 编写清屏display_clear函数

3.4 编写位选bitsel函数

如图

4.数码管循环显示

4.1 先模拟一个数

定义数值

效果如图:

4.2 添加for循环

代码:

      for(num = 0; num<=99;num++){
        display_clear();
        bitsel(1);
        display(duan[num/10]);
        HAL_Delay(50);
        display_clear();
        bitsel(2);
        display(duan[num%10]);
        HAL_Delay(50);
          
      }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值