一、LCD基本介绍$ B& J4 ~2 w: P! |6 J' Y
液晶显示屏原理:液晶显示原理
1 V1 |0 q, X) `7 u1 E
' F8 J, b6 `2 v* }% F5 I+ JLCD原理图:
, g. I' ^" g$ n' |
: @' [. S7 f+ C6 w; {3 v
9 m2 v/ R/ M% X( u. P2 L
5 J" ?4 S/ V2 G7 N2 o官方会给出LCD的配置的,了解一下就行了* d) d9 e/ G# Q9 [
/ b; y6 N) r" y5 u2 ~5 q注意:屏幕的原点是竖着放着时的左上方
6 j( U3 C |" n& s8 G# B( t! {$ m9 ~; ?9 j# w
6 D4 Y9 v; Y- S$ R3 U- ?$ D) o3 w' O! ]2 U+ x' g
在每次LCD初始化后一定要先清屏在进行其他设置,并且LCD的初始化一定要放在系统初始化之后。6 `# d& b. h) h: }( u5 x' u* C
9 P5 X3 L' L- Y1 o: @一般模板:- .....
6 r" S- y5 B. X- Y0 P: _7 Q - LCD_Init(); // LCD最后初始化+ M7 Z' ^; h( Z( u& C: b3 O- ~% g
- LCD_Clear(White); // 白色清屏6 L. J4 ]1 E9 ?, K
- LCD_SetBackColor(White); // 设置字体的背景
) F, z+ r" i: ` - LCD_SetTextColor(Red); // 设置字体的颜色 q8 r& q' s! Z& Z
复制代码 - R b8 O4 R8 \6 I! ~( A/ M$ E
二、函数介绍6 ?4 P, E* ~/ J' ] o
1.颜色设置函数
+ b3 b+ h, S3 `, A0 w8 \void LCD_Clear(u16 Color); // 设置清屏颜色7 G$ S+ Z8 P- F+ Z& L( C; ?
void LCD_SetTextColor(vu16 Color); // 设置字体颜色+ G6 {2 K2 W+ G% g7 V# p
void LCD_SetBackColor(vu16 Color); // 设置背景颜色
% `1 h, }( d% S9 {+ o% K- ~8 D! P
4 d' ]4 w9 l- W1 D; e4 S! hLCD_SetTextColor()是设置字体颜色,但是作用效果仅对后面的显示有效
) o/ z, k& c, i1 n1 V& r, m8 S: W/ W
LCD_SetBackColor()是设置背景颜色,作用效果也仅对后面的显示有效,并且设置的区域是字体的显示区域,其他区域会也清屏时的颜色显示
6 ~2 F9 y, ]1 I- j! Y) s- LCD_SetBackColor(Red);
# J; ?4 u' w! ~0 S- s& m, L - LCD_SetTextColor(White);
" D" K5 }$ Z2 U, E; J - LCD_DisplayStringLine(Line2,"White");
: M- Y: L$ a0 E8 _2 c - & n4 i* M6 w/ v9 f
- LCD_SetBackColor(Blue);) r9 E5 O0 t$ u
- LCD_SetTextColor(Green);
5 I; S4 ^4 ?5 P - LCD_DisplayStringLine(Line5,"Green");
复制代码 + k6 N Z$ z; Y/ ?7 D% p9 Z& V
; ?% h0 L% k: k; c
显示结果:- w, d" J) a8 F- o5 E
: @; R% _. c% h( X' g
8 ~+ e- R6 X7 m% U4 [1 ^0 J* N/ h1 d
2.字符显示函数
( _9 ?( Q1 b& x( n r7 ~( M4 T; _3 Dvoid LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii); //任何位置显示字符$ R% Q# F% b6 d- ~
void LCD_DisplayStringLine(u8 Line, u8 *ptr); //行显示字符
8 p5 F: F( b9 \2 F+ G, k7 F6 u0 v4 r3 b9 \3 V7 k9 w
显示屏为320*240,LCD_DisplayStringLine这个函数根据参数可知,是按行来显示的,显示屏共有Lin0~Lin9,每行可以显示20个字符
3 p2 W2 O( G5 @0 E! y9 y3 g
; t" B3 A9 q t! _# g: ?注意:Line一般传入参数Line0-9, 若传入数字则是以像素为单位
- O/ J V. {9 A* h
& r5 W* Z. l: r! t7 Y若用于显示变量,这种方法需要使用到sprintf()函数(添加头文件stdio.h")
0 p2 c; n+ e/ H
x% k' a* v) w7 {5 r" M7 W我们要定义一个字符数组,用来存放需要显示的字符串(LCD一行只能显示20个字符,所以数组大小定为21),sprintf()函数的作用就是将指定的字符串存入数组中
3 X. I3 v# f( {7 ~# F
' N5 w O# z5 l5 }: {$ x& c/ V头文件:stdio.h
! n9 ~$ a& k; M( s, L& o1 f函数功能:,格式化字符串,将格式化的数据写入字符串中。7 T1 W+ h* \, t: i+ C1 q
函数原型:int sprintf(char *buffer, const char *format, [argument]…)2 S' H3 B8 w+ ~, q$ O9 B4 o; i
参数:
" } L C- H. o% A(1)buffer:是char类型的指针,指向写入的字符串指针;
: z, Q9 V- K% o# k(2)format:格式化字符串,即在程序中想要的格式;
" z7 G$ x6 u. o! |! v2 U }2 Z(3)argument:可选参数,可以为任意类型的数据;
! t8 g! n6 g* f, I6 J函数返回值:buffer指向的字符串的长度; M/ K* I3 G; }) r9 h, v5 O
3 \. K7 c/ ^0 x; Z9 c/ S- char buffer[80];
5 _3 Y$ m/ x! { - // 将An approximation of Pi is 3.1415存入buffer数组里面
( x, F) j: Z4 T( K; x5 V! y6 w* k - sprintf(buffer, "An approximation of Pi is %f/n", 3.1415);
6 [$ [5 r( n7 W0 j3 f3 Q" t
) I( n" O3 k8 {4 X
复制代码 ; y. D6 c/ T0 c" q
对于LCD_DisplayChar(u8 Line, u16 Column, u8 Ascii);; ? L1 @9 y# Y0 O" U- P3 L: `
前两个参数是行数和列数,由于官方没有给出每一列的宏定义,所以需要我们自己推一下。这里列选择需要了解一下lcd的分辨率- ~! V4 l) @2 M U: H& C
6 v9 U" P) p# `, `9 a9 f在官方给的参考资料里面介绍了分辨率是240RGBx320,我们知道lcd一共分为10行,20列,所以一个字符的高实际上是24*16,可以看到lcd.h宏定义里面每一行之间的差值就是24,那么每一列之间的差值就是16,实际上表示一列的时候是反着来的,320表示第一列,320-16表示第二列,那么320-(16 * i)表示第i列8 W! s0 N. {! _: Z u( D) e) v4 N# x9 A
- P7 w! o7 N% Z
- //在Line4,第5列显示字符'A'3 m9 \( B% h; A- y
- LCD_DisplayChar(Line4,(320 - (16 * 5)),'A');6 Q3 a, U3 w" T4 `7 J7 N
. e: p+ J$ E9 [/ A! T" e1 v
复制代码
8 C: Z$ q! o) b: Y7 S- {1 L6 K: a) h
! P) Y2 _% O' C1 ~ \4 \$ Z; l5 C( l4 o l# P0 o# ?
$ x! w$ {4 U' z* H7 g- r$ h: m8 Y( i# V, c" B" V, ? I
|