|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释.+ `! r. t2 }2 b6 }/ W8 C
6 q+ _- U0 Q+ [* W, W
//带中文字库的12864LCD显示程序3 l; ~, Y/ y k) n' C' w2 l: c+ ^' x! ]
#include <reg52.H>- d7 {/ z: k1 {8 T9 Y& A0 X
#include <intrins.H>- b& M4 |, [# U6 q% D: `
5 H3 n; r' r: ?6 p' l! q#define uchar unsigned char) L+ R- j( H* o0 a2 b
#define uint unsigned int9 @/ g- s0 ]& x$ _. [
' H. ?# b- _8 G# [8 Y9 K% ^3 xsbit dula = P2^6;
5 m, c6 T! q2 s d% Msbit wela = P2^7;
" H+ J& b3 F0 ~, `% U//SCM12864-05端口定义# F! L4 _5 M& r' `9 ?1 I; I% U- s# \
#define LCD_DATA P0 //数据口
, V; R: R2 J& ~. A m' ~. ^. Ksbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
" A& L$ _! k. Rsbit RW = P3^6; //并行读写选择信号, H读, L写
" h; V/ A: S* v; `sbit E = P3^4; //并行使能端, H有效, L无效
7 H8 A0 n- H$ f6 N x' A; o8 b% Nsbit PSB = P3^7; //并/串接口选择, H并,L串: F& c" h/ ^/ T3 M2 a! z
sbit RET = P3^3; //复位, L有效. X$ ]7 @# i' G+ }
! P) k. _' d) O$ U' V
uchar code datas1[] = {"广东工业大学"};8 f/ d, J9 w; F7 p
uchar code datas2[] = {"自动化学院2004级"};
+ u9 [; n6 I% r9 t! h% buchar code datas3[] = {"网络工程 (4)班"};
, C' W. [4 \) J5 C1 O6 r/ uuchar code datas4[] = {"fengmk2@gmail.com"};- f$ C$ [/ Y: c+ ]+ [
& e0 b! d# _5 Z
//延时约2us$ i' C8 s8 {2 ~5 _# N
void delayUs()
/ T- J! w t; Y. C{
. N; F0 m' ^4 t _nop_();_nop_();
/ b7 n R9 f6 W9 d, Q& B}
3 O/ Q1 x' Z3 b1 ?) \4 @& `//延时 a * 1ms* ], n4 E! l+ ^8 T
void delayMs(uint a)
' j$ d& `8 |* _& Q* M b{ h B6 {, T y! ]; n0 d
uint i, j;: y7 O$ j- m% T( s9 b! a3 g
for(i = a; i > 0; i--): _2 Z6 t: `) S0 O/ V
for(j = 100; j > 0; j--);
- F9 M6 |. I4 i& a/ X7 y' i. B}: O5 U0 g6 `# n8 R: n% F; H
; _ Y& I- G, p: [//检测LCD是否处于忙状态, 若忙返回1, 空闲返回02 e: I% t# i" f( n8 @* M
bit checkBusy()$ `0 T) d& |9 N9 f; j
{
! G: L$ _0 y3 S. N5 Y+ j bit busy;7 {4 K9 k, F" ^5 U! S1 T" K
RS = 0;9 W+ l. D; f: |) f' U
RW = 1;3 a" s) Q! h: x0 |8 H) h& q$ F
E = 1;
6 j+ H# Y6 ~0 i4 J4 h6 N/ e delayUs();
* P& j) N& p2 t6 Z( n busy = (bit)(LCD_DATA&0x80);
/ h* V5 R1 H$ L+ u n; r; O E = 0;9 U/ w W+ z% R
return busy;
m. L- {6 G: J( f4 L}
& c- W/ ?" {3 Q6 S
2 P* z' P7 r2 _* q; F//等待LCD到空闲
; s e9 f. ?! c. _3 Bvoid wait(): N" E4 z0 }/ p: d* N
{
& \' o3 q, o! I8 ]- A8 B while(checkBusy());4 Z e% j+ y2 J4 O
}4 k/ h9 R* X, J
- B7 H% i5 }, R//写命令
- x7 g+ K9 b. y# u, B7 d$ y" g0 Ivoid writeCmd(uchar cmd)) \( o; d" x! n
{
1 P2 s) ^9 ~, R8 E2 j3 h5 J wait();7 K- s, n3 d9 C1 U. f. Y2 U8 S
RS = 0;
/ r6 p: H9 L9 i- K4 i! K$ l5 D, t RW = 0;
0 o3 t/ P& l! [- P2 S* m E = 0;
5 V6 z* R8 P4 b* d delayUs();
4 m7 X' E; ~: M! b LCD_DATA = cmd;$ b6 v& x! u3 T/ D# X. L
delayUs();2 i2 q F4 l) P( z6 Q
E = 1;
- A8 e6 A* }( }# N( J delayUs();
% k, i9 P* @( q& ~ E = 0;
: t9 N6 P4 ?/ j& j}0 X& r" f( l. z& j9 P$ p
' X% P, ^3 x3 R" m9 @
//写数据5 k0 a: Z/ P5 e* I$ Y8 f8 g
void writeData(uchar dat)
' o! p% ` ^) A* [9 [{2 q0 @5 D* l, x! L
wait();, K% U/ S0 P: a* P* ^ s
RS = 1;
: b( J$ E; R }/ S0 m0 g RW = 0;
7 L8 Z. W6 j+ m9 T E = 0;! S' P4 A$ b; \0 @
delayUs();
/ W2 \/ a U+ l# F- ?, ` LCD_DATA = dat;
! y; g/ Y) ~ A delayUs();
$ J. {$ u# _. l m' q E = 1;' ~0 l3 ^9 m: s @$ I1 h, ^* z
delayUs();% d$ V, |, i, z5 c- n
E = 0;) z! H9 M5 L* N
}, z4 r7 E Y( ?4 W3 \$ ?
! ~. a7 l# X+ B# P3 J$ a% K m
//初始化LCD
4 H4 C; q- y6 Q, b7 kvoid init()
3 }2 Y: z' r5 T( d5 X7 G{
: e; p8 _3 I* O2 i$ ? PSB = 1; //并口方式" c' S; y1 H* o2 Y4 Z
writeCmd(0x30); //基本指令, 扩充指令为34H
& N0 i) g! _6 ]" D% Q i& f delayMs(10);
) R% k0 @: c( Y9 }0 S writeCmd(0x0c); //显示开, 关光标
* C7 p3 x2 h/ O& _6 j5 d: G4 V delayMs(10);
5 ~$ A R6 ~# u) x4 | writeCmd(0x01); //清屏
$ E7 @' y) r# c4 b delayMs(10);
" B+ B8 B! f2 E}
( m, p+ e+ ?( n) S: q
' h, L1 a" |% S8 }( M( I3 qvoid setPosition(uchar x, uchar y)1 s' u6 n2 f) R" e
{
' _- z I4 [! g uchar p;
! K+ j0 s! f! _! s H8 r switch(x%4)
0 P/ P( Z8 s- F/ J) Z {3 c7 q# M; ]: A( P- x4 u8 ?
case 0: p = 0x80; break; //第一行开始地址+ V7 `1 K: o: Q8 a. X9 j a
case 1: p = 0x90; break; //第二行6 K4 X- G; b' A, k1 c8 m
case 2: p = 0x88; break; //第三行9 R! ~/ K4 [: v
case 3: p = 0x98; break; //第四行! d9 [( _0 o" k: M& [3 x
}
8 }3 V) R0 L2 M7 E p += y;
2 w! ?' S5 F, \5 R8 I writeCmd(p);3 w' R5 S) H: g3 ]' U) G
}
3 |8 H$ D+ D: c$ h" Yvoid writeString(uchar * str)1 m4 g, p& H) E7 i t% g
{+ x( q4 G4 X5 i. Q8 e4 v$ Z2 N: c
uchar i = 0;8 t- z0 ~1 E( ]$ d; o
while(str != '\0'): b* ~- z+ ` X( U4 e0 t
{
1 B0 o: K: o* X! S1 W& y7 W2 t' q! m writeData(str[i++]);
4 L' U& T/ Y2 C! y, l. h }9 D8 U+ K& A8 l. N
}
U B' M; ~) H/ v, |+ k b/ M, |5 y
/***************************LCD12864***************************************/8 x t$ s- K5 ~9 _! Y
9 J2 H% u% b6 O( k) r1 [
void main()
& i @, p( L! i7 ^, d& S. B" k- ? |: }{. f) i* K$ ~1 ~2 m
//先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作- {, n( S2 w) s, p7 {* C) X
dula = wela = 0;
; U8 U+ J) T0 g! R/ w* F( n/ n7 ~0 U! W init();" E/ N4 m9 S- C% J. h8 O5 m
setPosition(0, 0);9 A; i$ L9 I* B/ L
writeString(datas1);
2 i* Q4 z: P( a# m A: s# I setPosition(1, 0);
; k+ Q( V; A; J5 V0 Q* r writeString(datas2);
0 u$ V4 j# _" g$ y) m setPosition(2, 0);
2 T( P7 p% K7 R9 t; { writeString(datas3);' |2 C. `3 w3 G% h
setPosition(3, 0);
# i+ ?, c1 z H writeString(datas4);
. S& N5 R5 ^+ ^5 {! E0 }) z while(1);8 Z; Q1 z& P8 D/ m: }
}
% [4 s8 H4 X& l/ s* q6 n4 A# n3 T7 P |
|