找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14113|回复: 9
打印 上一主题 下一主题
收起左侧

STM32+TM1637驱动数码管显示程序源码与原理图资料(动态显示学号)

  [复制链接]
跳转到指定楼层
楼主
ID:412073 发表于 2018-10-19 08:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


TM1637数码管显示模块原理图如下:


现象:显示4444
要求:计算1-9的段码,用16进制数;
      显示学号后四位
      动态显示全部学号
      计数:从0-9999

stm32单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"
  3. #include "stm32f1xx_hal.h"

  4. /* USER CODE BEGIN Includes */

  5. /* USER CODE END Includes */

  6. /* Private variables ---------------------------------------------------------*/

  7. /* USER CODE BEGIN PV */
  8. /* Private variables ---------------------------------------------------------*/

  9. static uint8_t fac_us=0;

  10. /* USER CODE END PV */

  11. /* Private function prototypes -----------------------------------------------*/
  12. void SystemClock_Config(void);
  13. void Error_Handler(void);
  14. static void MX_GPIO_Init(void);

  15. /* USER CODE BEGIN PFP */
  16. /* Private function prototypes -----------------------------------------------*/

  17. void ALIX_Delay_init(void);
  18. void ALIX_Delay_us(uint32_t nus);
  19. void TMserialstart(void);
  20. void TMserialstop(void);
  21. void TMserialask(void);
  22. void TMserialWrByte(uint8_t oneByte);
  23. void TMSegDisplay(uint8_t *DISCODE);

  24. /* USER CODE END PFP */

  25. /* USER CODE BEGIN 0 */

  26. /* USER CODE END 0 */

  27. int main(void)
  28. {

  29.   /* USER CODE BEGIN 1 */
  30.         
  31.         uint8_t NUM[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
  32.         uint8_t abc[]={0x00,0x00,0x00,0x00};
  33.         
  34. //                0     1    2    3    4    5    6    7    8    9     
  35.   /* USER CODE END 1 */

  36.   /* MCU Configuration----------------------------------------------------------*/

  37.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  38.   HAL_Init();

  39.   /* Configure the system clock */
  40.   SystemClock_Config();

  41.   /* Initialize all configured peripherals */
  42.   MX_GPIO_Init();

  43.   /* USER CODE BEGIN 2 */
  44.         ALIX_Delay_init();
  45.         int b=0;
  46.   /* USER CODE END 2 */

  47.   /* Infinite loop */
  48.   /* USER CODE BEGIN WHILE */
  49.   while (1)
  50.   {
  51.                 int c,d,e,f;
  52.   /* USER CODE END WHILE */

  53.   /* USER CODE BEGIN 3 */
  54.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==0)
  55.                 {

  56.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==1)
  57.                 {
  58.                         b++;
  59.                         
  60.                         c=b%10;
  61.                         d=b/10%10;
  62.                         e=b/100%10;
  63.                         f=b/1000%10;
  64.                         abc[0]=NUM[f];
  65.                         abc[1]=NUM[e];
  66.                         abc[2]=NUM[d];
  67.                         abc[3]=NUM[c];
  68.                         TMSegDisplay(abc);
  69.                 HAL_GPIO_TogglePin(led_GPIO_Port,led_Pin);
  70.                 ALIX_Delay_us(90000);
  71.                         if(b==9999)
  72.                         {
  73.                         b=0;
  74.                         }
  75.                 }
  76.         }


  77.   }
  78.   /* USER CODE END 3 */

  79. }

  80. /** System Clock Configuration
  81. */
  82. void SystemClock_Config(void)
  83. {

  84.   RCC_OscInitTypeDef RCC_OscInitStruct;
  85.   RCC_ClkInitTypeDef RCC_ClkInitStruct;

  86.     /**Initializes the CPU, AHB and APB busses clocks
  87.     */
  88.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  89.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  90.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  91.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  92.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  93.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  94.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  95.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  96.   {
  97.     Error_Handler();
  98.   }

  99.     /**Initializes the CPU, AHB and APB busses clocks
  100.     */
  101.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  102.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  103.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  104.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  105.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  106.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  107.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  108.   {
  109.     Error_Handler();
  110.   }

  111.     /**Configure the Systick interrupt time
  112.     */
  113.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  114.     /**Configure the Systick
  115.     */
  116.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  117.   /* SysTick_IRQn interrupt configuration */
  118.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  119. }

  120. /** Configure pins as
  121.         * Analog
  122.         * Input
  123.         * Output
  124.         * EVENT_OUT
  125.         * EXTI
  126. */
  127. static void MX_GPIO_Init(void)
  128. {

  129.   GPIO_InitTypeDef GPIO_InitStruct;

  130.   /* GPIO Ports Clock Enable */
  131.   __HAL_RCC_GPIOC_CLK_ENABLE();
  132.   __HAL_RCC_GPIOD_CLK_ENABLE();
  133.   __HAL_RCC_GPIOA_CLK_ENABLE();

  134.   /*Configure GPIO pin Output Level */
  135.   HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_SET);

  136.   /*Configure GPIO pin Output Level */
  137.   HAL_GPIO_WritePin(GPIOA, TM_DIO_Pin|TM_CLK_Pin, GPIO_PIN_SET);

  138.   /*Configure GPIO pin : led_Pin */
  139.   GPIO_InitStruct.Pin = led_Pin;
  140.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  141.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  142.   HAL_GPIO_Init(led_GPIO_Port, &GPIO_InitStruct);

  143.   /*Configure GPIO pins : TM_DIO_Pin TM_CLK_Pin */
  144.   GPIO_InitStruct.Pin = TM_DIO_Pin|TM_CLK_Pin;
  145.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  146.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  147.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  148.   /*Configure GPIO pin : PA2 */
  149.   GPIO_InitStruct.Pin = GPIO_PIN_2;
  150.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  151.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  152.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  153.   /*Configure GPIO pin : PA5 */
  154.   GPIO_InitStruct.Pin = GPIO_PIN_5;
  155.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  156.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  157.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  158. }

  159. /* USER CODE BEGIN 4 */

  160. void ALIX_Delay_init()
  161. {

  162.         HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);        
  163.         fac_us=SystemCoreClock/8000000;                                   

  164. }

  165. void ALIX_Delay_us(uint32_t nus)
  166. {               
  167.         uint32_t temp;                     
  168.         SysTick->LOAD=nus*fac_us;                                                                    
  169.         SysTick->VAL=0x00;                                                
  170.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;         
  171.         do
  172.         {
  173.                 temp=SysTick->CTRL;
  174.         }while((temp&0x01)&&!(temp&(1<<16)));                  
  175.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        
  176.         SysTick->VAL =0X00;      
  177. }

  178. void TMserialstart(void)
  179. {
  180.         HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_SET); // CLK = 1
  181.         HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_SET); // DIO = 1
  182.         ALIX_Delay_us(2);
  183.         HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_RESET); // DIO = 0
  184. }

  185. void TMserialstop(void)
  186. {
  187.         HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_RESET); // CLK = 0
  188.         ALIX_Delay_us(2);
  189.         HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_RESET); // DIO = 0
  190.         ALIX_Delay_us(2);
  191.         HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_SET); // CLK = 1
  192.         ALIX_Delay_us(2);
  193.         HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_SET); // DIO = 1
  194. }

  195. void TMserialask(void)
  196. {
  197.         TM1637_DIO_IN();
  198.         HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_RESET); // CLK = 0
  199.         ALIX_Delay_us(5);
  200.         while(HAL_GPIO_ReadPin(TM_DIO_GPIO_Port,TM_DIO_Pin));
  201.         HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_SET); // CLK = 1
  202.         ALIX_Delay_us(2);
  203.         HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_RESET); // CLK = 0
  204.         TM1637_DIO_OUT();
  205. }

  206. void TMserialWrByte(uint8_t oneByte)
  207. {
  208.         uint8_t i;
  209.         for(i=0;i<8;i++)
  210.         {
  211.                 HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_RESET); // CLK = 0
  212.                 if(oneByte&0x01)
  213.                 {
  214.                         HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_SET); // DIO = 1
  215.                 }
  216.                 else
  217.                 {
  218.                         HAL_GPIO_WritePin(TM_DIO_GPIO_Port,TM_DIO_Pin,GPIO_PIN_RESET); // DIO = 0
  219.                 }
  220.                 ALIX_Delay_us(3);
  221.                 oneByte=oneByte>>1;
  222.                 HAL_GPIO_WritePin(TM_CLK_GPIO_Port,TM_CLK_Pin,GPIO_PIN_SET); // CLK = 1
  223.                 ALIX_Delay_us(3);
  224.         }
  225. }

  226. void TMSegDisplay(uint8_t *DISCODE)
  227. {
  228.         uint8_t i;
  229.         TMserialstart();
  230.         TMserialWrByte(0x40);
  231.         TMserialask();
  232.         TMserialstop();
  233.         TMserialstart();
  234.         TMserialWrByte(0xc0);
  235.         TMserialask();
  236.         for(i=0;i<4;i++)
  237.         {
  238.                 TMserialWrByte(*(DISCODE+i));
  239.                 TMserialask();
  240.         }
  241.         TMserialstop();
  242.         TMserialstart();
  243.         TMserialWrByte(0x8f);
  244.         TMserialask();
  245.         TMserialstop();
  246. }

  247. /* USER CODE END 4 */

  248. /**
  249.   * @brief  This function is executed in case of error occurrence.
  250.   * @param  None
  251.   * @retval None
  252.   */
  253. void Error_Handler(void)
  254. {
  255.   /* USER CODE BEGIN Error_Handler */
  256.   /* User can add his own implementation to report the HAL error return state */
  257.   while(1)
  258.   {
  259.   }
  260.   /* USER CODE END Error_Handler */
  261. }

  262. #ifdef USE_FULL_ASSERT

  263. /**
  264.    * @brief Reports the name of the source file and the source line number
  265.    * where the assert_param error has occurred.
  266.    * @param file: pointer to the source file name
  267.    * @param line: assert_param error line source number
  268.    * @retval None
  269.    */
  270. void assert_failed(uint8_t* file, uint32_t line)
  271. {
  272.   /* USER CODE BEGIN 6 */
  273.   /* User can add his own implementation to report the file name and line number,
  274.     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  275.   /* USER CODE END 6 */

  276. }

  277. #endif

  278. /**
  279.   * @}
  280.   */

  281. /**
  282.   * @}
  283. */

  284. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码

所有资料51hei提供下载:
TM1637数码管显示模块资料包.7z (1.66 MB, 下载次数: 319)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:431814 发表于 2018-11-23 14:17 | 只看该作者
谢谢分享!看来这个网站的资料还是蛮多的呀
回复

使用道具 举报

板凳
ID:157393 发表于 2018-11-24 16:16 | 只看该作者
路过学下看下!
回复

使用道具 举报

地板
ID:23844 发表于 2018-11-25 20:21 | 只看该作者
好资料,下载一个回来学习一下。
回复

使用道具 举报

5#
ID:189285 发表于 2019-5-11 11:24 | 只看该作者
没看出用什么逻辑芯片
回复

使用道具 举报

6#
ID:26288 发表于 2019-6-6 08:13 | 只看该作者
学习一下,多谢分享
回复

使用道具 举报

7#
ID:571420 发表于 2019-6-25 09:17 | 只看该作者
好资料
回复

使用道具 举报

8#
ID:478073 发表于 2019-6-25 09:43 | 只看该作者
这不是多次一举吗!I/O口都够用,直接都能驱动的事,硬是要加个1637
回复

使用道具 举报

9#
ID:569027 发表于 2019-9-18 09:27 | 只看该作者
谢谢分享
回复

使用道具 举报

10#
ID:433638 发表于 2020-4-15 01:10 | 只看该作者
感谢分享!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表