|
花了一下午时间写完并且测试我的程序,现在共享出来补给一下 #include "mbed.h" 9 f5 L, E1 w; N* X SPI device(SPI_MOSI, SPI_MISO, SPI_SCK);! G6 R0 u" B8 H( R. F: ?
其中SPI_MOSI对应你的开发板上面的默认的MOSI,MISO,SCK引脚. }- y8 }/ c% L" \4 d5 s
//这是我的板子上面的引脚分布图,SPI协议引脚都有在上面 typedef unsigned char uchar;) ]! S3 q ~# F. T1 x typedef unsigned int uint;7 K. H5 N" H8 m) Q8 i% | DigitalOut rs(D10);+ y t; o# s/ H7 o$ G8 \ //RS,是这种液晶屏幕的一个重要引脚,也常常标记为PC {7 f7 {, i5 p7 {0 Z& T8 G DigitalOut cs(D9); //CS与片选使能还是有一定区别6 ^+ S; P- S$ d: M* v8 X DigitalOut reset(D8); //RESET复位引脚 uchar bitdata; void delay(uint t); 8 a) z6 O, l8 _) u 延时函数 void delay(uint time)5 ^2 S0 P+ z+ T { uint i,j; for(i=0;i<time;i++) for(j=0;j<2500;j++);, K3 U6 L3 H9 O; _; A } 写命令 void write_command(uchar c)6 k" R3 b, `$ @$ X, u1 D {5 O$ b+ p0 x, E8 E+ _ v+ i cs=0;! r- m3 f9 e- a' l7 }, G rs=0;. o- @3 [/ k8 w) K$ X bitdata=c; device.write(bitdata);& ?' z, S/ Q7 g3 J. X- b2 A7 @ cs=1; 5 ^" j6 V% L: o, Y2 m5 c2 i } 写数据 void write_data(uchar d) {' y6 B: \: k; u5 N cs=0; rs=1; bitdata=d;$ ]8 r) g9 N) @! y device.write(bitdata);/ e @* U7 i. x! a6 } cs=1; } 写16位数据7 z1 _. p5 P4 t( K/ b. F void wr_com16(unsigned char i,unsigned char j) ) D d6 E$ I, ?% v+ B o- J8 ^ { 2 X, D: J- M9 J9 ] cs=0; rs=1;' i; ]5 G* [) ~! { bitdata=i;+ O/ u* h, I4 J8 L( S device.write(bitdata);! [" s9 o" Z1 X: {" F9 q4 u+ U3 n cs=1; + F! W! Y7 R# w a! J# o cs=0;! w* n4 E9 O9 I* k: v( u! ^ rs=1; bitdata=j;- o' e% c4 y! p H device.write(bitdata); cs=1; 9 y' a" `2 K$ e9 |. m3 x/ C& ^ 8 @% D, l3 ^$ O/ B/ M6 n: x! J }% F, u; y6 V8 Z6 U% r! O 写命令与数据 void LCD_Write_COM_DATA(uchar i,uint j) { ( d5 U" h- R) _4 |6 M) e0 @ write_command(i);) h( h( }, |& Z, X; O( v" K wr_com16(j>>8,j);: f; W( k, `* @4 _# G$ Y } 8 I. u" `) A/ m8 _$ j: \! l 初始化液晶屏幕 void lcd_initial() {+ Z9 I/ o: _' c* ] reset=0;; Q1 x( r* D: p+ J5 y) x delay(100);3 I: t) d. U3 K7 f' g. [0 V reset=1; delay(100); LCD_Write_COM_DATA(0x10, 0x0000); // Set SAP,DSTB,STB LCD_Write_COM_DATA(0x11, 0x0000); // Set APON,PON,AON,VCI1EN,VC LCD_Write_COM_DATA(0x12, 0x0000); // Set BT,DC1,DC2,DC34 o- K$ S: O! T+ ?0 m LCD_Write_COM_DATA(0x13, 0x0000); // Set GVDD# Y7 ~" e: m ?$ D7 U- | LCD_Write_COM_DATA(0x14, 0x0000); // Set VCOMH/VCOML voltage delay(40); // Delay 20 ms // Please follow this power on sequence& \, x" Z. B2 k/ p LCD_Write_COM_DATA(0x11, 0x0018); // Set APON,PON,AON,VCI1EN,VC8 [; n w5 }# G: d5 N5 R6 T LCD_Write_COM_DATA(0x12, 0x1121); // Set BT,DC1,DC2,DC3' y& N" t& t# D; z LCD_Write_COM_DATA(0x13, 0x0063); // Set GVDD7 c1 b1 y% Q" m+ q2 R. Q) i* J LCD_Write_COM_DATA(0x14, 0x3961); // Set VCOMH/VCOML voltage" b# y5 V8 S% L+ {! e/ n) M2 y LCD_Write_COM_DATA(0x10, 0x0800); // Set SAP,DSTB,STB delay(10); // Delay 10 ms5 @& b# y. |+ D& X, H& N LCD_Write_COM_DATA(0x11, 0x1038); // Set APON,PON,AON,VCI1EN,VC7 m! s& b! X. ?# s% w( M m6 B7 k9 m delay(30); // Delay 30 ms: H8 \9 y1 b; G1 e _ o* s $ Y, A( [& e6 Q " D5 a5 ?! z+ E+ ? LCD_Write_COM_DATA(0x02, 0x0100); // set 1 line inversion5 M. b5 K$ Q- ^9 b4 C, ^ % y4 b+ i: U, C ? //R01H:SM=0,GS=0,SS=1 (for details,See the datasheet of ILI9225) LCD_Write_COM_DATA(0x01, 0x011C); // set the display line number and display direction / l& Q/ I! p a7 l' i+ a. B //R03H:BGR=1,ID0=1,ID1=1,AM=0 (for details,See the datasheet of ILI9225) LCD_Write_COM_DATA(0x03, 0x1030); // set GRAM write direction.4 G1 y: A6 P" a+ {3 R. x0 l 1 [4 Y3 ~' n+ M2 U5 o' @* Z- K4 O$ M LCD_Write_COM_DATA(0x07, 0x0000); // Display off LCD_Write_COM_DATA(0x08, 0x0808); // set the back porch and front porch0 V( l: R- Q5 M+ e2 u LCD_Write_COM_DATA(0x0B, 0x1100); // set the clocks number per line LCD_Write_COM_DATA(0x0C, 0x0000); // CPU interface1 P- x9 ]* y3 b/ Q LCD_Write_COM_DATA(0x0F, 0x0501); // Set Osc LCD_Write_COM_DATA(0x15, 0x0020); // Set VCI recycling LCD_Write_COM_DATA(0x20, 0x0000); // RAM Address( d# a2 S! e3 u! o* u& B- s0 ^# | LCD_Write_COM_DATA(0x21, 0x0000); // RAM Address9 J4 S% [2 P5 k) r5 P7 [) y # g; h* f/ A( q5 L //------------------------ Set GRAM area --------------------------------//- x+ b5 A9 {% R0 c& C LCD_Write_COM_DATA(0x30, 0x0000); + J1 L/ U' {; m/ V. ~- P. [9 M LCD_Write_COM_DATA(0x31, 0x00DB); % r$ J' F W. _$ \' k LCD_Write_COM_DATA(0x32, 0x0000); 2 p% Y9 @2 ? D7 g LCD_Write_COM_DATA(0x33, 0x0000); ; w( V( X9 h9 t# N1 A7 |5 m. p% ^ LCD_Write_COM_DATA(0x34, 0x00DB); d6 B8 O5 J E7 F5 ` G4 T; A* U LCD_Write_COM_DATA(0x35, 0x0000); LCD_Write_COM_DATA(0x36, 0x00AF); LCD_Write_COM_DATA(0x37, 0x0000); . A7 [2 `' ]# \0 B7 s LCD_Write_COM_DATA(0x38, 0x00DB); LCD_Write_COM_DATA(0x39, 0x0000); ( B( P* y" G+ F3 Q // ---------- Adjust the Gamma 2.2 Curve -------------------// LCD_Write_COM_DATA(0x50, 0x0603); LCD_Write_COM_DATA(0x51, 0x080D); LCD_Write_COM_DATA(0x52, 0x0D0C); LCD_Write_COM_DATA(0x53, 0x0205); * R- w( p/ ]2 N, Z9 X9 I, F7 n6 L LCD_Write_COM_DATA(0x54, 0x040A); & T) Z4 k! o( y LCD_Write_COM_DATA(0x55, 0x0703); LCD_Write_COM_DATA(0x56, 0x0300); LCD_Write_COM_DATA(0x57, 0x0400); LCD_Write_COM_DATA(0x58, 0x0B00); * C3 G) a9 B& E/ {9 k" _ LCD_Write_COM_DATA(0x59, 0x0017); 3 w' _6 f5 _& U: a1 {7 I7 b LCD_Write_COM_DATA(0x0F, 0x0701); // Vertical RAM Address Position LCD_Write_COM_DATA(0x07, 0x0012); // Vertical RAM Address Position delay(50); // Delay 50 ms2 W3 }. y+ D* V& H z LCD_Write_COM_DATA(0x07, 0x1017); // Vertical RAM Address Position 9 o( t# G4 \5 j2 a9 i+ K }6 n6 t( {( |: S y 设置显示位置的命令 void addset(unsigned int x,unsigned int y) {0 o+ J0 v8 ^9 x- `- K LCD_Write_COM_DATA(0x20,x);: u* o- n# Q# T1 I6 D9 B) `$ ? //write_command(0x20);8 T7 `4 y8 Z4 }, g! i // LCD_Write_COM_DATA(0x36,x); //wr_com16(x>>8,x); LCD_Write_COM_DATA(0x21,y); //write_command(0x21);. R6 @* I* e9 p4 K( v2 e, z // LCD_Write_COM_DATA(0x36,x); //wr_com16(y>>8,y); write_command(0x22); }2 t" K* k8 j% @7 J1 b0 r 显示区域设置命令* S7 x9 M6 P8 O0 h3 f4 H. R! T void Lcd_SetRegion(uchar xStar, uchar yStar,uchar xEnd,uchar yEnd) {6 x* p8 b2 u: l4 M# G* L* V7 P6 ~ ) F, u* ^4 }4 I LCD_Write_COM_DATA(0x36,xEnd); LCD_Write_COM_DATA(0x37,xStar); LCD_Write_COM_DATA(0x38,yEnd);" w% Y' a0 \% S- P* v LCD_Write_COM_DATA(0x39,yStar);9 A! J0 r$ Z$ [ w0 A LCD_Write_COM_DATA(0x20,xStar); LCD_Write_COM_DATA(0x21,yStar); write_command(0x22); } 屏幕清除命令 void Lcd_Clear(uchar DH,uchar DL) / n7 I) D% w- j9 f7 W& [ { ?, n# F8 l4 O5 o unsigned int i,m;9 O* K& y: u" w* q7 _9 Q# t/ e. r Lcd_SetRegion(0,0,175,219);1 ]. @" c2 O1 J6 C3 H for(i=0;i<175;i++)( R' z/ o. ^/ n( ^ for(m=0;m<219;m++) { wr_com16(DH,DL);& H" z+ y0 e/ J( L8 t7 ?9 \! @/ f8 r } } , a; m/ ]% U! u4 c int main() {7 V% B0 n3 {1 S6 L' H; F) ` lcd_initial();, A; H3 ~/ W8 c$ _0 O0 o4 q Lcd_Clear(0x07,0xe0);//绿色 O; G) _$ H; l( F o! w /*RGB #define RED 0xf800. n p J" ~' O# ^3 A: G) Z #define GREEN 0x07e0) ?3 p3 x, }8 m0 G0 E #define BLUE 0x001f- O& b2 R3 }$ C #define WHITE 0xffff/ x3 K A4 l3 ?3 u #define BLACK 0x0000 #define YELLOW 0xFFE0 #define GRAY0 0xEF7D . \7 [. c4 t/ w& _, J #define GRAY1 0x8410 ; P' F7 L2 P. o; p W( L& I& C. k, S #define GRAY2 0x4208 " }$ ` s! L$ j 8 y1 W/ ?1 Q6 x7 G* { ^ W */ while(1);( p0 ?' F4 j7 k9 x {}4 E, x5 H5 _% e5 ? } 1 z/ p w, h' ~% W2 ^5 n: a1 Z1 i |
微信公众号
手机版
当然是自己写的