|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
I/O接口与LCD引脚的连接详见源代码注释.2 K5 y/ `4 u* |; B8 |
) ^; ~3 U! o3 L6 A/ E, ~( a3 u//带中文字库的12864LCD显示程序. w) e$ g5 X, `! B' C; N; Z1 v
#include <reg52.H>4 l- |' O) E% n( j
#include <intrins.H>( p: J; Y3 l6 Z" @
: \4 u x- A* H& g! g$ S
#define uchar unsigned char
% x# z: y/ o d. k, P5 f( k0 G#define uint unsigned int
9 B% S4 `4 e/ [; \# M7 c
7 G: i+ r' G- r1 }+ I- ?6 nsbit dula = P2^6;
/ i5 N& U1 s d; E0 u6 Esbit wela = P2^7;
. f% G% i1 |; c3 W0 n' z9 l: |//SCM12864-05端口定义! N6 m+ o) c* O; `' O- |; R' N
#define LCD_DATA P0 //数据口
4 R6 ]3 C) d$ ~" m+ H/ e0 `sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令' D, B$ h# ~! p
sbit RW = P3^6; //并行读写选择信号, H读, L写! G, P3 ` L1 K% _7 |
sbit E = P3^4; //并行使能端, H有效, L无效
- W. B/ X J0 ?7 u5 I' T6 |8 dsbit PSB = P3^7; //并/串接口选择, H并,L串% N4 O- g; w" y2 r8 n b/ C
sbit RET = P3^3; //复位, L有效- ?3 U& e4 X- V/ l
! S( E3 e! X- Juchar code datas1[] = {"广东工业大学"};/ P4 q- n) \: R& x! _; j
uchar code datas2[] = {"自动化学院2004级"};
3 p2 Z d) Z6 \' x) {. m8 Buchar code datas3[] = {"网络工程 (4)班"};
3 r- t0 r* T+ tuchar code datas4[] = {"fengmk2@gmail.com"};' c5 z7 @: {2 R: V, C
& X! t# |$ D5 f& x+ N) P6 D" B
//延时约2us
$ w( S$ g {# O2 |3 r8 o3 v0 Zvoid delayUs()0 Q) N1 v; u: @$ [; [
{
! x$ ]; I3 s- i( l* ?. e* v6 r: X _nop_();_nop_();
6 [5 x+ u1 |3 p, P}. K9 O2 Z' `( w( O- q2 @
//延时 a * 1ms5 l& r' ]# c) H( ?2 c0 ]
void delayMs(uint a)
% r' ~5 p9 ], a2 Y. q& h' Y4 L# r{
# @$ x; l; J& J7 ^1 O9 D7 @ uint i, j;
$ C/ @2 v4 D) a; [" p% s7 l for(i = a; i > 0; i--)
9 a1 s" Y) I$ x, z for(j = 100; j > 0; j--);
+ e* q7 n. x D. {2 A) f! E}0 o ~- S9 X; M) Q
! a% }2 `. i3 ]4 J! F
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
_! i) w9 P$ l& ebit checkBusy()$ b$ P$ }0 U6 [0 `8 f+ m
{
& c: O- c9 {% i( x* E. ]% g bit busy;# |% X/ Q5 R' c- {, j/ _# d
RS = 0;
8 L3 I, ~' h) b$ r9 B RW = 1;# s! Q# u. t* e/ h. S j* S
E = 1;0 o- K& k: y+ |- E
delayUs();
r1 C5 T8 ~" B8 n& } busy = (bit)(LCD_DATA&0x80);
! l S3 Q! N; c E = 0;
0 O8 r2 ^! ^$ D return busy;2 J' ?4 m5 n, h( k
}
' D$ o$ h) _2 P$ f2 m$ g2 G+ ]. N: g* ~ f* Q7 q
//等待LCD到空闲
7 L/ z$ [& Y- ~# n- h7 i3 }void wait()! M6 u: H: B' N! r; Q5 h
{# b$ @4 e( [; ^2 g8 T a; R5 ?) o
while(checkBusy());
9 Q& X) `5 X2 W5 Q}
" ?" |# Z" M! m; s+ r. s- W& u F0 F; ~+ M1 U% `
//写命令
% J8 Q$ a$ y' N, r$ K+ W' \void writeCmd(uchar cmd)8 Z0 O7 ?6 S; w7 R. k e! I" G
{9 w2 j2 R9 l/ F4 F9 \! k
wait();- J$ P" G* g: @0 z
RS = 0;# }( C2 x' V4 d5 b
RW = 0;
, A$ X' w' e$ I% n4 \7 w E = 0;
- T) R$ T2 n8 |3 X4 b8 t delayUs();5 Z/ ]0 c% z' {
LCD_DATA = cmd;; K1 V) F8 H+ ]
delayUs();
% N6 H* t$ x# ~+ p: M3 I7 Y5 w: C& _ E = 1;
0 m5 V4 I2 |4 f+ g, w- k) U delayUs();- Q) c8 T5 h. u4 J+ a
E = 0;
5 {" N# ?7 [. F+ X}
; Y( N0 v% l4 `( M w. V& \
4 }' C/ K& r0 Z//写数据/ r' `9 B6 d1 L% F" z
void writeData(uchar dat)
1 ? g/ ]6 p) ~: u* c5 T{( B# L ~ D- \! y2 Z: }- z
wait();# f4 Y7 x' J0 @+ C1 E+ |
RS = 1;
2 p6 L! B% ^' r j: j RW = 0;0 h3 y, n) J7 v' U9 Z
E = 0;: D: l8 O+ B) f; O. @% Q4 x
delayUs();
/ C8 N6 M2 \3 f b4 ?/ H+ h- Y LCD_DATA = dat;- _8 n, R) m9 {$ d3 a/ M; [
delayUs();
, T* t9 s1 g7 ^! Z+ ~4 p$ x. Q' @ E = 1;
1 p( G. F& f" \4 p* i delayUs();' S0 q' A) Z+ d- o9 X
E = 0;4 i3 n, ~$ r: s
}
" a7 s d$ ?+ I$ ]$ v
. z0 B6 k$ {/ ?5 e/ H& @+ O//初始化LCD y, Y3 k7 x& M8 r6 Z6 [, u% Y \$ A
void init()
" L' S2 x, R0 h! P{
9 _. m/ h. J1 Q& g PSB = 1; //并口方式 S2 E9 d# A) H# y9 c
writeCmd(0x30); //基本指令, 扩充指令为34H, }. `8 K! {. u" y# x* ?8 h3 _
delayMs(10);
, o9 z1 I; G: l( e& k6 Z y writeCmd(0x0c); //显示开, 关光标
, G7 R0 X/ V2 p8 q) p* [ delayMs(10);
2 v1 d$ y" M, w2 P. z writeCmd(0x01); //清屏
3 s" d" f) h0 F( p6 \* O! j+ V/ K delayMs(10);: j2 T$ Q. O5 b3 J* T
}1 D. E/ w% h- c& A6 e1 y
; |! [, ^0 e( U$ @0 \$ p1 \. N! n
void setPosition(uchar x, uchar y)
! f) I; X+ U6 n{
6 C ?9 T$ u% D! U uchar p;
0 o/ q6 s$ x* O1 H switch(x%4)
0 ~7 {! o) X/ c6 ^3 o2 r9 s {
" B' L" Z5 U% ]4 m" f case 0: p = 0x80; break; //第一行开始地址9 `7 M G" F1 o X- B9 _! i& `
case 1: p = 0x90; break; //第二行3 m. o- l) O9 w
case 2: p = 0x88; break; //第三行2 [ q/ E5 S d' K6 e. S7 s$ V5 d- Z
case 3: p = 0x98; break; //第四行, ]) M e* @. Z
}
5 ]6 K# _6 M# b p += y;8 e7 a3 V* F5 O, u
writeCmd(p);1 [) a5 l# B2 x5 {
}
# I7 t+ A1 j3 x* t1 ?: Y9 \void writeString(uchar * str)
/ N: D1 o, Z& |) B{5 E3 A5 Y, }6 i1 n
uchar i = 0;
$ W" ~2 N% S9 l( R' Q5 B9 S while(str != '\0')
8 l; y) B% p. q0 u {
& C; N( Y0 O: v' p* Y. H& M writeData(str[i++]);
/ z- P% ^1 O0 \0 W D' m3 b) j$ D( l }0 B, v1 ] T' ~4 T! K
}
9 n. | d- \% `6 H2 ?: U$ E: Z1 i- d
/***************************LCD12864***************************************/% i, g% X: ]' X
' F1 ^& j2 A3 I$ c
void main()
# G) g1 C+ J T{+ g) f9 @* D- x5 t: C" E" E
//先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
5 k3 _3 F8 o# p" n. v9 R8 f% x dula = wela = 0;
- S( M9 L" Z8 V1 Z% g init();: q& F9 a7 u; G0 W: r8 K
setPosition(0, 0);1 F4 G8 u3 P1 `$ x; H
writeString(datas1);% K, ?* ]5 d, e3 \8 s4 w
setPosition(1, 0); g. d& a9 b' P7 Y7 N; a; K
writeString(datas2);! e- Y: X) r8 J+ O' J9 g
setPosition(2, 0);
0 G Q* R; a4 M writeString(datas3);
) F" D$ X s2 G" r+ t& }( P6 }9 s setPosition(3, 0);% W- o5 L4 d# V* p; z
writeString(datas4);
; T+ n0 h7 I! V while(1);* M- N8 s- c* M4 B
}# v' }, B, J) i- l$ @& N6 j
|
|