[STM32F4] STM32F429驱动HT1621

[复制链接]
 楼主| 比神乐 发表于 2025-2-18 12:58 | 显示全部楼层 |阅读模式
代码:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"

  3. /* Private includes ----------------------------------------------------------*/
  4. /* USER CODE BEGIN Includes */

  5. /* USER CODE END Includes */

  6. /* Private typedef -----------------------------------------------------------*/
  7. /* USER CODE BEGIN PTD */

  8. /* USER CODE END PTD */

  9. /* Private define ------------------------------------------------------------*/
  10. /* USER CODE BEGIN PD */

  11. /* USER CODE END PD */

  12. /* Private macro -------------------------------------------------------------*/
  13. /* USER CODE BEGIN PM */
  14. #define uchar unsigned char  
  15. #define uint unsigned int
  16. /** @addtogroup 425_GPIO_led_toggle GPIO_led_toggle
  17.   * @{
  18.   */


  19. #define DA_1 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_SET)
  20. #define DA_0 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET)
  21. #define WR_1 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET)
  22. #define WR_0 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET)
  23. #define CS_1 HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET)
  24. #define CS_0 HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET)

  25. #define Smg_a    0x80
  26. #define Smg_b    0x40
  27. #define Smg_c    0x20
  28. #define Smg_d    0x01
  29. #define Smg_e    0x02
  30. #define Smg_f    0x08
  31. #define Smg_g    0x04
  32. #define Smg_dp   0x10

  33. #define Bmp0Map          Smg_a | Smg_b | Smg_c | Smg_d | Smg_e | Smg_f
  34. #define Bmp1Map          Smg_b | Smg_c
  35. #define Bmp2Map          Smg_a | Smg_b | Smg_d | Smg_e | Smg_g
  36. #define Bmp3Map          Smg_a | Smg_b | Smg_c | Smg_d | Smg_g
  37. #define Bmp4Map          Smg_b | Smg_c | Smg_f | Smg_g
  38. #define Bmp5Map          Smg_a | Smg_c | Smg_d | Smg_f | Smg_g
  39. #define Bmp6Map          Smg_a | Smg_c | Smg_d | Smg_e | Smg_f | Smg_g
  40. #define Bmp8Map          Smg_a | Smg_b | Smg_c | Smg_d | Smg_e | Smg_f | Smg_g
  41. #define Bmp9Map          Smg_a | Smg_b | Smg_c | Smg_d | Smg_f | Smg_g
  42. #define Bmp7Map          Smg_a | Smg_b | Smg_c
  43. #define BmpAMap          Smg_a | Smg_b | Smg_c | Smg_e | Smg_f | Smg_g
  44. #define BmpBMap          Smg_c | Smg_d | Smg_e | Smg_f | Smg_g
  45. #define BmpCMap          Smg_a | Smg_d | Smg_e | Smg_f
  46. #define BmpDMap          Smg_b | Smg_c | Smg_d | Smg_e | Smg_g
  47. #define BmpEMap          Smg_a | Smg_d | Smg_e | Smg_f | Smg_g
  48. #define BmpFMap          Smg_a | Smg_e | Smg_f | Smg_g




  49. const unsigned char SegCode[] = {Bmp0Map,Bmp1Map,Bmp2Map,Bmp3Map,Bmp4Map,Bmp5Map,Bmp6Map,Bmp7Map,Bmp8Map,Bmp9Map,BmpAMap,BmpBMap,BmpCMap,BmpDMap,BmpEMap,BmpFMap};
  50. unsigned char DpyNum[6] = {Smg_g,Smg_g,Smg_g,Smg_g,Smg_g,Smg_g}; //显示缓冲区

  51. unsigned int i;
  52. void delay(uint z)
  53. {
  54.         uint i,j;
  55.         for(i=0;i<z;i++)
  56.                 for(j=0;j<10;j++);
  57. }
  58. void COMMAND_HT1621(unsigned char comm)
  59. {
  60.     //unsigned char i;
  61.     CS_0;
  62.                 delay(5);
  63.     WR_0;
  64.                 delay(5);
  65.     for(i=0;i<3;i++)        //写命令
  66.     {
  67.         if((0x04<<i)&0x04)  DA_1;    //100
  68.         else                DA_0;
  69.                                 delay(5);
  70.         WR_0;
  71.                                 delay(5);
  72.         WR_1;
  73.                                 delay(5);
  74.     }
  75.     for(i=0;i<9;i++)        //写命令数据
  76.     {
  77.         if((comm<<i)&0x80)  DA_1;    //100
  78.         else                DA_0;
  79.                                 delay(5);
  80.         WR_0;
  81.                                 delay(5);
  82.         WR_1;
  83.                                 delay(5);
  84.     }
  85.     CS_1;
  86.                 delay(5);
  87. }

  88. void HT1621_Display(void)
  89. {
  90.     //unsigned char i;
  91.     CS_0;                        //片选CS
  92.                 delay(5);
  93.     WR_0;
  94.                 delay(5);
  95.     for(i=0;i<3;i++)                   //写命令
  96.     {
  97.         if((0x05<<i)&0x04)  DA_1;
  98.         else                DA_0;
  99.                                 delay(5);
  100.         WR_0;
  101.                                 delay(5);
  102.         WR_1;
  103.                                 delay(5);
  104.     }
  105.     for(i=0;i<6;i++)                   //写地址
  106.     {
  107.         if((20<<i)&0x20)    DA_1;  //20对应 SEG地址
  108.         else                DA_0;
  109.                                 delay(5);
  110.         WR_0;
  111.                                 delay(5);
  112.         WR_1;
  113.                                 delay(5);
  114.     }
  115.     for(i=0;i<8;i++)                   //写数据
  116.     {
  117.         if((DpyNum[5]<<i)&0x80)   DA_1;
  118.         else                      DA_0;
  119.                                 delay(5);
  120.         WR_0;
  121.                                 delay(5);
  122.         WR_1;
  123.                                 delay(5);
  124.     }
  125.     for(i=0;i<8;i++)                   //写数据
  126.     {
  127.         if((DpyNum[4]<<i)&0x80)   DA_1;
  128.         else                      DA_0;
  129.                                 delay(5);
  130.         WR_0;
  131.                                 delay(5);
  132.         WR_1;
  133.                                 delay(5);
  134.     }
  135.     for(i=0;i<8;i++)                   //写数据
  136.     {
  137.         if((DpyNum[3]<<i)&0x80)   DA_1;
  138.         else                      DA_0;
  139.                                 delay(5);
  140.         WR_0;
  141.                                 delay(5);
  142.         WR_1;
  143.                                 delay(5);
  144.     }
  145.     for(i=0;i<8;i++)                   //写数据
  146.     {
  147.         if((DpyNum[2]<<i)&0x80)   DA_1;
  148.         else                      DA_0;
  149.                                 delay(5);
  150.         WR_0;
  151.                                 delay(5);
  152.         WR_1;
  153.                                 delay(5);
  154.     }
  155.     for(i=0;i<8;i++)                   //写数据
  156.     {
  157.         if((DpyNum[1]<<i)&0x80)   DA_1;
  158.         else                      DA_0;
  159.                                 delay(5);
  160.         WR_0;
  161.                                 delay(5);
  162.         WR_1;
  163.                                 delay(5);
  164.     }
  165.     for(i=0;i<8;i++)                   //写数据
  166.     {
  167.         if((DpyNum[0]<<i)&0x80)   DA_1;
  168.         else                      DA_0;
  169.                                 delay(5);
  170.         WR_0;
  171.                                 delay(5);
  172.         WR_1;
  173.                                 delay(5);
  174.     }
  175.     CS_1;                          //释放CS
  176.                 delay(5);
  177. }

  178. void LCD_Init(void)
  179. {
  180.     COMMAND_HT1621(0x01);         //SYS EN
  181.     COMMAND_HT1621(0x03);         //LCD ON
  182.     COMMAND_HT1621(0x29);         //4 COM  1/3 BIAS
  183.     HT1621_Display();             //clear screen
  184. }
  185. /* USER CODE END PM */

  186. /* Private variables ---------------------------------------------------------*/

  187. /* USER CODE BEGIN PV */

  188. /* USER CODE END PV */

  189. /* Private function prototypes -----------------------------------------------*/
  190. void SystemClock_Config(void);
  191. static void MX_GPIO_Init(void);
  192. /* USER CODE BEGIN PFP */

  193. /* USER CODE END PFP */

  194. /* Private user code ---------------------------------------------------------*/
  195. /* USER CODE BEGIN 0 */

  196. /* USER CODE END 0 */

  197. /**
  198.   * [url=home.php?mod=space&uid=247401]@brief[/url]  The application entry point.
  199.   * @retval int
  200.   */
  201. int main(void)
  202. {
  203.   /* USER CODE BEGIN 1 */

  204.   /* USER CODE END 1 */
  205.   

  206.   /* MCU Configuration--------------------------------------------------------*/

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

  209.   /* USER CODE BEGIN Init */

  210.   /* USER CODE END Init */

  211.   /* Configure the system clock */
  212.   SystemClock_Config();

  213.   /* USER CODE BEGIN SysInit */

  214.   /* USER CODE END SysInit */

  215.   /* Initialize all configured peripherals */
  216.   MX_GPIO_Init();
  217.   /* USER CODE BEGIN 2 */

  218.   /* USER CODE END 2 */
  219.         LCD_Init();
  220.     DpyNum[0] = Smg_a|Smg_d|Smg_g;              //"三"
  221.     DpyNum[1] = SegCode[2];
  222.     DpyNum[2] = SegCode[4];
  223.     DpyNum[3] = SegCode[6];
  224.     DpyNum[4] = SegCode[8];
  225.     DpyNum[5] = SegCode[0];

  226.     HT1621_Display();   
  227.   /* Infinite loop */
  228.   /* USER CODE BEGIN WHILE */
  229.   while (1)
  230.   {
  231.     /* USER CODE END WHILE */

  232.     /* USER CODE BEGIN 3 */
  233.   }
  234.   /* USER CODE END 3 */
  235. }

  236. /**
  237.   * @brief System Clock Configuration
  238.   * @retval None
  239.   */
  240. void SystemClock_Config(void)
  241. {
  242.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  243.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  244.   /** Configure the main internal regulator output voltage
  245.   */
  246.   __HAL_RCC_PWR_CLK_ENABLE();
  247.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
  248.   /** Initializes the CPU, AHB and APB busses clocks
  249.   */
  250.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  251.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  252.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  253.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  254.   RCC_OscInitStruct.PLL.PLLM = 16;
  255.   RCC_OscInitStruct.PLL.PLLN = 192;
  256.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  257.   RCC_OscInitStruct.PLL.PLLQ = 4;
  258.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  259.   {
  260.     Error_Handler();
  261.   }
  262.   /** Initializes the CPU, AHB and APB busses clocks
  263.   */
  264.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  265.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  266.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  267.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV4;
  268.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  269.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  270.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  271.   {
  272.     Error_Handler();
  273.   }
  274. }

  275. /**
  276.   * @brief GPIO Initialization Function
  277.   * @param None
  278.   * @retval None
  279.   */
  280. static void MX_GPIO_Init(void)
  281. {
  282.   GPIO_InitTypeDef GPIO_InitStruct = {0};

  283.   /* GPIO Ports Clock Enable */
  284.   __HAL_RCC_GPIOC_CLK_ENABLE();
  285.   __HAL_RCC_GPIOF_CLK_ENABLE();
  286.   __HAL_RCC_GPIOH_CLK_ENABLE();

  287.   /*Configure GPIO pin Output Level */
  288.   HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);

  289.   /*Configure GPIO pin Output Level */
  290.   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10|GPIO_PIN_12, GPIO_PIN_RESET);

  291.   /*Configure GPIO pin : PF6 */
  292.   GPIO_InitStruct.Pin = GPIO_PIN_6;
  293.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  294.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  295.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  296.   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  297.   /*Configure GPIO pins : PC10 PC12 */
  298.   GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12;
  299.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  300.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  301.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  302.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  303. }
效果图
3.jpg
weifeng90 发表于 2025-2-18 23:08 来自手机 | 显示全部楼层
这种单色LCD的可视角确实有点低,看不清了都。
zhoupxa 发表于 2025-2-18 23:34 | 显示全部楼层
好老的段式液晶驱动芯片
xionghaoyun 发表于 2025-2-19 09:36 | 显示全部楼层
给的电压不够
xch 发表于 2025-2-19 16:10 | 显示全部楼层
挺长代码。
xch 发表于 2025-2-19 16:11 | 显示全部楼层
打字员厉害
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3535

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部