大家好,又见面了,我是你们的朋友全栈君。
1、配置GPIO口
void LCD_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/* ????IO??*/
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_AFIO, ENABLE );
/*开启GPIOD的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
/* 配置FSMC相对应的数据线,FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10 */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure );
/* ??FSMC???????
* PD4-FSMC_NOE :LCD-RD
* PD5-FSMC_NWE :LCD-WR
* PD7-FSMC_NE1 :LCD-CS
* PD11-FSMC_A16 :LCD-DC
*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init (GPIOD, & GPIO_InitStructure );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init (GPIOD, & GPIO_InitStructure );
// ST7789_CS_APBxClock_FUN ( ST7789_CS_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = ST7789_CS_PIN;
GPIO_Init ( ST7789_CS_PORT, & GPIO_InitStructure );
// ST7789_DC_APBxClock_FUN ( ST7789_DC_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = ST7789_DC_PIN;
GPIO_Init ( ST7789_DC_PORT, & GPIO_InitStructure );
/* ??LCD??RST????*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// ST7789_RST_APBxClock_FUN ( ST7789_RST_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = ST7789_RST_PIN;
GPIO_Init ( ST7789_RST_PORT, & GPIO_InitStructure );
/* ??LCD??????BK*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// ST7789_BK_APBxClock_FUN ( ST7789_BK_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = ST7789_BK_PIN;
GPIO_Init ( ST7789_BK_PORT, & GPIO_InitStructure );
//IO????????
GPIO_SetBits ( ST7789_RST_PORT, ST7789_RST_PIN );
GPIO_SetBits ( ST7789_CS_PORT, ST7789_CS_PIN );
GPIO_SetBits ( ST7789_DC_PORT, ST7789_DC_PIN );
GPIO_SetBits ( ST7789_BK_PORT, ST7789_BK_PIN );
}
/*函数名:LCD_CmdWrite
*功 能:向LCD控制器写命令号
*返回值:无
*参 数:u8 cmd命令号
*/
void LCD_CmdWrite(u8 cmd)
{
// u16 num=0;
LCD_RSL;
LCD_CSL;
LCD_RDH;
// num=cmd;
// num |=((GPIOD->ODR)&0xFF00);
// GPIOD->ODR =num;
LCD_D0_WRITE(cmd);
LCD_D1_WRITE(cmd);
LCD_D2_WRITE(cmd);
LCD_D3_WRITE(cmd);
LCD_D4_WRITE(cmd);
LCD_D5_WRITE(cmd);
LCD_D6_WRITE(cmd);
LCD_D7_WRITE(cmd);
LCD_WRL;
LCD_WRH;
LCD_CSH;
LCD_RSH;
}
/*函数名:LCD_DataWrite
*功 能:向LCD控制器写命令参数
*返回值:无
*参 数:u8 data 要写入的数据
*/
void LCD_DataWrite(u8 data)
{
// u16 num=0;
LCD_RSH;
LCD_CSL;
LCD_RDH;
// num=data;
// num |=((GPIOD->ODR)&0xFF00);
// (GPIOD->ODR) =num;
LCD_D0_WRITE(data);
LCD_D1_WRITE(data);
LCD_D2_WRITE(data);
LCD_D3_WRITE(data);
LCD_D4_WRITE(data);
LCD_D5_WRITE(data);
LCD_D6_WRITE(data);
LCD_D7_WRITE(data);
LCD_WRL;
LCD_WRH;
LCD_CSH;
}
/*函数名:LCD_Reset
*功 能:复位TFT屏
*参 数:无
*返回值:无
*/
static void LCD_Reset(void)
{
//************* Reset LCD Driver ****************//
LCD_RSTH;
Delayms(1); // Delayms 1ms
LCD_RSTL;
Delayms(10); // Delayms 10ms // This delay time is necessary
LCD_RSTH;
Delayms(120); // Delayms 120 ms
}
2、屏初始化
/*函数名:LCDInit
*功 能:初始化TFT屏
*参 数:无
*返回值:无
*/
void LCD_Init(void)
{
//************* Reset LCD Driver ****************//
LCD_GPIO_Config();
LCD_Reset();
//++++++++++ initializing funciton 1 +++++++++++++++++
//—————————————————————————————————//
LCD_CmdWrite(0x11);
Delay(120); //Delay 120ms
//——————————display and color format setting——————————–//
LCD_CmdWrite(0x36);
LCD_DataWrite(0x60);//0x60
LCD_CmdWrite(0x3A);
LCD_DataWrite(0x05);
//——————————–ST7789V Frame rate setting———————————-//
LCD_CmdWrite(0xB2);
LCD_DataWrite(0x0C);
LCD_DataWrite(0x0C);
LCD_DataWrite(0x00);
LCD_DataWrite(0x33);
LCD_DataWrite(0x33);
LCD_CmdWrite(0xB7);
LCD_DataWrite(0x35);
//———————————ST7789V Power setting————————————–//
LCD_CmdWrite(0xBB);
LCD_DataWrite(0x19);//0x1c
LCD_CmdWrite(0xC0);
LCD_DataWrite(0x2C);
LCD_CmdWrite(0xC2);
LCD_DataWrite(0x01);
LCD_CmdWrite(0xC3);
LCD_DataWrite(0x12);//0x0b
LCD_CmdWrite(0xC4);
LCD_DataWrite(0x20);
LCD_CmdWrite(0xC6);
LCD_DataWrite(0x0F);
LCD_CmdWrite(0xD0);
LCD_DataWrite(0xA4);
LCD_DataWrite(0xA1);
//——————————–ST7789V gamma setting—————————————//
LCD_CmdWrite(0xE0);
LCD_DataWrite(0xd0);
LCD_DataWrite(0x00);//0x00
LCD_DataWrite(0x03);//0x03
LCD_DataWrite(0x09);//0x09
LCD_DataWrite(0x13);
LCD_DataWrite(0x1c);//0x1c
LCD_DataWrite(0x3a);//0x3a
LCD_DataWrite(0x55);//0x55
LCD_DataWrite(0x48);//0x48
LCD_DataWrite(0x18);
LCD_DataWrite(0x12);//0x12
LCD_DataWrite(0x0e);//0x0e
LCD_DataWrite(0x19);//0x19
LCD_DataWrite(0x1e);//0x1e
LCD_CmdWrite(0xE1);
LCD_DataWrite(0xd0);
LCD_DataWrite(0x00);//0x00
LCD_DataWrite(0x03);//0x03
LCD_DataWrite(0x09);//0x09
LCD_DataWrite(0x05);//0x05
LCD_DataWrite(0x25);//0x25
LCD_DataWrite(0x3a);//0x3a
LCD_DataWrite(0x55);//0x55
LCD_DataWrite(0x50);//0x50
LCD_DataWrite(0x3d);//0x3d
LCD_DataWrite(0x1c);//0x1c
LCD_DataWrite(0x1d);//0x1d
LCD_DataWrite(0x1d);//0x1d
LCD_DataWrite(0x23);//0x23
LCD_CmdWrite(0x29); //display on
LCD_CmdWrite(0x2C); // Memory Write
LCD_Clear(BLACK);
}
3、写屏操作
void LCD_Clear(u16 Color)
{
u32 i;
Lcd_SetBox(0,0,320,240);
for(i=0;i<78900;i++){ //78900
LCD_WriteOneDot(Color);
}
}
void LCD_WriteOneDot(u16 color)
{
LCD_DataWrite(color>>8);
LCD_DataWrite(color);
}
写ASCII 16×16字符操作,这是写
static void LCD_write_acsii16x16(u8 data,u16 color,u16 xcolor ,u8 mode)//写字符
{
u8 i=0,j=0,n=0;
u8 avl=0;
data -=0x20;
for (i=0;i<16;i++)
{
avl=asc2_1608[data][i];
for (j=0;j<8;j++)
{
n++;
if(avl&0x80)LCD_WriteOneDot(color);
else if(mode==0) LCD_WriteOneDot(xcolor);
avl<<=1;
if(n>15) {
n=0;
break;
}//部分字体如英文16*16,形成的字库3个8位一组,每一组最后4位不显示,用该语句进行判断有几位不需要显示
}
}
}
这是写英文字符的函数,但是写汉字则要将字体大小增加一倍,即32点阵大小。
void LCD_write_english_string(u16 x, u16 y, char *str,u8 mode)//英文字符串显示
{
u16 k = 0;
while ((*str<=’~’)&&(*str>=’ ‘))
{
Lcd_SetBox(x-k,y,16,16);
LCD_write_acsii16x16( *str,WORDCOLOR,BACKCOLOR, mode);
k+=16;
str++;
}
}
4、写英文字符当超过16点阵大小后,还按这种写入方法就会有问题,显示的字符是错误的。
比如写入40*32的大小的点阵字符,先用字模工具PCtoLCD2002.exe生成字模,逐列显示(逐行的话有会有问题)
将 Lcd_SetBox(x-k,y,16,16);函数去掉,循环的长度有16改为80,或其它生成的字模的长度。
使用更改后的方法写入字符,显示就OK了
5、清除或写入一个区域的块
void Lcd_ColorBox(u16 xStart,u16 yStart,u16 xlong,u16 ylong,u16 Color)
{
u32 i,j;
j=xlong*ylong;
Lcd_SetBox(xStart,yStart,xlong,ylong);
for(i=0;i<j;i++){
LCD_WriteOneDot(Color);
}
}
xlong,ylong为要显示或清除块的大小
这是在取字模显示的时候,遇到的一点问题,有其它方法的可以贴出来一起探讨一下
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128276.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...