一位共阴数码管0至F数码显示

本文介绍了一种基于STM8S208MB单片机的数码管显示程序实现方法。通过配置端口为输出模式,并使用定时循环更新数码管的显示内容,实现了从0到9的数字滚动显示。该程序还包含了一个简单的延时函数,以确保每个数字都有足够的时间被观察到。
******************************************************************/
#include "iostm8s208mb.h"//主控芯片的头文件
/************************常用数据类型定义*************************/
#define u8  uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char    uint8_t; 
typedef unsigned short   uint16_t;
typedef unsigned long    uint32_t;
/***********************端口/引脚定义区域************************/
#define  LED    PC_ODR  //1位数码管段码连接端口组
/***********************用户自定义数据区域***********************/
u8 tableA[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,\
  0x77,0x7C,0x39,0x5E,0x79,0x71};
//共阴数码管段码0至F
/*************************函数声明区域***************************/
void delay(u16 Count);//延时函数声明
/**************************主函数区域****************************/
int main(void)
{
  u8 num;//定义for循环控制变量“num”
  PC_DDR=0xFF;//配置PC端口为输出模式
  PC_CR1=0xFF;//配置PC端口为推挽输出模式
  PC_CR2=0x00;//配置PC端口低速率输出
  while(1)
  {
    for(num=0;num<=9;num++)
    {
      LED=tableA[num];
      delay(300);//延时便于观察LED情况
    }
  }
}
/****************************************************************/
//延时函数delay(),有形参Count用于控制延时函数执行次数,无返回值
/****************************************************************/
void delay(u16 Count)
{
  u8 i,j;
  while (Count--)//Count形参控制延时次数
  {
    for(i=0;i<50;i++)
      for(j=0;j<20;j++);
  }
}

 

以下是使用STM32F103C8T6(由于暂未找到STM32F030C8T6直接资料,可做参考)控制一位共阴数码管的程序及使用方法的说明。 #### 硬件连接 一位共阴数码管的引脚连接到STM32的GPIO口,假设数码管的段码引脚分别连接到STM32的PA0 - PA7。 #### 共阴数码管原理 共阴数码管是指将所有发光二极管的阴极接到一起形成公阴极(COM)的数码管共阴数码管在应用时应将公极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮;当某一字段的阳极为低电平时,相应字段就不亮[^2]。 #### 程序代码 以下是使用HAL库实现一位共阴数码管显示的代码示例: ```c #include "stm32f1xx_hal.h" // 共阴数码管段码表,显示0 - F const uint8_t SEG_CODE[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 0x77, // A 0x7C, // B 0x39, // C 0x5E, // D 0x79, // E 0x71 // F }; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); uint8_t num = 0; while (1) { // 显示数字 uint8_t seg_data = SEG_CODE[num % 16]; // 取0 - 15的余数,确保数字在范围内 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7, GPIO_PIN_RESET); if (seg_data & 0x01) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); if (seg_data & 0x02) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); if (seg_data & 0x04) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); if (seg_data & 0x08) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); if (seg_data & 0x10) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); if (seg_data & 0x20) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); if (seg_data & 0x40) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); if (seg_data & 0x80) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); HAL_Delay(1000); // 延时1秒,便于观察显示效果 num++; // 数字递增 } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { while(1); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { while(1); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` #### 使用方法 1. 使用STM32CubeMX创建新项目,选择STM32F103C8T6作为目标芯片。 2. 在“Pinout & Configuration”中,将PA0 - PA7设置为GPIO_Output模式。 3. 配置系统时钟,确保时钟频率满足系统需求。 4. 生成初始化代码,并导入到Keil MDK-ARM或STM32CubeIDE中。 5. 将上述代码复制到`main.c`文件中,编译并下载到开发板。 6. 连接好一位共阴数码管到开发板的PA0 - PA7,数码管阴极连接到GND。 7. 上电后,数码管会依次显示0 - F,每个数字显示1秒。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值