|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释.
: q5 O" j- l% G- l3 {* i9 u. y& D- h9 p# Q0 H: R% V
//带中文字库的12864LCD显示程序$ Q- H1 t* F) v! X; p; n& h0 T$ R
#include <reg52.H>
5 p3 y+ ?4 q5 p( E2 f#include <intrins.H>
/ {0 A2 i0 l F+ u, d
) ~( J4 K) T6 t1 F5 B#define uchar unsigned char
& G* |( V( p {9 ^ I# u#define uint unsigned int
6 M9 P( T# Q) P) b: ~! ^
3 g, q9 `3 ?# bsbit dula = P2^6;
$ _1 ?0 @% ~1 {' o# p* M3 Bsbit wela = P2^7;
* ~* h0 \7 a1 g, D//SCM12864-05端口定义
' G" o. w+ y/ ]& O; e#define LCD_DATA P0 //数据口
: L6 c1 U7 G( _ s7 `sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令7 A* Z/ r4 v% c: t4 v* ]1 I9 C4 U
sbit RW = P3^6; //并行读写选择信号, H读, L写& u) B/ t2 k2 q9 C
sbit E = P3^4; //并行使能端, H有效, L无效( W+ @; N: B; X2 d K. b
sbit PSB = P3^7; //并/串接口选择, H并,L串$ v# z6 L1 R$ G# n- I# b
sbit RET = P3^3; //复位, L有效
$ x9 D P7 E! K2 f% E
9 o% z' c- L3 ]1 r9 s. buchar code datas1[] = {"广东工业大学"};
6 Y B- L' D. E2 huchar code datas2[] = {"自动化学院2004级"};# ]! o7 V) _9 h/ B7 W/ l
uchar code datas3[] = {"网络工程 (4)班"};# \& P8 a7 ^ m0 K
uchar code datas4[] = {"fengmk2@gmail.com"};' W h' J& \8 w$ M0 ]5 ~/ r4 ?
+ `" r. j0 o3 }$ R7 Y
//延时约2us- g6 V6 ` a& f; t! d+ k0 M
void delayUs(); Z7 G% I: m* b" u# [9 ^
{
B' W8 h# @! ~ r; r _nop_();_nop_();" @6 M: U3 y" L9 H L
}+ Z9 ~+ |: T, k2 f/ O7 j
//延时 a * 1ms* d% |! m. a! a2 z4 D7 O, d; T
void delayMs(uint a)* e- D) ?% t: j
{5 J2 Q% `$ a+ N4 y( f, p
uint i, j;- k* l- H l2 _8 n# J% _' i
for(i = a; i > 0; i--)
) A7 Z2 M) X6 d1 u& o for(j = 100; j > 0; j--);
# R' G# \1 e: O6 q/ k0 n! P- p}
+ M: \4 J7 x! J8 S; `6 ~2 t) \+ w( \' S5 h: Z; r2 X
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0- A+ ^* l6 i* C$ y" W6 G$ K' i# ]6 k
bit checkBusy()
) Q5 [; p3 V# W0 f& @) Q{; f. | d# ^9 x3 Q8 ?
bit busy;
6 [' G$ Y1 P' Z& W3 [' L! a RS = 0;$ K$ o6 r) z1 S2 n9 f% h- z
RW = 1;+ O' h- \4 r6 e( r
E = 1;) A( |* N, ?% U
delayUs();4 X% t; ~; D# F7 w9 K$ E5 |" u
busy = (bit)(LCD_DATA&0x80);
3 q3 P' y2 x C2 a+ {7 Q" T E = 0;. S& C' m0 N; O: b' w6 E+ L
return busy;
' p# J* H$ S$ }2 e: a! h}
7 v8 k! b; {" v Q0 ]/ s- }% o/ v
* y5 o u; A$ h9 |8 \# g& C//等待LCD到空闲5 x/ e" v# |1 A$ T' y$ B$ h8 T, A" q
void wait()
9 u4 I# p9 x2 c{2 r, Q k" A$ I1 [
while(checkBusy());
% ^6 ?; O& F+ a" h6 P. S8 o}
- U$ s) c; ^9 v
' S" k8 Z& b5 K) f//写命令
4 S( w+ K( `4 W8 m( B" W; bvoid writeCmd(uchar cmd)
: C5 L1 {1 f0 o! t{
5 S( Y# A: R' Q5 ^, s wait();/ \5 ]5 J. N# d% O9 Z9 e0 r1 M
RS = 0;
$ V0 ?8 L7 \$ T0 V, W' l" h4 R: b RW = 0;
( W; X6 F6 {$ m E = 0;. [9 p- z) J2 |) X4 E
delayUs();1 x5 }; e! h% O6 i& T7 a
LCD_DATA = cmd;
0 P1 S- I! h% X9 O! y delayUs();
; s/ e0 D* z0 _* N% { E = 1;/ w }: W8 o( S7 `& ?; C
delayUs();
# X) w/ V1 |6 O E = 0;
- f# e1 H3 {+ B+ C3 M}' }6 O. {6 i6 ?" a' X
. T: b. ~7 j+ c$ U0 a1 A, o' O T
//写数据5 t( Y3 V8 _4 _* X
void writeData(uchar dat). M8 G: M. Y' M/ W8 A
{) t* w& J2 w! j' X, R Z; W' Q
wait();
6 J: r8 Y" y0 a% s2 |3 h1 k7 E5 A RS = 1;. x2 o `5 |" q9 k& @( h, k
RW = 0;% v1 I! j j1 G& K' i. `
E = 0;
* B; R$ a$ F+ l7 e( A0 F. s delayUs(); V. Y% i# `( | q% v. |
LCD_DATA = dat;4 |4 j/ u+ a5 b e( Z
delayUs();4 E/ n/ J1 }. h+ E4 a
E = 1;
# Z( J: A1 i8 H# l1 |6 M delayUs();; K3 r# b( ^# x1 s4 m# E
E = 0;
& k) \0 y y- O7 N: B$ ~}
4 p) w4 Y7 a5 N5 h$ j1 c( U$ z( q8 m% B g" x
//初始化LCD/ N p/ |8 ] ~1 g
void init(): s! H7 }+ ]. k3 X) M
{
# P* P) @4 Z3 B# |9 V! \ PSB = 1; //并口方式( e8 X( }% |: k+ O) P9 M
writeCmd(0x30); //基本指令, 扩充指令为34H
2 U" x4 w1 I) h* R$ t4 M( l delayMs(10);$ {4 t( Y. Y& n# ~1 o
writeCmd(0x0c); //显示开, 关光标9 F* o2 `, f' z$ @% c T" ^( O* K7 J
delayMs(10); V, @( k' G/ b: m u/ ?5 K
writeCmd(0x01); //清屏
1 A; G% X N' F ^/ r delayMs(10);
8 C& S8 s1 i: }7 H3 a}
3 q: ]# P, S& R6 r- ^
8 O' [4 Y; Q; Ovoid setPosition(uchar x, uchar y)
X/ E7 ~/ T$ P1 O: N{
9 h) ^. a' S8 C6 W! W. S uchar p;
7 z6 V. f3 F* D; G7 i6 O( s switch(x%4)
3 Y, @7 x9 ]" z- X {' @0 X' n4 g* r
case 0: p = 0x80; break; //第一行开始地址; F7 m* [0 I$ v8 v
case 1: p = 0x90; break; //第二行2 P4 F- O1 M4 c3 c" J
case 2: p = 0x88; break; //第三行
& D* C) d9 u& p* T8 Q( b case 3: p = 0x98; break; //第四行
2 [2 }0 j8 j: b$ r" K }
' Q- G5 [6 y T1 m& {# n. q$ H p += y;
+ j! Y6 n5 ^, T/ w- B writeCmd(p);
: l0 c6 h8 u# S6 V}( Q7 K: b& y" @& P
void writeString(uchar * str)0 n4 R& \# }* I6 S
{
; T; Y& J( M! R! f+ ^9 j uchar i = 0;" M: J$ B+ D: T- Q+ N0 Z
while(str != '\0')/ E' g' l! Q0 e+ o" d, z
{% e; j s: q# B# a
writeData(str[i++]);7 {' d+ G/ V1 f0 G8 O+ z- M
}9 H& c; _9 Y( C) d, L1 G
}
1 b$ r; l: |! z" H/ Q7 c: X; Y% o
! p: |$ W6 n2 @+ n; [- \/***************************LCD12864***************************************/( \" E* w( J5 u2 b
: }/ R! X" R4 ?0 V
void main()
9 g+ ?8 D* M( V+ x7 E4 g* O* U{
0 U% D6 C9 |* g* O9 A* Z //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作 f& Y$ m3 @( ?6 U5 \! n* K
dula = wela = 0;
2 u" I' ]0 c, ^- e init();6 M1 c0 \ R% U5 Q* P7 h+ l& A
setPosition(0, 0);, [5 D* l- }# T+ H$ n2 }% K( f( a
writeString(datas1);
' _( a+ ?3 j' D: ^ a" M& R setPosition(1, 0);! N- m1 l7 f0 D1 @; ~
writeString(datas2);
( l8 [7 M Q" w$ z+ ? setPosition(2, 0);
; `# R; U+ D8 C+ ]9 l- { R writeString(datas3);
, [* N: J3 B" `4 e# ]) P setPosition(3, 0);8 j! g. m% m3 k1 \& e
writeString(datas4);
4 I4 ?. Y: G0 u7 s- |( @ while(1);, j1 H1 C5 L1 [0 {$ |2 K
}/ P6 j6 `& x) ?% y( m+ @
|
|