|
我有一点点遗憾,就是之前想过为NUCLEO配置一块屏幕,但是一直没有机会,最近有一块TFT屏幕,型号是ILI9225,在KEIL下先编写驱动程序,是初始化,然后写命令,写数据,最后在设置屏幕的寄存器。 void LCD_GPIO_Init(void) {# P% V" Q! ]- A8 D, ]2 N m; ^ 8 H0 v4 P1 N. r4 i5 Q2 i GPIO_InitTypeDef GPIO_InitStructure;$ p8 d& R, F' i' Q " D& Q; ~2 z8 @. T0 I RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB ,ENABLE);8 t. a/ Q, g7 q -----可以看到我的IO口是B9,B10,B11,B12,B13,B14,B153 ^$ `3 j- ^1 ~7 k1 P4 L. m GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ~* Y: Y r; S ^, i; E/ c GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;) ] x+ Z! F! L" _( F GPIO_Init(GPIOB, &GPIO_InitStructure); } void SPIv_WriteData(u8 Data) {//STM32_模拟SPI读写一个字节数据底层函数+ \" N7 {5 Z1 U: X# n; d unsigned char i=0;2 c6 Q. \4 g! p- w& { K2 S+ J for(i=8;i>0;i--) { if(Data&0x80) LCD_SDA_SET; //输出数据 else LCD_SDA_CLR;. L4 R8 M- e" G4 b //LCD_SDA -----> GPIO_Pin_15/ & v! `8 {5 c+ W //LCD_SDA_SET----> LCD_CTRL->BSRR=LCD_SDA; \+ a' O# E# O! B; Q LCD_SCL_CLR; LCD_SCL_SET;$ O' C! T# o$ N1 Z- R- L Data<<=1; }9 I4 j/ E% [4 P: I- N$ G }6 }* |! e! a# ~2 ?) U8 T 1 A* u# O. l6 \% r void Lcd_WriteIndex(u8 Index)9 X0 W1 T, h- F2 R+ T( D0 N { l' ^0 `8 g- \" Z* U' Z LCD_CS_CLR;# v. Z0 |* A) j" Z/ z* ?: [ LCD_RS_CLR;+ e4 l- L/ M M* O0 [ [/ F2 m #if USE_HARDWARE_SPI SPI_WriteByte(SPI2,Index);- O' {4 K r! O& N #else SPIv_WriteData(Index);4 j5 X: g4 W& V0 D+ h #endif i! p/ i1 j6 m& A LCD_CS_SET; }- U1 E4 X. k% h6 Q9 n' p1 ]- ` //LCD写命令字,根据ILI9225的读写时序完成,与网上已有资料一致 这个是写数据,所有液晶屏都是一样的,只是协议有不同,我的是SPI 按照SPI标准硬件读写协议完成的!像12864之类的协议就有I2C等等。 void Lcd_WriteData(u8 Data)1 e( _# ] ]) _ { LCD_CS_CLR; LCD_RS_SET; #if USE_HARDWARE_SPI % V) ?7 c2 q7 X SPI_WriteByte(SPI2,Data); #else SPIv_WriteData(Data); #endif LCD_CS_SET;5 M; C& F3 z6 |3 z" a } Lcd_Init函数每个液晶屏幕根据其控制芯片的不同也有不一样的写命令,数据组合) E* S$ d x) v$ R1 F% s: u& V 我的ILI9225与其他的液晶屏幕的初始化,设置位置当然有所区别- o1 V" g; }! T+ t* L //LCD Init For 2.2inch LCD Panel with ILI9225. LCD_WriteReg(0x10, 0x0000); // Set SAP,DSTB,STB LCD_WriteReg(0x11, 0x0000); // Set APON,PON,AON,VCI1EN,VC LCD_WriteReg(0x12, 0x0000); // Set BT,DC1,DC2,DC3: W6 Y2 f' Q- i) m3 D8 G3 o LCD_WriteReg(0x13, 0x0000); // Set GVDD+ C6 r( [% F( x* `$ V. v LCD_WriteReg(0x14, 0x0000); // Set VCOMH/VCOML voltage delay_ms(40); // Delay 20 ms8 B1 Q2 X& v* j6 c( `0 { X // Please follow this power on sequence6 m! W* A; p+ Y1 U LCD_WriteReg(0x11, 0x0018); // Set APON,PON,AON,VCI1EN,VC LCD_WriteReg(0x12, 0x1121); // Set BT,DC1,DC2,DC3 LCD_WriteReg(0x13, 0x0063); // Set GVDD LCD_WriteReg(0x14, 0x3961); // Set VCOMH/VCOML voltage$ ?! I- ?! \# ^6 c LCD_WriteReg(0x10, 0x0800); // Set SAP,DSTB,STB" a8 v6 Z4 S$ z& U0 O" d7 r delay_ms(10); // Delay 10 ms LCD_WriteReg(0x11, 0x1038); // Set APON,PON,AON,VCI1EN,VC delay_ms(30); // Delay 30 ms 7 m7 T* M6 g0 j" O( H# T LCD_WriteReg(0x02, 0x0100); // set 1 line inversion等等,由于发帖长度限制,这里就写一下一部分吧。* s' y9 G4 k( ` 2 l1 c# F. q6 g5 x 接着我会开一个贴写我在MBED上面是怎么样写SPI来驱动我的ILI9225的 |
微信公众号
手机版
没成功,所以换用模拟的SPI,
可以参考下F4的SPI设置问题,我是用的F4的板子 不知道你用的什么板子 可能是用的F3的 这样的话SPI的配置就大差不差了 我这个程序里面还加了文件操作系统 对于需要外扩大容量的SD卡很有帮助,另外还添加了长文件名支持,这样就有点耗内存了 所以我上传了两个版本,你可以拿去参考下
https://www.stmcu.org.cn/module/forum/thread-599839-1-1.html