|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释.$ t l1 N3 I# _+ q( D9 R
* j9 M/ `" ~ b# J7 z* d//带中文字库的12864LCD显示程序
+ N) M, l( R+ ?6 ]2 S#include <reg52.H>, r$ j; H! \/ V; I
#include <intrins.H>
9 s- f* A5 G' ~4 c1 F8 {
0 A7 Z1 |7 g- T4 H/ ~! L( \- C#define uchar unsigned char
+ z# l& i6 T2 H- @) S#define uint unsigned int: E) Y8 k5 U% ]" b, E
4 [6 x+ n5 U4 A
sbit dula = P2^6;
' @4 `1 Z9 l7 i, J% lsbit wela = P2^7;6 u$ o$ B+ \: {- q2 {
//SCM12864-05端口定义
* z Q; O3 `' b#define LCD_DATA P0 //数据口
& [' `) C+ [' i; r- _' o! Ssbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令4 L. L F! b5 f* _, M
sbit RW = P3^6; //并行读写选择信号, H读, L写
2 S- J5 ~% C# @% T( A1 qsbit E = P3^4; //并行使能端, H有效, L无效
1 j- X0 Y( i; N" B! c2 bsbit PSB = P3^7; //并/串接口选择, H并,L串
k, ?) e" U. i4 Q; ^sbit RET = P3^3; //复位, L有效2 v U' e4 e5 n2 r( g: H+ Q
1 j& h" w5 S! R
uchar code datas1[] = {"广东工业大学"};8 }5 k: u3 k# q- `+ O
uchar code datas2[] = {"自动化学院2004级"};# ]1 t! x2 K7 v* J
uchar code datas3[] = {"网络工程 (4)班"};
/ C/ R1 l7 C: l7 r3 h0 g6 [uchar code datas4[] = {"fengmk2@gmail.com"};2 R- X O# m3 T5 ^( M
9 t$ t. `$ e6 Z9 W% b% ~* S
//延时约2us) Z# u0 X6 R* d+ K" n* i8 V
void delayUs()' b0 }# g S1 k) Q' R3 X
{
% C9 ?2 l& k# E2 d) {: r* A- U _nop_();_nop_();: u/ @; w- r) N! R; f5 z( v# t
}* R" H2 D: e! A8 j0 A. B# B* n& n
//延时 a * 1ms
! {# v' T6 A2 h" Ovoid delayMs(uint a) V( {$ U% |# h" c( i
{
( L9 T- h+ ^$ B! C) P uint i, j;" j3 ~: N/ f5 H/ ?& c* x
for(i = a; i > 0; i--)+ b' q: g1 }$ W
for(j = 100; j > 0; j--);
, J0 [& r' J6 t. Q}, {9 G. b- l& }: |. d
1 y4 K! D6 P4 |7 a5 k//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
7 C+ O& j( y1 Y. m; x- Mbit checkBusy()
7 c) Y$ O2 F6 q{
0 w) e5 k+ C# R2 A- i) D7 k) I bit busy;
+ X% p8 m0 y& Z" L* C% P/ |1 k, Y RS = 0;+ o8 F0 n6 c) y' V8 h0 i) l- |" x- m
RW = 1;
* v. w$ s8 ]# l0 @) U E = 1;
4 d! M/ U& n6 Z e8 O# y delayUs();1 f" o& G7 o l' _' ^3 d
busy = (bit)(LCD_DATA&0x80);1 S( a# l1 n4 V* Y! q. e
E = 0;9 m/ j" P! D+ h; f1 K! u/ Z* w
return busy;* v( N6 o+ _4 J/ k
}& F3 [" T8 T9 v/ S
2 x' Z) Y$ k: J: B* T/ U1 e8 f
//等待LCD到空闲
h! X( D B, G2 l) G2 \ k* Nvoid wait()
* u4 i8 {2 D9 D+ l{
0 b; y# f, N4 l5 d while(checkBusy());! s+ b f" M- A0 y5 w
}% F1 L0 y6 \+ t4 {) k9 q$ G; q
) C; ~- x |( T u6 C' q//写命令" q: g+ [4 k; o' ^
void writeCmd(uchar cmd)
. K. {7 h6 a- C9 y" M4 E( \) ]{
7 Q1 K# v. R. e7 u% k8 J wait();, K, |5 W t& j- e1 y5 Z7 [
RS = 0;* k4 l( e- A! n$ {! n' [
RW = 0;: ?* K/ W) `9 H `% v& _
E = 0;
6 E7 M$ t; E m* v" [8 E4 B delayUs();
# w8 I U( ]* b6 X2 L LCD_DATA = cmd;3 g; o6 C9 m$ R# _9 Q
delayUs();' ^* Y9 s7 X% c" k
E = 1;; b2 x9 [+ _" j% S: }* b
delayUs();0 z% s, W: v/ D0 r; z0 l V/ q
E = 0;
* f9 w& L5 d/ w8 [( n1 Y& U+ N}
. a1 L4 T5 \9 k- }% W( n; Y3 D& y+ r* m/ t
//写数据0 B% Q2 j! r4 M8 [7 N) b5 p
void writeData(uchar dat)
' F+ i" _5 _# U. G. ~+ B6 a P' m8 v+ `{
) w, y: d. x( L7 \ wait();5 c: c; Z3 R& Z7 P2 A( @9 }
RS = 1;
4 X ~7 ]4 ?& Z/ K+ ` RW = 0;' Y8 l: n+ Q8 L5 `
E = 0;
A, j* e4 Q7 J delayUs();
+ M% T2 }6 X3 P8 Z8 h1 i LCD_DATA = dat;
5 @6 Q) p+ ~0 @" O delayUs();
, D& y! V2 q; B+ d+ Z E = 1;
4 R2 C# U( } \* [% y delayUs();' J8 [0 Y; T! P( l, @ } Q
E = 0;
8 e( ~# r% z% D/ r}
: A. [8 h$ Q+ q5 z/ F* t: D' [, I2 P8 g M2 }* J
//初始化LCD
- b% Q2 F8 m! X4 gvoid init()
& L2 v3 B1 f' F8 F; }7 i7 [{
' G0 `4 G$ q4 J9 B5 N+ g4 g' q PSB = 1; //并口方式$ _1 E! I6 m) ]% o) c. U! o
writeCmd(0x30); //基本指令, 扩充指令为34H7 C* @) v7 k5 ~ w! X, v9 H+ R
delayMs(10);
( D' H d% r) t6 Y, U! X$ W writeCmd(0x0c); //显示开, 关光标
* [2 b; J) J1 p- Z; C, n delayMs(10);
' m* a/ @8 k, p+ |4 K/ ` writeCmd(0x01); //清屏
* c& g8 j. {3 H- E! O2 x' r9 \5 _ delayMs(10);
: P: u' n5 S }. s}
0 b T; W7 }# V2 Y4 u) P* U2 M0 H. h) y: l2 m
void setPosition(uchar x, uchar y)" e1 q3 R$ J: N4 z
{
. v4 o6 \- ~% e2 S uchar p;
' h5 N# T3 b8 `/ A7 { switch(x%4)
( M' G+ z$ V0 ?% J3 }( Y {
. o& \% e* q: M" T case 0: p = 0x80; break; //第一行开始地址- @* K; k6 f( e
case 1: p = 0x90; break; //第二行
. N2 O: o) \! O# V case 2: p = 0x88; break; //第三行# n( C; ]4 d. n, {- V! F
case 3: p = 0x98; break; //第四行
; c) l8 X: l( `4 F6 @ }5 n* p) f! o3 H: \4 n9 f- o+ E( K
p += y;% R: U" e4 J; U5 ~4 i
writeCmd(p);
4 `) K0 C8 }) k" R4 m7 l- L! M! J- D}0 l6 e) c8 H9 @1 L j) O
void writeString(uchar * str)' t% c( p7 w- g2 f% N
{8 w- w/ L1 d" ]3 }: Z9 w
uchar i = 0;
8 O) [/ F2 \& [8 ^- m while(str != '\0'), K0 X6 m+ C) y- l( N! d: g
{
) k6 X! L4 \/ K t- z- V& A7 G writeData(str[i++]);: ~: ~% i. y/ R
}
/ z% F, C% f" O" e* }% ?}& x6 ?& {3 `; ~. A
, O$ u/ v3 Z# B4 t" O/ Z
/***************************LCD12864***************************************/1 A1 [3 E w7 Y* j& ], x% r7 e" i, t+ G
. H+ Z+ P/ z" n; b' B& Bvoid main()) [0 H. @( x0 Y9 R
{
# ~6 r) o* G8 g4 C1 g8 @3 [ //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
1 z( X1 o* Z# P0 e' ]- f. d- K3 E dula = wela = 0; f3 H) d8 S! x* V. r% P/ H' b- I
init();
& I* D! t2 C/ }0 a U: D# h! d setPosition(0, 0);+ Z. y& e9 @; p" D+ e; N5 k
writeString(datas1);
$ O2 V2 P3 ]3 K( w setPosition(1, 0);
8 V: ^- k" e) [8 n+ ` writeString(datas2);2 J! d4 n' r% \* n$ d! J8 ]
setPosition(2, 0);
6 w7 X) r# E/ t4 O# | [ writeString(datas3);
: M; K9 g0 }7 z% k _% {/ H# y setPosition(3, 0);, o0 J4 ?, K- ^* Z2 t
writeString(datas4);
3 E( E& c( J2 {" v) G: J: e while(1);6 F( P1 x4 Q0 k8 \+ i+ \" A3 y; B) _* q
}
" Z- Z2 n6 r+ ^: l, R |
|