|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释.) K) _% v' i1 s4 M( B
8 g' g+ q5 t( E- h2 |# k# |//带中文字库的12864LCD显示程序5 @4 ]' t" V' b7 P( E: r. Y
#include <reg52.H>
. d( c, [% z( K5 D#include <intrins.H>$ t( T( E% r' l' Q, O4 l+ _
. D6 k7 d* R/ t$ E" o' ~- i# w6 ]% g#define uchar unsigned char: j. _) A' I4 h' `
#define uint unsigned int/ c* a G' v0 }% f, T
; f5 b( T' ^( v5 j o" ^: E* Msbit dula = P2^6;
: J, _: C# r) |3 csbit wela = P2^7;
6 l8 p1 F/ g, D//SCM12864-05端口定义/ I% _3 ]% p# z/ U% u/ ^
#define LCD_DATA P0 //数据口
( h5 l( Q9 U7 Z$ z3 {0 tsbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
0 R0 f# T" ]4 \, P; dsbit RW = P3^6; //并行读写选择信号, H读, L写 S% @ K8 J: G% J, q; S0 H4 K
sbit E = P3^4; //并行使能端, H有效, L无效
' e5 h0 K) w! r* [( E6 x& G& {' Esbit PSB = P3^7; //并/串接口选择, H并,L串
: L2 ?$ F: d/ D, P' Z$ v% H1 i/ ksbit RET = P3^3; //复位, L有效
6 q( F# k6 ~* S0 }. Z1 s* t2 f& \1 w9 Y+ a: n
uchar code datas1[] = {"广东工业大学"};# K& D. |! g( D: C" w! _
uchar code datas2[] = {"自动化学院2004级"};
: D/ F8 t7 _( V; I3 N: m+ G( o# guchar code datas3[] = {"网络工程 (4)班"};9 \6 J: O" m8 ?" f% T
uchar code datas4[] = {"fengmk2@gmail.com"};" l8 B, a0 H6 @
! D1 _* s+ L% ~
//延时约2us
3 Z9 a2 S1 d7 z" o/ G2 ]void delayUs()
. |; Z# P4 [4 e, @+ a" ~{% ^! H2 w0 E" @2 C T; H
_nop_();_nop_();% q* K; J$ w0 ] D- c4 E
}
* N+ y" F! m2 y/ L7 V//延时 a * 1ms1 a: V- w# t- a7 _; o9 s
void delayMs(uint a)
" P. M5 H5 Z& S' f{% [) }3 k$ A/ \0 \' n
uint i, j;4 R' l% w8 o+ s0 ~4 U
for(i = a; i > 0; i--)
3 c* K0 n) V7 [% ?# C for(j = 100; j > 0; j--);) E! \ [% B+ p) k
}
5 H2 j9 p6 `, C% f+ X0 B7 t8 A; p2 [3 N. G3 U( {
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回09 E: C% q0 N# h! R1 q7 T7 ]% @5 j
bit checkBusy()0 x5 V4 ~/ U5 _' p/ X0 h
{
$ ?9 H6 G3 b6 Z; [4 Q bit busy;
5 w( v4 M- y2 K7 t" m3 R RS = 0;
( g3 W* [; q" y8 M3 q+ O8 N RW = 1;" V, `: H1 i# A3 v' y- @6 U
E = 1;5 ~, I" q+ W& Z w/ J6 K" Q
delayUs();
3 Z( L# |3 z. h$ O5 ^& v busy = (bit)(LCD_DATA&0x80);
6 I' p0 r5 E& _0 Z5 A, b E = 0;6 V4 j) V G8 E$ Q
return busy;
- ?0 }2 P( T, Y0 Q}
. q: D, G! O8 y) a/ G
0 O& ~; o5 k8 Q: n//等待LCD到空闲
, b& u2 z9 `% O: }5 x* p! H7 O3 qvoid wait()
& J) F! {, y3 m! r9 ]0 M{
3 q6 s( C# f4 T* Z+ q- x while(checkBusy());. P; S. j i# ~( L2 G3 c
}8 p4 Q2 z7 A( `. m3 h3 @7 H
1 z) v9 o) L+ t9 @& g//写命令/ B+ ? c8 M$ @) n. R
void writeCmd(uchar cmd)8 M) P# P) e5 j8 R- h0 r% B, d$ Y
{
; k% ]; J" A# |, e% W, l4 M wait();
; G& I5 w8 T% S2 s1 @ RS = 0;
$ ], i9 v* i! Y4 v5 d$ S( r RW = 0;: a# f; G0 v6 T' E5 Z% L
E = 0;7 q. F6 s& r+ \5 N9 ?# Z! h
delayUs();
* ]6 F3 u I4 E4 [; J1 _: ] LCD_DATA = cmd;8 _+ `; I2 V; ^9 M5 e
delayUs();
, `, [$ D, @* g- k* v( Q% r* R* { E = 1;
; R* j7 j) \( Y/ ^& y delayUs();
7 \+ E5 a( P: j E = 0;
6 x& R; V2 y6 ~3 G9 Z}' S4 K3 n! }& @
! y- @- h" \: F s6 q0 b. G
//写数据% e; t5 H j! ^6 E3 T3 X
void writeData(uchar dat); M6 j* k7 o: s6 k
{+ A. a0 b9 P& W. N1 }+ Y0 T4 U
wait();
' a7 H `5 |3 F1 Q( J- T RS = 1;
/ N6 s7 h( u; c RW = 0;$ |. O. C( n' @ }& v
E = 0;$ F% i- R7 _% v! c. o9 ?" I$ D; x
delayUs();
3 D- A1 _4 V4 ^# W& G; S/ f, T LCD_DATA = dat;- t: N) N9 n$ n9 w% \
delayUs();( x. D9 \. o2 `) e& ]
E = 1; K5 ?' [, G% f: _; x$ C
delayUs();
" c' c9 G* {: O4 x# _0 _ E = 0;
- o7 n7 [: X* g! q}
5 P# Z" S8 p6 B0 n# O w) W3 T' ?2 x6 y
//初始化LCD" o' B) r' H8 G( b+ A1 l( O
void init()
6 F- H4 Q6 |8 `' v9 U{0 @0 h% R D( a) z) v2 b& H" N% H
PSB = 1; //并口方式
. ?- ] l- D y5 ^ writeCmd(0x30); //基本指令, 扩充指令为34H- F% Z; q5 U+ G8 c/ p/ q: \
delayMs(10);
$ I P& ]% c* W4 \' w5 a2 a writeCmd(0x0c); //显示开, 关光标
' {5 t) M! u: a v! x delayMs(10);
" w0 s; a- @" r writeCmd(0x01); //清屏# |# Q3 h% B) C/ Z0 m& ?4 ~
delayMs(10);0 C# r' k4 } }3 o* {
}, o8 S4 B9 d* H4 n3 h2 \5 {
, z# |$ u a' o. j# O
void setPosition(uchar x, uchar y)
( v3 {6 j% L: S( E' Z9 U) {{
7 ?7 _# }" w$ `0 } uchar p;; M) A& f+ A1 a
switch(x%4): Q2 B! p9 p( _5 C& K
{# T' v3 Q7 c+ V3 e4 f
case 0: p = 0x80; break; //第一行开始地址4 U4 C* \; X: i5 \! H
case 1: p = 0x90; break; //第二行) D. d e. M) j9 O) a% u, }
case 2: p = 0x88; break; //第三行
+ n8 E* g7 v6 V: \9 l case 3: p = 0x98; break; //第四行4 Q3 C3 s: @. O! E
}
8 Z0 x% _8 b6 x2 O4 {& s" r( d p += y;
2 f7 M% R+ D7 t- p writeCmd(p);' }# T: |6 b! y1 x0 Y! K
}+ G4 J7 @( j& r R. O
void writeString(uchar * str), _9 W4 C( E6 z* x5 x
{
/ U+ c/ h* j. Z' l uchar i = 0;# q& I; y, L$ r2 d5 y P) W
while(str != '\0')
9 R9 A# I3 G" W+ O {
" i8 W# b3 {- \0 W0 z) Z& U+ F writeData(str[i++]);! f9 E, I8 @* w/ a% p
}
% J w( I* R. `0 O; I}: U- ]1 o$ O3 L
+ H6 l* e* \! }3 f/***************************LCD12864***************************************/! g- h; H. Y$ G! f" E& k( z1 v
p6 G3 J* z4 T! Y* \& |void main()# H f/ t; J( {( X) b3 Q0 z
{
$ l- F9 L3 E/ ]/ Z //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作3 Q5 d, _9 u0 Q% e" A9 A8 x3 q
dula = wela = 0;1 J5 {& F) L1 j1 D5 |
init();
5 Y! X% q, {* X v setPosition(0, 0);
% h9 |; Y) ?4 }7 g% D5 t writeString(datas1);" S& B2 [" i0 {% p, m
setPosition(1, 0);
! S$ m) M# X t$ `$ ~% X4 L writeString(datas2);
1 Q% I1 h5 }3 N: V2 f# \% @ setPosition(2, 0);" F0 M) Q5 B/ r$ C8 {
writeString(datas3);
& m/ |) d8 j$ l1 F3 s) L setPosition(3, 0);
2 M" C; \' X6 S4 R( w V v writeString(datas4);
8 N! P* c, f6 v# M" H: ] while(1);8 N: ?: m6 S: n) r" B
}
& z q4 t; ]7 m. e$ f |
|