一、数码管显示
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);}