|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释.+ L+ r: ~0 K0 I+ ?% r6 y
2 P. n8 e; x! N: ?/ R' p
//带中文字库的12864LCD显示程序
( E0 t! q2 e1 R( W% Q#include <reg52.H>
1 r4 ~* r, o2 H. G" E- e4 e4 e9 r#include <intrins.H>
2 E! _& Q6 h+ h3 C8 O+ L
" d; H" ]% L% r* d( P+ N#define uchar unsigned char6 p* ]6 V3 J/ P) ^" Q* j3 F4 s& H
#define uint unsigned int
6 o( x2 s% B# M" z0 F" n8 t5 U0 R$ J; S. q' h- C: r! [2 X5 s
sbit dula = P2^6;7 K. k* l+ M0 Z: ~! ]
sbit wela = P2^7;1 A' c6 Y* L+ W z2 n
//SCM12864-05端口定义
# {# i( H0 Z. `/ X#define LCD_DATA P0 //数据口5 b6 i& p. h1 y0 d4 W. D2 a
sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
" X- P. l ?% A& X- Ksbit RW = P3^6; //并行读写选择信号, H读, L写
' p5 r; P+ u+ r, Q! v8 r3 d$ wsbit E = P3^4; //并行使能端, H有效, L无效; h2 V( O0 }! U
sbit PSB = P3^7; //并/串接口选择, H并,L串6 ?" O4 u4 l' B7 n' m8 q) T2 M
sbit RET = P3^3; //复位, L有效& @! {7 i3 q) ^2 v# h! q D
6 q2 D+ l3 M1 A& g1 \( S/ |3 R: Puchar code datas1[] = {"广东工业大学"};
7 K7 n3 _$ F" V6 Z' Luchar code datas2[] = {"自动化学院2004级"};
" I5 `2 ?) |) d% p3 B' r* }uchar code datas3[] = {"网络工程 (4)班"};
6 I8 V1 H ]. Y9 V* M' C$ F9 nuchar code datas4[] = {"fengmk2@gmail.com"};
5 \# { y: D9 p" y* W3 d, H: {0 @
. [" x) h0 j" X, {, B- D$ c//延时约2us$ P' C0 N7 Q! ?
void delayUs()
) |" `# ]2 ]+ v6 {& V2 Y" Y) Q, P{% w& T7 {+ p0 a. }* E8 _% n: h
_nop_();_nop_();: N* K! y+ W6 A
}
- N& K7 ^/ {! Z6 M" `! y# w//延时 a * 1ms; q- e! f" p4 B8 N+ y0 ?% F2 o! g
void delayMs(uint a)
4 Y2 j- U2 _ n( j, M9 A9 R- _. V* r{" }! v; \7 F( S
uint i, j;6 t- g. C$ O5 b9 I) J2 ]1 `9 n; e
for(i = a; i > 0; i--)
9 {. i: F2 O/ M4 z- G for(j = 100; j > 0; j--);
; z" a- B2 b! N& F: m$ B}% |+ o- X& R+ }7 X; A& K6 |
$ ~* Q: v; f0 I- a: q8 ]( x//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0/ |$ }4 b" A8 V5 `' e
bit checkBusy()
! n3 ^& z0 V# v2 g& C{
4 K9 p# l& b( L1 P bit busy;
6 z; {; Q3 B. V. N: @ RS = 0;' L% k& ? \3 l% f7 f
RW = 1;
; o) @1 B% C; h- w6 Y0 h: m# p- I E = 1;: ~, [2 u5 M/ ~$ I7 Y/ Z, I: \
delayUs();
7 z0 E* }/ W7 O( y3 | busy = (bit)(LCD_DATA&0x80);
" H4 |5 h9 e% }' B: U9 k- N E = 0;; J0 t4 ^* P: M0 d' }0 k
return busy;: i2 M v V* |' P3 J/ L
}
- w1 h0 u! F! {: Q; k2 e
. F# L4 z$ I* U0 S$ Y. I3 @//等待LCD到空闲
; X3 q8 Q ^8 @, E1 V" j5 V' Nvoid wait()
! I7 X. q5 b) {8 J, m{
+ G0 \. V1 |& b3 m: X6 P2 m! w while(checkBusy());
! t( b1 C. Y; y1 |0 M8 K}
2 F J7 W2 N8 I% b2 f- A
% ]2 ~; X0 k* x$ I0 N//写命令
0 \% G# _! Y# B( Uvoid writeCmd(uchar cmd)( }7 w! M4 ^, A# ~
{9 s5 W" L1 ^% S5 j6 v I
wait();
- y8 j, S% D' k* B! c/ [ RS = 0;5 Z6 Z- [7 i; X7 ~7 _+ b
RW = 0;0 |6 V! @. I8 y& |
E = 0;
" K! m( U6 U; q5 R; U ~ delayUs();
; R. u8 u1 |; c* [. n7 l/ A LCD_DATA = cmd;
: s& n1 ?0 k. p0 I# K delayUs();
" D0 f7 a- _3 M E = 1;8 x, U8 }. i* X+ C8 h3 }3 Q
delayUs();
c u' q0 ~7 h E = 0;
+ \- M( p% _( N6 |2 |1 @/ L}
( K1 J v9 h6 Z7 I3 a" z7 o
' ~( y5 [+ X0 z+ y//写数据9 d) p, j6 x9 u, Y* }/ a
void writeData(uchar dat)
6 c$ s# h3 a* ?& M. F0 Y6 q: i{7 P( _9 W8 `, V! F" z& m
wait();
2 r; a! ^$ @: k/ G$ u RS = 1;
1 x8 ?/ {* S4 Y7 q" V RW = 0;
8 q7 F: e% j- v' e E = 0;
5 Q2 Q& N/ {0 u delayUs();
p4 W9 q6 ?) H! S LCD_DATA = dat;
3 D( t- R, m# E- x. T4 w delayUs();- B9 A1 F& O' }$ f: I
E = 1;
% D& G. x% `9 e4 W3 T; L; e S delayUs();
1 R; ]' y# x. N E = 0;
- {; S/ B- R) i5 S: A$ `}
/ a- k5 c8 F9 |+ X1 j8 p \1 D5 `& p" A: N& B# i% O
//初始化LCD1 x; @/ Y+ I: v. D! H# p) v+ N
void init()$ v0 ]: g4 t' t- s9 W
{
( C( K0 x- [) C$ T) A PSB = 1; //并口方式, ?9 e1 ~6 C' g
writeCmd(0x30); //基本指令, 扩充指令为34H
$ ^: x4 a* U& n1 T% s delayMs(10);
% |' M5 x; R5 F M# `6 D* n- o; N writeCmd(0x0c); //显示开, 关光标
, K/ l9 l% N8 }2 u8 T delayMs(10);9 \+ B4 }4 g5 y% p; [
writeCmd(0x01); //清屏
) Q# G/ [/ i- O% ^2 u delayMs(10);
: \" {* u$ R9 M" X7 o}$ ^4 }" ?2 N, |" p) G; H
! Z* l6 T" n" T0 v. Q, c. { ~void setPosition(uchar x, uchar y)- F9 z* q. s" ~8 F
{4 M! k7 z, B1 R. O6 l; A$ _+ O
uchar p;9 N Y* e2 h! a
switch(x%4)
" {" J0 K0 d0 P7 g5 d {
$ N2 f6 z5 K" [4 _+ f8 R4 Q case 0: p = 0x80; break; //第一行开始地址
0 Q) b3 \3 d6 j/ s# P! K; v case 1: p = 0x90; break; //第二行) D1 Y+ z4 ~; u
case 2: p = 0x88; break; //第三行" ]/ F- ~) j* ]7 c
case 3: p = 0x98; break; //第四行
# ~0 c# I+ x A; K% o: R }1 Z5 A- {; Y2 h: F7 ^+ L7 t# n" l( ]
p += y;
9 i, X0 u8 I1 t* L; w8 E, P- i) ~, R writeCmd(p);1 @; {" s; q! u7 R2 b
}$ }. j$ O! A+ s( v
void writeString(uchar * str)
% H; q0 W& L' M b- t{" c9 {5 a$ \8 r' e) `. C
uchar i = 0;
9 g6 S. I: p. J6 f4 d! q5 d- J& K while(str != '\0')3 d2 X/ i9 s0 N: ]
{
2 _& k9 o7 _3 u) o# L% v writeData(str[i++]);
% b7 E; {( p3 U8 W2 r }' o2 J% {, p5 }% m o
}
5 j+ C4 {" }% U) k' @% ^) h; o. `3 s( X8 i: B3 Q" h8 E1 C
/***************************LCD12864***************************************/
& W& f- b& E& I. J9 @' c; ]* L% u% j( ]
void main()% I5 G0 j% K) p' x5 U. C+ t9 m
{) J6 V C4 a9 f+ t( _2 \) I! O
//先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
7 M# F2 q; a0 Y7 _( ~/ \6 L' j' n dula = wela = 0;
: J4 V3 u5 e* [* R% c- _9 n init();3 n" _+ x j7 J! c9 i
setPosition(0, 0);# z# j' l) R- r( Z( V2 I
writeString(datas1);
1 {, O3 }3 {9 ~ setPosition(1, 0);
" @& _4 n( R& D T; j writeString(datas2);* N# H* R6 ^( D6 g( k8 k$ c. q
setPosition(2, 0);
0 [1 z ~2 n& i+ E# m writeString(datas3);8 v/ b* z& W: _7 U
setPosition(3, 0);
- n: @$ ]2 t' e3 N writeString(datas4);- s/ X6 ?0 F) @8 c3 i' G$ A* s2 ~
while(1); L+ x' E6 p+ g5 R8 Y$ M7 K
}; c. W* x) L, F
|
|