数码管分共阴极连接和共阳极连接两种,本次试验所用的数码管为共阴极连接方式,如下所示。数码管为4位8段数码管,8段分别是A,B,C,D,E,F,G,DP,如显示数字3,需要将A,B,C,D,G点亮,显示其他数字原理相同。
试验采用的是正点原子mini开发板,一个DS18B20,一个数码管,数码管1~12引脚对应连接到PB0~PB11,18B20的数据引脚连接到PA0上。读取18B20的温度程序暂不作介绍,后面补充。
本次采用的显示方式是逐位扫描,根据原理图可以看出数码管一次只能输出一位数组,所以如果是多位的必须使用扫描的方式输出,缩短切换的间隔,就可以达到不闪烁的效果。
#include "io.h"
#include "delay.h"
int num[10] = {0x64b,0x48,0x453,0x45a,0x258,0x61a,0x61b,0x448,0x65b,0x65a};//对应显示0~9
int p;
void DisPlayNum(int n)
{
if (n < 9999)
{
int i = 0;
for (i=0;i<4;i++)//逐位显示,从低位至高位显示
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_All, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_11, GPIO_PIN_SET);
switch (i)
{
case 0:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
break;
case 1:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET);//小数点
break;
case 2:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
break;
case 3:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_RESET);
break;
}
p = n % 10;
HAL_GPIO_WritePin(GPIOB, num[p], GPIO_PIN_SET);//显示每一位的0~9
n = n / 10;//依次显示下一位
delay_ms(5);//显示完1位,延时5ms,然后显示下一位
if (n==0)//最后一位显示完,结束(从低位至高位显示)
break;
}
}
}
着重介绍下面代码:
int num[10] = {0x64b,0x48,0x453,0x45a,0x258,0x61a,0x61b,0x448,0x65b,0x65a};//对应显示0~9
HAL_GPIO_WritePin(GPIOB, num[p], GPIO_PIN_SET);//显示每一位的0~9
以数字0来说明:
0:ABCDEF,需要将这几段同时点亮,即写成高电平,GPIO_PIN_10|GPIO_PIN_6|GPIO_PIN_3|GPIO_PIN_1|GPIO_PIN_0|GPIO_PIN_9 = 0x64b
如: HAL_GPIO_WritePin(GPIOB, 0x64b, GPIO_PIN_SET);//即将0对应的ABCDEF拉高,点亮
每一个引脚对应相应的数值,stm32f1xx_hal_gpio.h中定义:
主函数:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
DS18B20_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
temp = DS18B20_Get_Temp();
n = (int)(temp * 10);
DisPlayNum(n);
}
/* USER CODE END 3 */
}
主函数没有什么需要特别说明的,直接将18B20读取的温度显示出来。
以上。
贴出链接,供大家参考。
链接:https://pan.baidu.com/s/1tFBvOjAD0rac-h8pJQH50A
提取码:24za