stm32–使用GPIO驱动1608液晶屏
初学stm32,同时手中还有一块51板子给的1602液晶屏,于是打算写个(误)小程序来驱动。
1602字符型LCD简介
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
1602LCD主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表所示:
编号 | 符号 | 引脚说明 | 编号 | 符号 | 引脚说明 |
1 | VSS | 电源地 | 9 | D2 | 数据 |
2 | VDD | 电源正极 | 10 | D3 | 数据 |
3 | VL | 液晶显示偏压 | 11 | D4 | 数据 |
4 | RS | 数据/命令选择 | 12 | D5 | 数据 |
5 | R/W | 读/写选择 | 13 | D6 | 数据 |
6 | E | 使能信号 | 14 | D7 | 数据 |
7 | D0 | 数据 | 15 | BLA | 背光源正极 |
8 | D1 | 数据 | 16 | BLK | 背光源负极 |
顺便附上指令库
1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:
序号 | 指令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
1 | 清显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2 | 光标返回 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * |
3 | 置输入模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
4 | 显示开/关控制 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
5 | 光标或字符移位 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | * | * |
6 | 置功能 | 0 | 0 | 0 | 0 | 1 | DL | N | F | * | * |
7 | 置字符发生存贮器地址 | 0 | 0 | 0 | 1 | 字符发生存贮器地址 | |||||
8 | 置数据存贮器地址 | 0 | 0 | 1 | 显示数据存贮器地址 | ||||||
9 | 读忙标志或地址 | 0 | 1 | BF | 计数器地址 | ||||||
10 | 写数到CGRAM或DDRAM) | 1 | 0 | 要写的数据内容 | |||||||
11 | 从CGRAM或DDRAM读数 | 1 | 1 | 读出的数据内容 |
10.8.2.5 1602LCD的一般初始化(复位)过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
好了,有了这些信息基本上可以写一个程序来驱动这个屏幕了(内置字符和地址啥的不放啦,再放过来太多了)
我使用的开发板是在购买元件时候随便买的,很小的板子芯片是STM32F103VET6 (大小参考旁边的stlink仿真器)
我们学习的是cube库,老库已经不更新了,所以学习新库。
这个板子的一行的io口并不是连续的…于是我随便插上了一行,这导致我写io的时候造成了很大的不便从io包括了C、A、B、E
一开始我给液晶屏的供电使用的是板子得高低电平,但是这个控制器工作电压是5v,导致我并不能驱动,后来借到了杜板线后我使用仿真器的5v来供电。
由于使用的是gpio,所以我无法从液晶屏中读取忙信号,所以我采用较长延时的方式来处理。而且我并不需要知道当前显示的信息。所以不能读取并无大碍。
然后开始新建工程,可视化的cube使这一步相当的便利,选好片子,仿真方式,配置好时钟,将GPIO使能…
然后输出到Keil uVision5开始写代码,由于我是直接靠控制GPIO的高低电平来写的,所以极度复杂(尽管我已经做了封装):
主函数:
/* USER CODE BEGIN 0 */ void GPIO_1602_OUTPUT(unsigned char CMD); void RESET_1602(void); /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET); /*v0 ¶Ô±È¶È ¸ßµçƽ¸ß*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); /*rs Êý¾Ý¼Ä´æÆ÷+ Ö¸Áî¼Ä´æÆ÷-*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); /*rw ¶Á+ д-*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); /*D0 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); /*D1 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*D2 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET); /*D3 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_RESET); /*D4 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*D5 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_RESET); /*D6 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET); /*D7 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11, GPIO_PIN_SET); /*A±³¹â+*/ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET); /*K±³¹â-*/ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ //³õʼ»¯ RESET_1602(); HAL_Delay(1); //01001100 L HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); /*rs Êý¾Ý¼Ä´æÆ÷+ Ö¸Áî¼Ä´æÆ÷-*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); /*D0 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); /*D1 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); /*D2 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); /*D3 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_RESET); /*D4 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*D5 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET); /*D6 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET); /*D7 */ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); //01011001 Y HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); /*rs Êý¾Ý¼Ä´æÆ÷+ Ö¸Áî¼Ä´æÆ÷-*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); /*D0 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); /*D1 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*D2 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); /*D3 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_SET); /*D4 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*D5 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET); /*D6 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET); /*D7 */ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ //01010000 P HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); /*rs Êý¾Ý¼Ä´æÆ÷+ Ö¸Áî¼Ä´æÆ÷-*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); /*D0 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); /*D1 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*D2 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET); /*D3 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_SET); /*D4 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*D5 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET); /*D6 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET); /*D7 */ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); //01001000 H HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); /*rs Êý¾Ý¼Ä´æÆ÷+ Ö¸Áî¼Ä´æÆ÷-*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); /*D0 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); /*D1 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*D2 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); /*D3 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_RESET); /*D4 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*D5 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET); /*D6 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET); /*D7 */ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); //01001001 I HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); /*rs Êý¾Ý¼Ä´æÆ÷+ Ö¸Áî¼Ä´æÆ÷-*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); /*D0 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); /*D1 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*D2 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); /*D3 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_RESET); /*D4 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*D5 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET); /*D6 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET); /*D7 */ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); //01011000 X HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); /*rs Êý¾Ý¼Ä´æÆ÷+ Ö¸Áî¼Ä´æÆ÷-*/ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); /*D0 */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); /*D1 */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*D2 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); /*D3 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_SET); /*D4 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*D5 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET); /*D6 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET); /*D7 */ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); HAL_Delay(1000); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Configuration */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __GPIOC_CLK_ENABLE(); __GPIOA_CLK_ENABLE(); __GPIOB_CLK_ENABLE(); __GPIOE_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3|GPIO_PIN_5, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1|GPIO_PIN_11|GPIO_PIN_13, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_13 |GPIO_PIN_15, GPIO_PIN_RESET); /*Configure GPIO pins : PC3 PC5 */ GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pins : PA1 PA3 PA5 PA7 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_5|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PB1 PB11 PB13 */ GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_11|GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pins : PE7 PE9 PE11 PE13 PE15 */ GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_13 |GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ void GPIO_1602_OUTPUT(unsigned char CMD) { int c[8],i=0; for(i=0;i<8;i++) { c[i]=0; } i=0; do { c[i++]=CMD%2; CMD/=2; } while(CMD!=0) ; if(c[0]==1) //D0 { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); } else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); } if(c[1]==1) //D1 { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_SET); /*D1 */ } else { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_5, GPIO_PIN_RESET); /*D1 */ } if(c[2]==1) //D2 { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); /*D2 */ } else { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*D2 */ } if(c[3]==1) //D3 { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET); /*D3 */ } else { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET); /*D3 */ } if(c[4]==1) //D4 { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_SET); /*D4 */ } else { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_RESET); /*D4 */ } if(c[5]==1) //D5 { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET); /*D5 */ } else { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*D5 */ } if(c[6]==1) //D6 { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_SET); /*D6 */ } else { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_13, GPIO_PIN_RESET); /*D6 */ } if(c[7]==1) //D7 { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_SET); /*D7 */ } else { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, GPIO_PIN_RESET); /*D7 */ } HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); /*E ʹÄÜ + -> -Ö´ÐÐ*/ HAL_Delay(1); } void RESET_1602(void) { HAL_Delay(15); GPIO_1602_OUTPUT(0x38); HAL_Delay(1); GPIO_1602_OUTPUT(0x38); HAL_Delay(1); GPIO_1602_OUTPUT(0x38); GPIO_1602_OUTPUT(0x38); GPIO_1602_OUTPUT(0x1); GPIO_1602_OUTPUT(0x6); GPIO_1602_OUTPUT(0xc); } /* USER CODE END 4 */
最后选择stlink,烧录进片子….
如果你认真的看了我的代码,那么你一定会想从46行到129行都是什么鬼 ,其实就是输出高低电平让显示屏大触LYPHIX几个字。
那么我已经封装起来了为什么不直接调用呢?理由很简单:
当我封装好了之后,班导看了下跟我说:你没必要继续写了,你通过GPIO让他显示出来说明已经明白原理了,回头用SPI通讯写吧。
不过后来我发现这个1602并没有SPI,只有并行通讯,于是我又买了12846液晶屏,敬请期待….
最后放个成功的图
最后:VL一定要接个电阻….不然你会一直以为你失败了,直到你从上方看自己的液晶屏….别问我怎么知道的…