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一定要接个电阻….不然你会一直以为你失败了,直到你从上方看自己的液晶屏….别问我怎么知道的…








12条评论