|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释.
* c) `! x# |3 [- }; Y
$ `, `) a% G, u [2 R//带中文字库的12864LCD显示程序
2 e+ I5 g0 C, @# i& X#include <reg52.H>) z7 v8 e- b; X! Z6 e0 J1 J! G0 x
#include <intrins.H> X7 Z6 J- T! {- ] o
" v) D$ f1 e- w0 E% e#define uchar unsigned char
. V% ~ l( t: v6 X3 ?- d: F#define uint unsigned int5 J. S5 n* U3 V3 h8 J
" D1 y" y0 H. y6 Y. Osbit dula = P2^6;" D7 ^2 p9 b5 t1 l
sbit wela = P2^7;
7 }! x9 K2 _% ]/ u* S, u9 j+ v0 `//SCM12864-05端口定义6 D2 s$ C, G; F1 E/ f; M- M
#define LCD_DATA P0 //数据口! ]; f) c9 M9 _
sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
/ m {8 K* ]* C& I$ Ksbit RW = P3^6; //并行读写选择信号, H读, L写
0 z# }% o8 Y9 B' S( n# qsbit E = P3^4; //并行使能端, H有效, L无效
# m0 n; K5 N( Q( G0 z+ Csbit PSB = P3^7; //并/串接口选择, H并,L串. e' E% |3 `# j8 U: r* F5 N9 Y
sbit RET = P3^3; //复位, L有效
% \7 i) S( M( x. _: L; Z! F
' M' d" L* @( K8 F, G# X# i, h$ Muchar code datas1[] = {"广东工业大学"};6 V2 K" _" T2 v1 x
uchar code datas2[] = {"自动化学院2004级"};- |/ O% p$ C: d
uchar code datas3[] = {"网络工程 (4)班"};
) r, q2 V* Q2 a+ q9 @' G! xuchar code datas4[] = {"fengmk2@gmail.com"};
6 }8 E8 e. }5 G# H' M1 [2 @; P d. |+ d0 I4 s5 q
//延时约2us- N, n' ]" l% P, |9 [& I& ?3 ^3 E
void delayUs()
, F9 T3 }3 o0 H+ x{- M: n9 I) q. l9 `- O6 B
_nop_();_nop_();
' [3 e: o$ F* W. e w}
% }" t9 h1 P3 Q3 i$ `# T" W//延时 a * 1ms
# C8 k: X& ?8 Q1 b- }. p6 Yvoid delayMs(uint a)
9 s" \+ d, m8 z6 L( j3 R{7 s4 V$ Y" x- ^- {$ u/ a- ^
uint i, j;
4 i" y/ O+ Y& _: w for(i = a; i > 0; i--)
( U; U. I) R2 e, b" C2 S b" c ` for(j = 100; j > 0; j--);
8 |' Z6 w* Q3 ]8 L}$ k5 C: \2 c; i5 v
( O# W" K3 S( w3 S g//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0: B$ r1 j& F6 B7 w$ M9 ~! [
bit checkBusy()% {& ` \4 |1 y4 j$ B
{! ~' O" Z, O' I+ j% z0 a8 u; _. Z
bit busy;/ C& |# s9 |3 T& O# H; z; [
RS = 0;2 `6 I( L7 M# i# p: q4 u: ~
RW = 1;
/ U0 s0 m& u" O5 G2 v$ M% x9 o( j E = 1;
2 M. O- _3 B+ L3 l delayUs();4 j" h# f, S: n' K4 n1 B
busy = (bit)(LCD_DATA&0x80);9 g8 D0 z& B. e& F# y1 w$ Z
E = 0;- |4 J D E1 S" q: q4 @3 Z: x
return busy;
; K0 u& X6 Z# ~. ~! C}1 Z* [# u* s$ q( Z3 F' l8 ]7 }( \, N$ r
$ q( d8 ?9 K3 M7 s
//等待LCD到空闲
5 E' H) y6 B2 x* r" U0 h+ W4 t) `void wait()- W. ]: B, F( b' h% O, j- G, O
{8 h! f E( D5 h
while(checkBusy());! H9 y* J5 T; B1 b4 [6 e1 E
}
+ r, q7 B& v' F+ j% t1 C& ]7 R2 o \9 t( [& ^2 J
//写命令( _. Q% X, k& e ?/ T
void writeCmd(uchar cmd)5 v e- E U5 T3 g; g
{
, i0 P2 O j* V wait();
+ e. C5 ?6 S! _, ^% @% { RS = 0;! W; V6 P6 e2 F
RW = 0;
! [+ V5 w# z% X" G0 A9 \" W; _ E = 0;
) h5 a6 p+ p, l6 }5 W delayUs();( z' K% @2 `, [2 y
LCD_DATA = cmd;
( A4 X; O L' m# f delayUs();
1 J& j( l; }9 p. Y# J) i, _' S. k E = 1;
! m' _- q9 c, `! \8 L$ s( y5 [ delayUs();
* @3 F$ o) A* a9 p E = 0;
# W$ I1 V. ]' B" |, \4 R# X; I: E' M' X}$ N1 C$ R2 P& M2 ^
8 M4 V D/ {% t4 w7 n//写数据5 x5 g; }) ~# G/ u7 B/ N
void writeData(uchar dat)& H# b2 ?7 n7 p
{6 K! ]4 B+ G* a1 A' Y% j
wait();
) t6 o8 B3 ] `6 x RS = 1;' X4 ~# E$ J# K. D2 Q C- L$ q
RW = 0;
) G1 E' t3 {! Q0 \% Z) W E = 0;
$ _& a0 x/ B! k. q delayUs(); m; [% {1 D9 A& ~5 T+ N
LCD_DATA = dat;
) v2 D5 [1 q* W+ | delayUs();
2 n0 h: z4 h! a3 c+ V* D5 ?" E$ S E = 1;. \. P' _0 Q( J% y! {
delayUs();% l' j# C4 \5 l, K
E = 0;
/ _( m1 D+ u. L q1 S& z$ \}3 A0 B/ H4 W, h0 O, w$ S: d8 @
; `) X( r# m+ }2 x2 j. `//初始化LCD
. i2 r1 n% B( n9 X! F$ Z# _4 pvoid init() f1 W, K' u3 Z' C7 [
{
% ?& C- Y3 a8 r# _) x! m) r, W( v PSB = 1; //并口方式2 ]0 T7 i. y& A8 ?
writeCmd(0x30); //基本指令, 扩充指令为34H
& a. t& M+ d4 C3 H7 W- c9 V delayMs(10);$ I+ T+ z% ~( V
writeCmd(0x0c); //显示开, 关光标
! O8 e& ?; \: v6 o delayMs(10);
- N- ^5 u% o1 W3 T1 Z" P5 { writeCmd(0x01); //清屏
- m# N; g" o8 u( t4 t" P) `4 J) k delayMs(10);4 Q: F( f S/ F* p
}1 `3 `* f+ m4 g: g. _$ b
& w1 J; o$ p( W) q8 n0 x, |: `; ]void setPosition(uchar x, uchar y)
# L% C: U6 w H4 r0 I{
" b& t% [: N& L- `+ A2 D uchar p;
g+ J) R+ Y9 y- C3 z switch(x%4)! k5 z+ w- L1 u, J0 Z. A- i {
{: \1 c# _' ?3 H+ Q7 g
case 0: p = 0x80; break; //第一行开始地址( b/ d; y; |$ W" F+ V
case 1: p = 0x90; break; //第二行. o0 ^4 {8 G L) @6 q$ g+ A
case 2: p = 0x88; break; //第三行- k( \$ W( I9 e" `7 l Q9 G$ I
case 3: p = 0x98; break; //第四行
7 T B, c, i& L- A- ` }7 G: [6 Y+ r: m. Z
p += y;
v3 g: F: r+ V; L2 O% Q) A writeCmd(p);
/ j$ h" b$ X+ w* `! U}
& Q; i$ Q a' q# y9 I! m U# _, Avoid writeString(uchar * str)8 [6 }8 F5 B; M, B! E
{
1 ? m4 ~) Z, w; Y. Q4 A uchar i = 0;+ \' h. Y) @& P t: V* ~$ D9 E
while(str != '\0')* y4 m4 \0 i$ C( Y. X* _& t
{
4 R. _6 ^8 }- s. T! a9 R4 f writeData(str[i++]);
4 S8 P* L: {' R" y+ |- Y* v8 A" H }
: i U5 P5 Y/ n9 i" G2 d}
! w; B3 m, h9 [, a* f; L: s3 R$ A7 ?+ \% B
/***************************LCD12864***************************************/
/ D' T3 ]6 j0 J2 G+ ~$ t) c& A7 [- F2 o. I+ n/ i2 G8 I
void main()
1 B6 N: _0 _8 V2 d, s. M{
* q2 b! D& f. U, X+ U4 C( Y //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
) H e2 H3 X3 H dula = wela = 0;
: S) ?6 ?* q+ e9 e; Z3 T8 [ init();7 A6 W& E1 Y O6 i( f- r$ C
setPosition(0, 0);
" P! v4 t) d& q% X! ~9 R. E! b writeString(datas1);
/ k& b2 H2 P1 w+ V- [0 n setPosition(1, 0);
6 H- {6 U" Y! H7 u' y6 Z& Z writeString(datas2);4 V; j* Q6 C5 \% X& j) s+ m \
setPosition(2, 0);5 s/ ^6 M. s0 X& ]' v' v. S$ j
writeString(datas3);
: `4 ^( r+ ~7 Y1 t0 N, O0 J setPosition(3, 0);4 Z7 y6 J$ O+ l9 P" A
writeString(datas4);
8 t6 b" b5 ^+ F* [3 d, M9 x while(1);
) a$ f/ @+ F" f) @' O1 Q u}
; N" X. Z+ K- f& x7 G- H |
|