找回密码
 注册
关于网站域名变更的通知
查看: 791|回复: 1
打印 上一主题 下一主题

单片机练习 - 带中文字库12864LCD显示程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-5-16 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
I/O接口与LCD引脚的连接详见源代码注释.
* c) `! x# |3 [- }; Y
$ `, `) a% G, u  [2 R//带中文字库的12864LCD显示程序
2 e+ I5 g0 C, @# i& X#include <reg52.H>) z7 v8 e- b; X! Z6 e0 J1 J! G0 x
#include <intrins.H>  X7 Z6 J- T! {- ]  o

" v) D$ f1 e- w0 E% e#define uchar unsigned char
. V% ~  l( t: v6 X3 ?- d: F#define uint unsigned int5 J. S5 n* U3 V3 h8 J

" D1 y" y0 H. y6 Y. Osbit dula = P2^6;" D7 ^2 p9 b5 t1 l
sbit wela = P2^7;
7 }! x9 K2 _% ]/ u* S, u9 j+ v0 `//SCM12864-05端口定义6 D2 s$ C, G; F1 E/ f; M- M
#define LCD_DATA P0 //数据口! ]; f) c9 M9 _
sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
/ m  {8 K* ]* C& I$ Ksbit RW = P3^6; //并行读写选择信号, H读, L写
0 z# }% o8 Y9 B' S( n# qsbit E = P3^4; //并行使能端, H有效, L无效
# m0 n; K5 N( Q( G0 z+ Csbit PSB = P3^7; //并/串接口选择, H并,L串. e' E% |3 `# j8 U: r* F5 N9 Y
sbit RET = P3^3; //复位, L有效
% \7 i) S( M( x. _: L; Z! F
' M' d" L* @( K8 F, G# X# i, h$ Muchar code datas1[] = {"广东工业大学"};6 V2 K" _" T2 v1 x
uchar code datas2[] = {"自动化学院2004级"};- |/ O% p$ C: d
uchar code datas3[] = {"网络工程 (4)班"};
) r, q2 V* Q2 a+ q9 @' G! xuchar code datas4[] = {"fengmk2@gmail.com"};
6 }8 E8 e. }5 G# H' M1 [2 @; P  d. |+ d0 I4 s5 q
//延时约2us- N, n' ]" l% P, |9 [& I& ?3 ^3 E
void delayUs()
, F9 T3 }3 o0 H+ x{- M: n9 I) q. l9 `- O6 B
    _nop_();_nop_();
' [3 e: o$ F* W. e  w}
% }" t9 h1 P3 Q3 i$ `# T" W//延时 a * 1ms
# C8 k: X& ?8 Q1 b- }. p6 Yvoid delayMs(uint a)
9 s" \+ d, m8 z6 L( j3 R{7 s4 V$ Y" x- ^- {$ u/ a- ^
    uint i, j;
4 i" y/ O+ Y& _: w    for(i = a; i > 0; i--)
( U; U. I) R2 e, b" C2 S  b" c  `        for(j = 100; j > 0; j--);
8 |' Z6 w* Q3 ]8 L}$ k5 C: \2 c; i5 v

( O# W" K3 S( w3 S  g//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0: B$ r1 j& F6 B7 w$ M9 ~! [
bit checkBusy()% {& `  \4 |1 y4 j$ B
{! ~' O" Z, O' I+ j% z0 a8 u; _. Z
    bit busy;/ C& |# s9 |3 T& O# H; z; [
    RS = 0;2 `6 I( L7 M# i# p: q4 u: ~
    RW = 1;
/ U0 s0 m& u" O5 G2 v$ M% x9 o( j    E = 1;
2 M. O- _3 B+ L3 l    delayUs();4 j" h# f, S: n' K4 n1 B
    busy = (bit)(LCD_DATA&0x80);9 g8 D0 z& B. e& F# y1 w$ Z
    E = 0;- |4 J  D  E1 S" q: q4 @3 Z: x
    return busy;
; K0 u& X6 Z# ~. ~! C}1 Z* [# u* s$ q( Z3 F' l8 ]7 }( \, N$ r
$ q( d8 ?9 K3 M7 s
//等待LCD到空闲
5 E' H) y6 B2 x* r" U0 h+ W4 t) `void wait()- W. ]: B, F( b' h% O, j- G, O
{8 h! f  E( D5 h
    while(checkBusy());! H9 y* J5 T; B1 b4 [6 e1 E
}
+ r, q7 B& v' F+ j% t1 C& ]7 R2 o  \9 t( [& ^2 J
//写命令( _. Q% X, k& e  ?/ T
void writeCmd(uchar cmd)5 v  e- E  U5 T3 g; g
{
, i0 P2 O  j* V    wait();
+ e. C5 ?6 S! _, ^% @% {    RS = 0;! W; V6 P6 e2 F
    RW = 0;
! [+ V5 w# z% X" G0 A9 \" W; _    E = 0;
) h5 a6 p+ p, l6 }5 W    delayUs();( z' K% @2 `, [2 y
    LCD_DATA = cmd;
( A4 X; O  L' m# f    delayUs();
1 J& j( l; }9 p. Y# J) i, _' S. k    E = 1;
! m' _- q9 c, `! \8 L$ s( y5 [    delayUs();
* @3 F$ o) A* a9 p    E = 0;
# W$ I1 V. ]' B" |, \4 R# X; I: E' M' X}$ N1 C$ R2 P& M2 ^

8 M4 V  D/ {% t4 w7 n//写数据5 x5 g; }) ~# G/ u7 B/ N
void writeData(uchar dat)& H# b2 ?7 n7 p
{6 K! ]4 B+ G* a1 A' Y% j
    wait();
) t6 o8 B3 ]  `6 x    RS = 1;' X4 ~# E$ J# K. D2 Q  C- L$ q
    RW = 0;
) G1 E' t3 {! Q0 \% Z) W    E = 0;
$ _& a0 x/ B! k. q    delayUs();  m; [% {1 D9 A& ~5 T+ N
    LCD_DATA = dat;
) v2 D5 [1 q* W+ |    delayUs();
2 n0 h: z4 h! a3 c+ V* D5 ?" E$ S    E = 1;. \. P' _0 Q( J% y! {
    delayUs();% l' j# C4 \5 l, K
    E = 0;
/ _( m1 D+ u. L  q1 S& z$ \}3 A0 B/ H4 W, h0 O, w$ S: d8 @

; `) X( r# m+ }2 x2 j. `//初始化LCD
. i2 r1 n% B( n9 X! F$ Z# _4 pvoid init()  f1 W, K' u3 Z' C7 [
{
% ?& C- Y3 a8 r# _) x! m) r, W( v    PSB = 1; //并口方式2 ]0 T7 i. y& A8 ?
    writeCmd(0x30); //基本指令, 扩充指令为34H
& a. t& M+ d4 C3 H7 W- c9 V    delayMs(10);$ I+ T+ z% ~( V
    writeCmd(0x0c); //显示开, 关光标
! O8 e& ?; \: v6 o    delayMs(10);
- N- ^5 u% o1 W3 T1 Z" P5 {    writeCmd(0x01); //清屏
- m# N; g" o8 u( t4 t" P) `4 J) k    delayMs(10);4 Q: F( f  S/ F* p
}1 `3 `* f+ m4 g: g. _$ b

& w1 J; o$ p( W) q8 n0 x, |: `; ]void setPosition(uchar x, uchar y)
# L% C: U6 w  H4 r0 I{
" b& t% [: N& L- `+ A2 D    uchar p;
  g+ J) R+ Y9 y- C3 z    switch(x%4)! k5 z+ w- L1 u, J0 Z. A- i  {
    {: \1 c# _' ?3 H+ Q7 g
        case 0: p = 0x80; break; //第一行开始地址( b/ d; y; |$ W" F+ V
        case 1: p = 0x90; break; //第二行. o0 ^4 {8 G  L) @6 q$ g+ A
        case 2: p = 0x88; break; //第三行- k( \$ W( I9 e" `7 l  Q9 G$ I
        case 3: p = 0x98; break; //第四行
7 T  B, c, i& L- A- `    }7 G: [6 Y+ r: m. Z
    p += y;
  v3 g: F: r+ V; L2 O% Q) A    writeCmd(p);
/ j$ h" b$ X+ w* `! U}
& Q; i$ Q  a' q# y9 I! m  U# _, Avoid writeString(uchar * str)8 [6 }8 F5 B; M, B! E
{
1 ?  m4 ~) Z, w; Y. Q4 A    uchar i = 0;+ \' h. Y) @& P  t: V* ~$ D9 E
    while(str != '\0')* y4 m4 \0 i$ C( Y. X* _& t
    {
4 R. _6 ^8 }- s. T! a9 R4 f        writeData(str[i++]);
4 S8 P* L: {' R" y+ |- Y* v8 A" H    }
: i  U5 P5 Y/ n9 i" G2 d}
! w; B3 m, h9 [, a* f; L: s3 R$ A7 ?+ \% B
/***************************LCD12864***************************************/
/ D' T3 ]6 j0 J2 G+ ~$ t) c& A7 [- F2 o. I+ n/ i2 G8 I
void main()
1 B6 N: _0 _8 V2 d, s. M{
* q2 b! D& f. U, X+ U4 C( Y    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
) H  e2 H3 X3 H    dula = wela = 0;
: S) ?6 ?* q+ e9 e; Z3 T8 [    init();7 A6 W& E1 Y  O6 i( f- r$ C
    setPosition(0, 0);
" P! v4 t) d& q% X! ~9 R. E! b    writeString(datas1);
/ k& b2 H2 P1 w+ V- [0 n    setPosition(1, 0);
6 H- {6 U" Y! H7 u' y6 Z& Z    writeString(datas2);4 V; j* Q6 C5 \% X& j) s+ m  \
    setPosition(2, 0);5 s/ ^6 M. s0 X& ]' v' v. S$ j
    writeString(datas3);
: `4 ^( r+ ~7 Y1 t0 N, O0 J    setPosition(3, 0);4 Z7 y6 J$ O+ l9 P" A
    writeString(datas4);
8 t6 b" b5 ^+ F* [3 d, M9 x    while(1);
) a$ f/ @+ F" f) @' O1 Q  u}
; N" X. Z+ K- f& x7 G- H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-3 06:14 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表