|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释.
) r/ ?) j) i9 s( s) c {5 x# M9 w# q" p: |) d- ?1 g
//带中文字库的12864LCD显示程序
3 D, I# W0 u. Y% h+ v#include <reg52.H>
3 D2 E/ [; s( }1 _#include <intrins.H>8 H4 E" f$ x( b# _
7 m7 h5 p, q6 g8 h' a6 R j
#define uchar unsigned char& O5 ~8 j5 s6 b$ Q/ e) M i3 Q
#define uint unsigned int( J1 ^5 e' o3 M0 u9 }
7 V1 S' q S3 D& F
sbit dula = P2^6;
" `. ~; P% y9 W4 V3 H& nsbit wela = P2^7;8 m( e/ B( j! k$ w9 ]6 Z- M8 k0 ~
//SCM12864-05端口定义
: E, h& X3 t# k4 w! R- z#define LCD_DATA P0 //数据口, B; n: P# v9 M, Z9 F, N3 N
sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
6 { J- U0 Q4 p( U5 t% Esbit RW = P3^6; //并行读写选择信号, H读, L写/ {& l4 w) y" X7 m8 y% z4 V
sbit E = P3^4; //并行使能端, H有效, L无效
) W& v8 D* _* v% u T- ^2 N; vsbit PSB = P3^7; //并/串接口选择, H并,L串; k2 o) ]! R( n {, n& [2 `9 |
sbit RET = P3^3; //复位, L有效8 M* R/ |# h% e# L3 \6 _1 U, x# E G
- r+ T0 g, J% y: t/ n
uchar code datas1[] = {"广东工业大学"};
; h5 Q9 e. W' a+ G4 B* ~uchar code datas2[] = {"自动化学院2004级"};. J3 H; n3 T& W3 {4 ?9 T3 q. z
uchar code datas3[] = {"网络工程 (4)班"};7 Q8 [ a9 `6 d0 Z. f
uchar code datas4[] = {"fengmk2@gmail.com"};, _, p/ i6 f, ?( q, A" S/ \
4 K2 k) U' x9 \# a& ?6 d% j/ Z
//延时约2us
: Q3 v4 M# w1 p* O( S+ ~void delayUs()* L0 I" x' b% G! V0 R: G: \! O
{ _( S6 D- p1 Z
_nop_();_nop_();- \- N0 v! q- M' ^( @5 I& l
}
" H0 K$ y! k9 ~: ` |//延时 a * 1ms: D8 A5 I! H1 K. B7 F) C( O
void delayMs(uint a)% x/ h' A2 ?+ F( {
{
6 W7 x% T* F/ r uint i, j;. O+ V Z" U' a& e/ R( P% T3 F
for(i = a; i > 0; i--)
- c! g, |1 ~8 } r( n& D for(j = 100; j > 0; j--);# y! l* p& ], |- r) x
}, J- j2 @7 |* l! \& Q
. B" K6 z3 H# h# a//检测LCD是否处于忙状态, 若忙返回1, 空闲返回00 ?) j& u% |2 F7 Z/ A' V- l7 ?
bit checkBusy()" M% \$ ^' H0 H) u. C1 a" }# ?
{
& k1 t: {9 ~6 n- w- M' @ bit busy;
! P4 n6 C+ v1 t. n$ u1 v# V RS = 0;) g1 E' c3 E- e# l" x
RW = 1;
3 z# l3 Q1 j: I2 I E = 1;
( X: k- e3 E* r5 q9 p delayUs();
5 c$ Q/ K; |6 l# W: A c" k busy = (bit)(LCD_DATA&0x80);
# t Z; L5 [( l8 u8 B1 Y$ F1 w4 g E = 0;% h7 g4 K' L/ Q! h
return busy;
& v" z1 T7 R$ o" i( N}( N# A% p9 V8 v8 d' D# |
' |! o9 P: j, N* U& D% y//等待LCD到空闲. L& y0 \) L8 ~+ X
void wait()5 z# {. K- e# K& H/ Y
{# o/ w- {8 R2 G9 P% w' T0 b5 Z
while(checkBusy());
# w3 K$ B. K4 ]& O1 C}
& U1 T: G: H# y2 `% x+ w- z% U X, J, e! [7 l _7 s* Q
//写命令: y! C0 c6 B7 U D
void writeCmd(uchar cmd)2 h9 n. w n6 [2 `
{
2 h0 K* B3 D7 f( h% _0 u( v wait();" [% K [! w. X
RS = 0;4 n: T8 U$ Q+ C% q/ P9 T
RW = 0;
+ ?/ y4 A! @% i/ ]. b5 C: V7 S E = 0;
; d. i9 q) K: U delayUs();0 p" N' H: z6 s. i) H* q8 R
LCD_DATA = cmd;8 s/ _/ k7 [( ~% q; N1 s$ }5 O
delayUs();
( l; B6 D2 p# r/ m. x, k E = 1;
* I( a1 s( y& K, R1 b delayUs();
* X, ?3 v: I4 A! r% ? O E = 0;
; _! {- k) A z( ^}
H& B$ j: x" D- u; M* h" t ]1 Y' H3 } v- o1 e# F0 y
//写数据% M$ x+ d/ e- `3 T' \1 a
void writeData(uchar dat). A! _- N8 T( d
{0 k4 {( x f; H- M9 N: d, D
wait();0 t8 W* C$ N3 X6 ?
RS = 1;: E6 Z6 q& v B+ H# _/ T/ z
RW = 0;
1 C& C, w; t6 A6 K E = 0;
% S9 h- g! r3 Z! u5 u: m delayUs();3 a9 o/ }( {8 t! F4 P
LCD_DATA = dat;
0 h& i0 u) O. e delayUs();- v7 E6 b" G1 ?3 r% x! y
E = 1;! l" y4 M U. i; [1 }* n
delayUs();
, l5 _) ? y* v2 D5 j E = 0;
9 G) H( X* f. @0 y}& |' M; y7 |" G5 N
1 i _0 Z/ j% ^3 n; I% I
//初始化LCD; F. o; y5 w3 H8 x( Y. E g l! w
void init()
5 f' J) t7 K# J9 H$ r$ v{
: `3 b; c1 S$ m PSB = 1; //并口方式
9 @6 S8 \* I0 t$ C writeCmd(0x30); //基本指令, 扩充指令为34H! f8 R$ ^, H2 D8 J
delayMs(10);/ g$ W2 R8 R; D6 M9 d; X
writeCmd(0x0c); //显示开, 关光标
- m/ T0 t9 T# j delayMs(10);- y! q$ a5 y/ r# }+ ]# {. h" L8 x
writeCmd(0x01); //清屏
7 `9 m7 {( c" c$ d i: U delayMs(10);
G' N% w8 w( u7 V4 N, \% c H* E}/ i8 x* W0 }+ |1 z
3 R' [- ~. G6 T5 X+ Y% }
void setPosition(uchar x, uchar y)
- Q8 S+ x! r% U4 U- j{1 g$ U6 {$ I$ c/ {% j- H! E
uchar p;' p; k" c& C9 `( t! C$ N! ]
switch(x%4)
) D; _3 O4 Y( k3 n {8 N6 G$ O5 l: L& @" F5 D1 R } X
case 0: p = 0x80; break; //第一行开始地址' Y3 q' M1 g; {/ ?8 w+ X* o7 [' |( L
case 1: p = 0x90; break; //第二行
3 p; S- o" q; {; G case 2: p = 0x88; break; //第三行! I* L, H' e5 x) Z
case 3: p = 0x98; break; //第四行+ e; a0 w) ]+ @3 g, s0 }
}4 |* A6 z3 o9 x1 l$ t' i
p += y;6 O) \; M/ ~9 w
writeCmd(p);
B& [9 K' F. J- P4 q3 W9 j+ f} u' _( E- M4 r# j! T1 a
void writeString(uchar * str)* X$ ]2 o7 D$ ~0 I7 n( a
{
0 s7 j! r3 Y) D) U9 u) ^$ Z$ C uchar i = 0;. ]3 O( x0 R' w/ o1 d
while(str != '\0')
9 {/ b6 j4 i, a+ S5 E/ m, p A {
# \. ?; e. K# \/ ` writeData(str[i++]);" _ |# E0 L* h& O' |, k1 Y
}
0 ?! V* [7 X6 y% H$ X( E}6 T9 C, ]! f2 s6 t7 L/ M
. X/ O7 l" S: z2 z) t2 Z/***************************LCD12864***************************************/* l( w; Q2 v! a8 f0 ^, J8 N) F
) |; j9 \/ ]8 F
void main()
; J$ t6 H6 |, V4 F4 x{
4 z- t4 b, s i- l- M' J) r //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
: ^1 R6 C$ @( |1 Z6 c- O dula = wela = 0;( H0 V+ k6 k4 a+ J6 L
init();
% e% O" @$ g7 U7 t/ O/ F setPosition(0, 0);& s7 x8 c8 w' l5 ?
writeString(datas1);7 ]! n6 N- B: ^
setPosition(1, 0);
' D, d5 r; O" K2 L" [' v writeString(datas2);
}7 b, ]: I) w8 L3 O) H setPosition(2, 0);8 Q k6 S* J: y+ h3 b; _$ w* L
writeString(datas3);
1 |- y2 W {# B2 u3 b; T setPosition(3, 0);
4 r4 N/ \: |( x1 N/ \7 ?# D+ m writeString(datas4);
8 v, d/ B! O5 N& r; d! I* B4 N while(1);
8 y- A+ M. @8 z9 I}
9 c, H- H6 \: ^( ]2 r. C |
|