本帖最后由 qjp1988113 于 2021-11-24 15:36 编辑
今天有空测试下手头的ST7780_240X240_LCD,一款小的LCD~
W806的HAL开发真的很不错,用过32的很容易上手并且代码也容易移植~
我们选择连接W806的LSPI接口,为下面的硬件SPI做准备~
连接引脚:
/****************************************
* SPI-TFT LCD For W806 BOARD(LSPI)
* GND -------------- GND
* VCC -------------- 3.3V
* SCL -------------- PB1
* SDA -------------- PA7
* RES -------------- PB27
* DC -------------- PB3
* BLC -------------- PB2
* ***************************************/
我们定义引脚:
- //-----------------LCD端口定义----------------
- #define LCD_SCLK_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET)//SCL=SCLK
- #define LCD_SCLK_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET)
- #define LCD_MOSI_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET)//SDA=MOSI
- #define LCD_MOSI_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET)
- #define LCD_RES_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_27, GPIO_PIN_RESET)//RES
- #define LCD_RES_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_27, GPIO_PIN_SET)
- #define LCD_DC_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET)//DC
- #define LCD_DC_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET)
- #define LCD_BLK_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET)//BLK
- #define LCD_BLK_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET)
复制代码
编写软件SPI的写:
- /******************************************************************************
- 函数说明:LCD串行数据写入函数
- 入口数据:dat 要写入的串行数据
- 返回值: 无
- ******************************************************************************/
- void LCD_Writ_Bus(u8 dat)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- LCD_SCLK_Clr();
- if(dat&0x80)
- {
- LCD_MOSI_Set();
- }
- else
- {
- LCD_MOSI_Clr();
- }
- LCD_SCLK_Set();
- dat<<=1;
- }
- }
- /******************************************************************************
- 函数说明:LCD写入数据
- 入口数据:dat 写入的数据
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_DATA8(u8 dat)
- {
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函数说明:LCD写入数据
- 入口数据:dat 写入的数据
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_DATA(u16 dat)
- {
- LCD_Writ_Bus(dat>>8);
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函数说明:LCD写入命令
- 入口数据:dat 写入的命令
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_REG(u8 dat)
- {
- LCD_DC_Clr();//写命令
- LCD_Writ_Bus(dat);
- LCD_DC_Set();//写数据
- }
复制代码
然后我们就可以查LCD芯片ST7789 编写对于的指令了~
lcd_Init.c
- #include "lcd_init.h"
- #include "sys.h"
- void LCD_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
-
- __HAL_RCC_GPIO_CLK_ENABLE();
- GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3|GPIO_PIN_27;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;
- //GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3|GPIO_PIN_27, GPIO_PIN_SET);
-
- GPIO_InitStruct.Pin = GPIO_PIN_7;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);
- }
- /******************************************************************************
- 函数说明:LCD串行数据写入函数
- 入口数据:dat 要写入的串行数据
- 返回值: 无
- ******************************************************************************/
- void LCD_Writ_Bus(u8 dat)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- LCD_SCLK_Clr();
- if(dat&0x80)
- {
- LCD_MOSI_Set();
- }
- else
- {
- LCD_MOSI_Clr();
- }
- LCD_SCLK_Set();
- dat<<=1;
- }
- }
- /******************************************************************************
- 函数说明:LCD写入数据
- 入口数据:dat 写入的数据
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_DATA8(u8 dat)
- {
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函数说明:LCD写入数据
- 入口数据:dat 写入的数据
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_DATA(u16 dat)
- {
- LCD_Writ_Bus(dat>>8);
- LCD_Writ_Bus(dat);
- }
- /******************************************************************************
- 函数说明:LCD写入命令
- 入口数据:dat 写入的命令
- 返回值: 无
- ******************************************************************************/
- void LCD_WR_REG(u8 dat)
- {
- LCD_DC_Clr();//写命令
- LCD_Writ_Bus(dat);
- LCD_DC_Set();//写数据
- }
- /******************************************************************************
- 函数说明:设置起始和结束地址
- 入口数据:x1,x2 设置列的起始和结束地址
- y1,y2 设置行的起始和结束地址
- 返回值: 无
- ******************************************************************************/
- void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
- {
- if(USE_HORIZONTAL==0)
- {
- LCD_WR_REG(0x2a);//列地址设置
- LCD_WR_DATA(x1);
- LCD_WR_DATA(x2);
- LCD_WR_REG(0x2b);//行地址设置
- LCD_WR_DATA(y1);
- LCD_WR_DATA(y2);
- LCD_WR_REG(0x2c);//储存器写
- }
- else if(USE_HORIZONTAL==1)
- {
- LCD_WR_REG(0x2a);//列地址设置
- LCD_WR_DATA(x1);
- LCD_WR_DATA(x2);
- LCD_WR_REG(0x2b);//行地址设置
- LCD_WR_DATA(y1+80);
- LCD_WR_DATA(y2+80);
- LCD_WR_REG(0x2c);//储存器写
- }
- else if(USE_HORIZONTAL==2)
- {
- LCD_WR_REG(0x2a);//列地址设置
- LCD_WR_DATA(x1);
- LCD_WR_DATA(x2);
- LCD_WR_REG(0x2b);//行地址设置
- LCD_WR_DATA(y1);
- LCD_WR_DATA(y2);
- LCD_WR_REG(0x2c);//储存器写
- }
- else
- {
- LCD_WR_REG(0x2a);//列地址设置
- LCD_WR_DATA(x1+80);
- LCD_WR_DATA(x2+80);
- LCD_WR_REG(0x2b);//行地址设置
- LCD_WR_DATA(y1);
- LCD_WR_DATA(y2);
- LCD_WR_REG(0x2c);//储存器写
- }
- }
- void LCD_Init(void)
- {
- LCD_GPIO_Init();//初始化GPIO
-
- LCD_RES_Clr();//复位
- delay_ms(100);
- LCD_RES_Set();
- delay_ms(100);
-
- LCD_BLK_Set();//打开背光
- delay_ms(100);
-
- //************* Start Initial Sequence **********//
- LCD_WR_REG(0x11); //Sleep out
- delay_ms(120); //Delay 120ms
- //************* Start Initial Sequence **********//
- LCD_WR_REG(0x36);
- if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
- else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
- else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
- else LCD_WR_DATA8(0xA0);
- LCD_WR_REG(0x3A);
- LCD_WR_DATA8(0x05);
- LCD_WR_REG(0xB2);
- LCD_WR_DATA8(0x0C);
- LCD_WR_DATA8(0x0C);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x33);
- LCD_WR_DATA8(0x33);
- LCD_WR_REG(0xB7);
- LCD_WR_DATA8(0x35);
- LCD_WR_REG(0xBB);
- LCD_WR_DATA8(0x19);
- LCD_WR_REG(0xC0);
- LCD_WR_DATA8(0x2C);
- LCD_WR_REG(0xC2);
- LCD_WR_DATA8(0x01);
- LCD_WR_REG(0xC3);
- LCD_WR_DATA8(0x12);
- LCD_WR_REG(0xC4);
- LCD_WR_DATA8(0x20);
- LCD_WR_REG(0xC6);
- LCD_WR_DATA8(0x0F);
- LCD_WR_REG(0xD0);
- LCD_WR_DATA8(0xA4);
- LCD_WR_DATA8(0xA1);
- LCD_WR_REG(0xE0);
- LCD_WR_DATA8(0xD0);
- LCD_WR_DATA8(0x04);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x11);
- LCD_WR_DATA8(0x13);
- LCD_WR_DATA8(0x2B);
- LCD_WR_DATA8(0x3F);
- LCD_WR_DATA8(0x54);
- LCD_WR_DATA8(0x4C);
- LCD_WR_DATA8(0x18);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x0B);
- LCD_WR_DATA8(0x1F);
- LCD_WR_DATA8(0x23);
- LCD_WR_REG(0xE1);
- LCD_WR_DATA8(0xD0);
- LCD_WR_DATA8(0x04);
- LCD_WR_DATA8(0x0C);
- LCD_WR_DATA8(0x11);
- LCD_WR_DATA8(0x13);
- LCD_WR_DATA8(0x2C);
- LCD_WR_DATA8(0x3F);
- LCD_WR_DATA8(0x44);
- LCD_WR_DATA8(0x51);
- LCD_WR_DATA8(0x2F);
- LCD_WR_DATA8(0x1F);
- LCD_WR_DATA8(0x1F);
- LCD_WR_DATA8(0x20);
- LCD_WR_DATA8(0x23);
- LCD_WR_REG(0x21);
- LCD_WR_REG(0x29);
- }
复制代码
其他LCD绘图及显示字符图片的略。。。见附件工程~
我们在main函数里面调用:
- int main(void)
- {
- u8 i,j;
- float t=0;
- SystemClock_Config(CPU_CLK_160M);
- printf("enter mainrn");
- HAL_Init();
- LED_KEY_Init();
-
- LCD_Init();//LCD初始化
- LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
-
- LED0_ON();
- while (1)
- {
- LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
- LCD_ShowChinese24x24(0,0,"电",RED,WHITE,24,0);//电子发烧友论坛
- LCD_ShowChinese24x24(0+24,0,"子",RED,WHITE,24,0);//电子发烧友论坛
- LCD_ShowChinese24x24(0+24*2,0,"无",RED,WHITE,24,0);//电子发烧友论坛
- LCD_ShowChinese24x24(0+24*3,0,"烧",RED,WHITE,24,0);//电子发烧友论坛
- LCD_ShowChinese24x24(0+24*4,0,"友",RED,WHITE,24,0);//电子发烧友论坛
- LCD_ShowChinese24x24(0+24*5,0,"论",RED,WHITE,24,0);//电子发烧友论坛
- LCD_ShowChinese24x24(0+24*6,0,"坛",RED,WHITE,24,0);//电子发烧友论坛
-
- LCD_ShowString(0,40,"LCD_W:",RED,WHITE,16,0);
- LCD_ShowIntNum(48,40,LCD_W,3,RED,WHITE,16);
- LCD_ShowString(80,40,"LCD_H:",RED,WHITE,16,0);
- LCD_ShowIntNum(128,40,LCD_H,3,RED,WHITE,16);
- LCD_ShowString(80,40,"LCD_H:",RED,WHITE,16,0);
- LCD_ShowString(0,70,"Increaseing Nun:",RED,WHITE,16,0);
- LCD_ShowFloatNum1(128,70,t,4,RED,WHITE,16);
- LCD_ShowString(0,86+8,(u8*)"qjp1988113 @ bbs-elecfans",RED,WHITE,16,0);//86+16=102
- t+=0.11;
- for(j=0;j<3;j++)
- {
- for(i=0;i<6;i++)
- {
- LCD_ShowPicture(40*i,120+j*40,40,40,gImage_1);
- }
- }
- delay_ms(2000);
- LCD_ShowPicture(0,0,240,240,gImage_2);
- delay_ms(2000);
- LCD_ShowPicture(0,0,240,240,gImage_3);
- delay_ms(2000);
- LCD_ShowPicture(0,0,240,240,gImage_4);
- delay_ms(2000);
- }
-
- return 0;
- }
复制代码
工程结构:
我们编译好,并下载:
|