- void SPI_CONFIG()
- {
- __HAL_RCC_GPIOA_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
- GPIO_InitStruct.Pin = GPIO_PIN_5| GPIO_PIN_6| GPIO_PIN_7;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_6| GPIO_PIN_7| GPIO_PIN_9;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- }
所用引脚输出高低电平的语句定义为:
#define LCD_CS_High() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define LCD_CS_Low() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define LCD_REST_High() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)
#define LCD_REST_Low() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define LCD_DC_High() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET)
#define LCD_DC_Low() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET)
#define LCD_SDI_High() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET)
#define LCD_SDI_Low() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET)
#define LCD_SCK_High() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET)
#define LCD_SCK_Low() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET)
#define LCD_LED_High() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET)
#define LCD_LED_Low() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET)
有了前面的准备,就可以为显示驱动配置相应的模拟SPI方式数据的函数了,其内容为:
- void LCD_Writ_Bus(unsigned char com)
- {
- unsigned char uci;
- for(uci=0;uci<8;uci++)
- {
- if(com & 0x80)
- {
- LCD_SDI_High();
- }
- else
- {
- LCD_SDI_Low();
- }
- com = com << 1;
- DelayUs(1);
- LCD_SCK_Low();
- LCD_SCK_High();
- }
- }
对所用的显示屏,其初始化函数为:
实现驱动测试的以色彩填充屏幕的函数为:
- void LCD_Clear(unsigned int Color)
- {
- char VH,VL;
- unsigned int i,j;
- VH=Color>>8;
- VL=Color;
- Address_set(0,0,LCD_H-1,LCD_W-1);
- for(i=0;i<LCD_H;i++)
- {
- for (j=0;j<LCD_W;j++)
- {
- LCD_WR_DATA8(VH);
- LCD_WR_DATA8(VL);
- }
- }
- }
经测试,该驱动是有效的。
在添加字库及显示函数的基础上,即可进行字符串的显示需求。
其显示字符的函数为:
- void LCD_ShowChar(unsigned int x,unsigned int y,char num)
- {
- char temp;
- char pos,t;
- unsigned int x0=x;
- unsigned int colortemp=POINT_COLOR;
- if(x>LCD_W-16||y>LCD_H-16) return;
- num=num-' ';
- Address_set(x,y,x+8-1,y+16-1);
- for(pos=0;pos<16;pos++)
- {
- temp=asc2_1608[(unsigned int)num*16+pos];
- for(t=0;t<8;t++)
- {
- if(temp&0x01) POINT_COLOR=colortemp;
- else POINT_COLOR=BACK_COLOR;
- LCD_WR_DATA(POINT_COLOR);
- temp>>=1;
- x++;
- }
- x=x0;
- y++;
- }
- POINT_COLOR=colortemp;
- }
对应的字符串显示函数为:
- void LCD_ShowString(unsigned int x,unsigned int y,const char *p)
- {
- while(*p!='\0')
- {
- if(x>LCD_W-16){x=0;y+=16;}
- if(y>LCD_H-16){y=x=0;}
- LCD_ShowChar(x,y,*p,0);
- x+=8;
- p++;
- }
- }
进行字符串形式测试的主程序为:
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_ICACHE_Init();
- SPI_CONFIG();
- TFT_Init();
- LCD_Clear(RED);
- BACK_COLOR=RED;
- POINT_COLOR=WHITE;
- LCD_ShowString(20,20,"STM32U385RG");
- while (1);
- }
经程序的编译和下载,其测试效果如图2所示。
图2 显示效果
后续的任务是将模拟SPI发送数据的函数替换为以硬件的发送来实现,即硬件方式的显示驱动。