| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
I/O接口与LCD引脚的连接详见源代码注释. 
  p! ^. w  f: g: M/ G9 R0 }0 ~7 H 
% Y. D7 f( Z* w3 U: u8 r//带中文字库的12864LCD显示程序% L# T6 Y0 j( i5 B$ h' L" K 
#include <reg52.H> 
8 j" C/ D8 X0 K7 M: [1 ?#include <intrins.H> 
7 s. v4 O1 I( ?' h0 L+ h$ x. H* q$ y6 J 
. b3 h  O) @* r#define uchar unsigned char, ?/ f6 E- B5 s 
#define uint unsigned int 
+ U8 h# Z/ y% d% ~5 G$ Q- x3 o, f/ {7 |2 W8 ~ 
sbit dula = P2^6; 
4 Z' I8 E1 r& y3 H+ l0 bsbit wela = P2^7; 
8 K; L# o  |4 A$ Q) s6 ]//SCM12864-05端口定义 
  D6 U- I' O, O) ~  b#define LCD_DATA P0 //数据口 
/ x- W4 P  D6 W& Hsbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令 
* W( ]# d, [5 O1 l+ gsbit RW = P3^6; //并行读写选择信号, H读, L写$ \& ], N$ e9 p( P5 W+ p 
sbit E = P3^4; //并行使能端, H有效, L无效7 h4 O' ?; n/ k5 j5 { 
sbit PSB = P3^7; //并/串接口选择, H并,L串 
1 v9 D/ d$ M, I) I" dsbit RET = P3^3; //复位, L有效: w. `! Y6 M4 S5 Q 
 
9 F# u+ O8 K; |1 s  Buchar code datas1[] = {"广东工业大学"}; 
# d5 `- [3 P" w; cuchar code datas2[] = {"自动化学院2004级"};5 c3 B5 y6 Z# z7 g 
uchar code datas3[] = {"网络工程 (4)班"}; 
; _" z& g9 C9 {+ ?; V, ~uchar code datas4[] = {"fengmk2@gmail.com"}; 
% x: M! A# I% h: Q1 q" n 
, Z8 y) _7 _$ o1 A2 j" ~//延时约2us 
4 Q8 q3 F; M0 X' S% `0 h* H# rvoid delayUs()* g8 V3 |" l4 d& V; K 
{/ q; a2 Z: Z. ]0 @ 
    _nop_();_nop_();, C7 G2 A- t4 q1 G 
}4 p) v: e! z; d& x0 b  g 
//延时 a * 1ms3 F9 `. N0 d6 h6 K; B 
void delayMs(uint a) 
0 L) I, {: x" z" `5 m- v' P{ 
, Q3 k) ?) _: }    uint i, j;9 q5 R6 J* B4 l) F* o% @ 
    for(i = a; i > 0; i--) 
$ A) l. f/ t  _' T# J8 ]# d* o        for(j = 100; j > 0; j--); 
! S" n, v+ o6 i1 D' p" _& }  m}# v, p) I1 S7 P2 V/ s; \ 
: s  ?  ^. m7 y- n) t3 t 
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0 
' @6 g, a3 _  z1 n0 g/ X8 gbit checkBusy(). O, ]  m: _4 k% g 
{4 S0 x. [* A: g) l 
    bit busy;, c5 b5 B' ~( J+ q 
    RS = 0;8 U; V: m2 g% D* D( O- o: i 
    RW = 1;4 ]7 F( O0 C" x' Q 
    E = 1;% F2 Y- g3 Z6 ? 
    delayUs();8 F! r; ~" _% i+ q0 a 
    busy = (bit)(LCD_DATA&0x80); 
6 e+ F5 e) K; f. F9 o, f! z    E = 0; 
7 ~0 J6 k- n9 d3 S" i& u    return busy; 
& i, @1 J- }2 W4 ?2 ~0 X3 I}6 I- B$ w7 T3 p8 i7 O" x  ]9 S 
 
( T; a! o. `. a% ]- z//等待LCD到空闲! K" h! E6 U7 d' B  S( R 
void wait() 
! }2 w) _1 @% d{% B. f- B% l4 | 
    while(checkBusy()); 
6 S" ~9 _4 w1 k0 Y0 Q, O; d} 
* C( a1 p; K! ^4 x! N& y; Q' \- F% [  E3 [0 t# s) L9 ]3 _* J 
//写命令 
# P2 I: G  M' e% Fvoid writeCmd(uchar cmd)& V: ]6 S& b7 D3 G 
{9 M2 [( M$ @' n8 e5 S 
    wait();& c; x; ^9 I7 L: s8 Y, ?( _9 t 
    RS = 0; 
9 V) V: R( M: Z: y+ @    RW = 0;8 X. P; T; N7 {8 P& m 
    E = 0;. \. i1 L+ E2 c3 D+ A 
    delayUs();" K  B* ^0 F# `" ?. |, e1 \ 
    LCD_DATA = cmd;$ C! U. A* H, N/ h 
    delayUs();8 E* g* d4 Z, o# A# u# D! t9 c 
    E = 1; 
, Y1 q7 R7 r$ B+ d: @& t- x# o/ z    delayUs(); 
5 t9 t2 {9 G6 Z1 n! w$ Z    E = 0; 
, y& b: Q& R: A7 ]) t0 |}# a: v5 F$ M8 ?: D8 ?& H 
) @+ D1 p- x+ x% y. ^ 
//写数据 
, T4 r0 M! T: I) P: Kvoid writeData(uchar dat) 
* k3 b( q! G- h0 {2 W{ 
2 b" M; z( L/ Q3 g' |9 v    wait();  {3 V0 f  e* D- r1 S0 O( w+ U 
    RS = 1; 
7 v, Z% T  s; ~    RW = 0;, \. a. M- f4 i4 a 
    E = 0;( r* d& [2 S; l- P 
    delayUs();2 A6 T* _+ o! c+ j 
    LCD_DATA = dat; 
8 L# d( O  ^2 {! K  {' U9 q    delayUs(); 
+ g4 {% ^+ l6 `& Y0 V    E = 1; 
& J1 P# m! I: T- S    delayUs();/ Z; i4 z. L3 w7 F, ~0 D 
    E = 0; 
9 A: ], I! Q6 P/ d5 R, d} 
1 b3 J- J8 t+ K- W/ M 
& I% U$ C* t- }) {5 |5 s//初始化LCD2 T  ]' E5 j+ k5 ^$ _5 Q$ S 
void init()$ Z* o+ V' n7 l+ X' u9 Y 
{ 
% B* j7 `4 z  [$ H0 m8 Y    PSB = 1; //并口方式- X3 L, z/ [& {4 @( h% d+ ~ 
    writeCmd(0x30); //基本指令, 扩充指令为34H6 a4 b8 ?6 }2 ?4 U* A8 a 
    delayMs(10);7 t! N5 z4 d9 Y6 G% l# K9 |6 Z 
    writeCmd(0x0c); //显示开, 关光标 
2 n, }5 J' q; {    delayMs(10);. ?# O, q* B3 _# F" U/ o1 P 
    writeCmd(0x01); //清屏( q3 S9 r* f5 d' A! O- }# G/ o 
    delayMs(10); 
; w( N/ Y7 o' c}2 e8 ~3 @* E, C5 T9 g 
$ u6 l1 }$ l6 e/ ?8 w# e' v+ S. K 
void setPosition(uchar x, uchar y) 
2 B9 B( }- \( }{ 
: ]7 J) ~5 t  E9 d( u6 `& J    uchar p;+ w1 j' t0 Q' E( R0 x2 B; n 
    switch(x%4)3 h& ]5 l* w) Y7 i 
    {0 X8 ~9 R4 z% { 
        case 0: p = 0x80; break; //第一行开始地址; b/ m$ z  |1 J1 H$ A 
        case 1: p = 0x90; break; //第二行0 r- M3 Z( Z' f2 ~6 C 
        case 2: p = 0x88; break; //第三行& y2 H( x. W+ {) W5 L 
        case 3: p = 0x98; break; //第四行 
5 O; G, t) m: g1 W+ S9 k# ]8 f) f    } 
9 Z0 O( L' V: u& k2 M    p += y;+ M" ]3 [9 `& V; Z. D3 c6 G 
    writeCmd(p);+ r, l, q1 H6 }, q1 R& m 
} 
- x# O( k* k8 ]0 Rvoid writeString(uchar * str) 
! A/ l6 C0 m' J6 p7 p{& R8 O3 O' @! ^ 
    uchar i = 0;' p$ Z, Z( L2 U- o' ~1 } 
    while(str != '\0') 
# I% J* Q- d3 Y/ |* M6 \2 z1 }5 r    { 
/ e+ {  G5 i; A1 \' @1 \        writeData(str[i++]); 
* g; G* p4 L9 `+ _* C    }) T. Q, Y4 }3 Z% y* Y) a6 q  Q 
} 
' t0 P7 I& f; Q 
2 d' ?  b% ?, |* ?/***************************LCD12864***************************************/; z  a4 K) J1 e& T% V 
" S9 a7 l7 A, G3 b5 Z6 U 
void main() 
+ q9 ?( d( c& a{ 
3 O! h2 m7 [( R- X2 J- j* t    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作# s8 k) O6 n0 w+ y8 c 
    dula = wela = 0;- C6 c# i6 u2 U) M, s1 Y+ M9 g3 y 
    init();7 N5 _3 C  W1 G& ?& H 
    setPosition(0, 0); 
5 L7 R9 [/ N5 e; g$ E    writeString(datas1);7 e6 |  P) t6 y& H  e/ M& w 
    setPosition(1, 0); 
9 f; H" \4 l8 f1 y1 V' y    writeString(datas2); 
+ D* Z+ Q" {6 f1 T    setPosition(2, 0);& r# z) a& D/ w; I( [' M2 ~$ { 
    writeString(datas3);. k' N+ ~7 j% ]& l$ E# n 
    setPosition(3, 0); 
4 G5 i! s# s$ @6 S2 F7 U    writeString(datas4); 
" B& P* p4 V- e# [! [1 y! X    while(1);( F& i/ P# s- L% C: Y; j9 d2 t 
} 
  e8 Y) m6 b* t: e: e- w |   
 
 
 
 |