|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释., Z, u8 u8 I3 d3 w- }; v
+ ^& @2 t4 E, Z* M: b
//带中文字库的12864LCD显示程序
3 \% |- m; f3 b, ~#include <reg52.H>9 H0 J2 X& g- P2 v: D+ Q4 Q
#include <intrins.H>0 x. y9 D/ ^+ }
2 K [# e5 Z4 `' {
#define uchar unsigned char- i2 I3 Z" I9 i; R& l% y/ D
#define uint unsigned int1 V: U9 d; V O) y4 \0 o
% ~3 Q! Z! a: n! X/ s& i" u$ z% [4 k, f
sbit dula = P2^6;8 q a$ z7 ?! m3 ~+ w2 B! A* M: A
sbit wela = P2^7;
+ ?2 O6 k4 v9 V# n/ E: u//SCM12864-05端口定义2 O4 n& s2 p, ~7 C+ [
#define LCD_DATA P0 //数据口
2 P, w- L, G3 i( |sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
' i9 C8 J+ g' W, i" {sbit RW = P3^6; //并行读写选择信号, H读, L写
% h3 M5 j: B& I& T; g2 @sbit E = P3^4; //并行使能端, H有效, L无效
) k& g# q2 {& z5 M9 I& ysbit PSB = P3^7; //并/串接口选择, H并,L串
% I! L- `# s* n# ^5 }, q: Zsbit RET = P3^3; //复位, L有效
6 h1 D; `0 z" Q( l i, w) Z' q& n/ z; a: ?- J3 u
uchar code datas1[] = {"广东工业大学"};
: Q) j/ o6 X1 Q! i5 p: t1 z) zuchar code datas2[] = {"自动化学院2004级"};
6 \+ d7 N' t6 E; \& ?uchar code datas3[] = {"网络工程 (4)班"};
1 }- V: p: Y. A+ Zuchar code datas4[] = {"fengmk2@gmail.com"};$ F6 B2 Z' i4 |" I4 _' j* v
" G F# ^5 s, i( l+ g
//延时约2us- i/ J& R" }* I3 @
void delayUs()3 F$ I! x! k8 a( ~7 W
{
/ B: P5 ^; [& n7 c' l1 h _nop_();_nop_();' B- G, B! u5 A" K
}' G( x& W" r$ M$ @
//延时 a * 1ms
3 F5 O8 h7 _# X c+ Evoid delayMs(uint a)7 V) l1 u+ c6 ^1 ~& Y
{
+ R/ H% n2 M# I$ ~1 \3 [ uint i, j;
1 X) g6 L) r9 I- Q$ C for(i = a; i > 0; i--)2 R0 {/ O( C% L% @
for(j = 100; j > 0; j--);$ A- ^# K! e& Q
}: W# [6 `, q. \. N8 @& n" z
7 h7 _. `) N% J" L/ w# f
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0" }& _' P. v5 B
bit checkBusy()4 y( \3 h$ F% D! a5 f$ J+ ?
{# P& l2 u1 W! H# N1 t) W5 w, m
bit busy;
0 g. {+ U0 B8 M2 a$ u$ K3 w6 U RS = 0;
& Y( u0 N! M2 G) R; d0 ]5 i RW = 1;
2 q+ r" q6 k' \6 N E = 1;) `, H" B- r" u z1 j
delayUs();! L/ r* T! q" Y# Q
busy = (bit)(LCD_DATA&0x80);7 P% q( K; s3 p: T# g2 z0 {
E = 0;
2 w4 q3 `% v3 m. m) c( l8 \ return busy;, o1 Z8 o* Y! A. Z1 B. r
} N E9 Y8 V- W6 M* G+ ^' x
$ u k) n# r5 ?/ Y0 L//等待LCD到空闲" ]$ l! K2 x' @' j3 N, i
void wait()
0 t0 M0 _& d$ T' S# P" b{3 t* M* ~% k3 r1 | C
while(checkBusy());
- K6 h* F5 H4 Z3 A m2 D/ z7 l}# W+ Q1 M3 V z4 J2 @
+ s/ a# k* k# d4 _
//写命令7 F4 ]9 v' w" b. ?+ E# E
void writeCmd(uchar cmd)
: Z* u( w' \( [3 K3 L; t0 w{4 P- J! \/ J$ y5 m' Y
wait();0 C2 ]* `1 P3 f" M0 B" ?$ V
RS = 0;' g& k6 x9 l$ y$ H3 L$ _/ r
RW = 0;3 e" |5 E5 a( I( t
E = 0;
$ w: H u; G5 i9 o a8 ] delayUs();6 d; b9 ~+ \, b% w, N0 M
LCD_DATA = cmd;
& v+ v( V. A, @. f' t delayUs();
1 {! U* }) U) j E = 1;% c; ?) Y% @. }0 ^, A
delayUs();
: ?9 E6 ^: t. N/ _- {9 ], q E = 0;( u- p# ^- F/ W) r# A" }
}6 R8 o2 ], [3 U0 j3 H1 \
' W: M7 \; Z8 ~) d7 v/ t3 x
//写数据
$ A6 p1 m, Y c( V* jvoid writeData(uchar dat)
: z8 p- Y9 T$ O9 l: Z{, f" V& n9 ?* A1 k
wait();
* ]' r5 |6 G; ?0 s( f0 H5 U RS = 1;
0 b" R& t' r! b RW = 0;' A9 t! k0 t) N
E = 0;
( S; s& Y3 n( G8 k6 l; T- v delayUs();8 n' Y1 ?2 ^$ ]! s, M. T. q/ N7 l; |
LCD_DATA = dat;
% _7 y s& I1 R# Z: \ delayUs();) v- \8 }2 D; N
E = 1;; A) ~' b: U- |5 U( r2 k, c
delayUs();# w2 i+ `6 `" |6 n& T
E = 0;
. K) l: m5 ?% M8 j4 M}- d) }% c# \/ |* ]$ ~0 U
- n) C# w5 S9 v6 B3 K+ L//初始化LCD5 F* F' ~4 [+ d2 ~0 u
void init()" V) i1 c }' L& w8 s% F
{1 t1 Q& _5 I% K( u2 c: A1 x$ K
PSB = 1; //并口方式
7 }- s$ n9 f# d8 M writeCmd(0x30); //基本指令, 扩充指令为34H" [9 Q p) U! |& i
delayMs(10);
( N0 G1 m3 L6 Z writeCmd(0x0c); //显示开, 关光标5 V7 D' n% q" \+ O
delayMs(10);$ n+ t( X' h8 j0 l9 p6 I: M+ {! E
writeCmd(0x01); //清屏
* ^8 q6 ^+ K, Y0 D, h2 r) n delayMs(10);: {. z! ?4 y$ W- w
}
# M( R8 n* X/ S
, y }, o z, Q. ~& C. h9 \# N3 ?void setPosition(uchar x, uchar y)
+ I3 O( k! A) S{# B) M8 `( S/ l. C& D
uchar p;
( h6 i# W ~* I. {8 x switch(x%4)
( R7 j+ F4 s) J; Y {
( H, q4 B, ^1 E4 T- ]2 n case 0: p = 0x80; break; //第一行开始地址
9 F% e! d' ?5 v) T$ ? case 1: p = 0x90; break; //第二行
- V2 \6 O7 \/ r: ~# V case 2: p = 0x88; break; //第三行
. @8 `5 t, g' t8 t P, A( C case 3: p = 0x98; break; //第四行
4 v6 e g; C2 F$ a/ m }
, _. l1 I! n* \- G4 u) {* c8 D+ L2 ] p += y;
( ~* A& o- @! U4 F# n0 C" L( K writeCmd(p);) J$ ~! |1 ~) A# W2 \/ N; [
}
/ L3 \8 \' j5 D1 I+ t5 R Ivoid writeString(uchar * str)$ {1 Q; _+ Y6 q' V: D
{
$ L$ |. Q5 }' B2 G uchar i = 0;
" Q4 L! m$ }0 H2 |' q% S D2 s while(str != '\0'): q/ D& z6 `. v$ R
{
( H' w2 ~/ T5 K* Z% W1 Y writeData(str[i++]);" s! m5 V1 {8 F5 g" I( W- ~
}
1 _% v, R3 @5 b: ?/ r}; r- w6 i( x( D) p
* j5 H2 {) ]8 t+ s
/***************************LCD12864***************************************/
% _5 U, Q; ?0 }6 Z* z7 _
9 W k# r2 T/ x$ A# @4 Tvoid main()
; O8 j4 Z- I2 c$ h/ |{
+ S: a! C& y @, y //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
6 j) n' m) D/ _) u! A: D/ J dula = wela = 0;
5 @; R- {9 ? Q4 @9 n, }: H init();
0 G, V) Q& R1 ?" ~. _- ^/ t setPosition(0, 0);& Y! d [) o/ ~" B+ S% j9 V, o
writeString(datas1);
6 \+ k. e# h/ F7 P setPosition(1, 0);
) O& n0 g& j2 J9 z writeString(datas2);& }* j/ `2 x) T2 p' P) b; e7 G
setPosition(2, 0);; V' n: Z# L+ S. _& j5 {% w5 d
writeString(datas3);& f7 U% F3 ]9 Z
setPosition(3, 0);
" V4 y8 M' h$ A7 S8 K# ? writeString(datas4); ]& e1 S \) Z+ m
while(1);1 r! ~5 q0 B' j
}
) o3 u; v9 S+ v, h |
|