找回密码
 注册
查看: 771|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I/O接口与LCD引脚的连接详见源代码注释.) K) _% v' i1 s4 M( B

8 g' g+ q5 t( E- h2 |# k# |//带中文字库的12864LCD显示程序5 @4 ]' t" V' b7 P( E: r. Y
#include <reg52.H>
. d( c, [% z( K5 D#include <intrins.H>$ t( T( E% r' l' Q, O4 l+ _

. D6 k7 d* R/ t$ E" o' ~- i# w6 ]% g#define uchar unsigned char: j. _) A' I4 h' `
#define uint unsigned int/ c* a  G' v0 }% f, T

; f5 b( T' ^( v5 j  o" ^: E* Msbit dula = P2^6;
: J, _: C# r) |3 csbit wela = P2^7;
6 l8 p1 F/ g, D//SCM12864-05端口定义/ I% _3 ]% p# z/ U% u/ ^
#define LCD_DATA P0 //数据口
( h5 l( Q9 U7 Z$ z3 {0 tsbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
0 R0 f# T" ]4 \, P; dsbit RW = P3^6; //并行读写选择信号, H读, L写  S% @  K8 J: G% J, q; S0 H4 K
sbit E = P3^4; //并行使能端, H有效, L无效
' e5 h0 K) w! r* [( E6 x& G& {' Esbit PSB = P3^7; //并/串接口选择, H并,L串
: L2 ?$ F: d/ D, P' Z$ v% H1 i/ ksbit RET = P3^3; //复位, L有效
6 q( F# k6 ~* S0 }. Z1 s* t2 f& \1 w9 Y+ a: n
uchar code datas1[] = {"广东工业大学"};# K& D. |! g( D: C" w! _
uchar code datas2[] = {"自动化学院2004级"};
: D/ F8 t7 _( V; I3 N: m+ G( o# guchar code datas3[] = {"网络工程 (4)班"};9 \6 J: O" m8 ?" f% T
uchar code datas4[] = {"fengmk2@gmail.com"};" l8 B, a0 H6 @
! D1 _* s+ L% ~
//延时约2us
3 Z9 a2 S1 d7 z" o/ G2 ]void delayUs()
. |; Z# P4 [4 e, @+ a" ~{% ^! H2 w0 E" @2 C  T; H
    _nop_();_nop_();% q* K; J$ w0 ]  D- c4 E
}
* N+ y" F! m2 y/ L7 V//延时 a * 1ms1 a: V- w# t- a7 _; o9 s
void delayMs(uint a)
" P. M5 H5 Z& S' f{% [) }3 k$ A/ \0 \' n
    uint i, j;4 R' l% w8 o+ s0 ~4 U
    for(i = a; i > 0; i--)
3 c* K0 n) V7 [% ?# C        for(j = 100; j > 0; j--);) E! \  [% B+ p) k
}
5 H2 j9 p6 `, C% f+ X0 B7 t8 A; p2 [3 N. G3 U( {
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回09 E: C% q0 N# h! R1 q7 T7 ]% @5 j
bit checkBusy()0 x5 V4 ~/ U5 _' p/ X0 h
{
$ ?9 H6 G3 b6 Z; [4 Q    bit busy;
5 w( v4 M- y2 K7 t" m3 R    RS = 0;
( g3 W* [; q" y8 M3 q+ O8 N    RW = 1;" V, `: H1 i# A3 v' y- @6 U
    E = 1;5 ~, I" q+ W& Z  w/ J6 K" Q
    delayUs();
3 Z( L# |3 z. h$ O5 ^& v    busy = (bit)(LCD_DATA&0x80);
6 I' p0 r5 E& _0 Z5 A, b    E = 0;6 V4 j) V  G8 E$ Q
    return busy;
- ?0 }2 P( T, Y0 Q}
. q: D, G! O8 y) a/ G
0 O& ~; o5 k8 Q: n//等待LCD到空闲
, b& u2 z9 `% O: }5 x* p! H7 O3 qvoid wait()
& J) F! {, y3 m! r9 ]0 M{
3 q6 s( C# f4 T* Z+ q- x    while(checkBusy());. P; S. j  i# ~( L2 G3 c
}8 p4 Q2 z7 A( `. m3 h3 @7 H

1 z) v9 o) L+ t9 @& g//写命令/ B+ ?  c8 M$ @) n. R
void writeCmd(uchar cmd)8 M) P# P) e5 j8 R- h0 r% B, d$ Y
{
; k% ]; J" A# |, e% W, l4 M    wait();
; G& I5 w8 T% S2 s1 @    RS = 0;
$ ], i9 v* i! Y4 v5 d$ S( r    RW = 0;: a# f; G0 v6 T' E5 Z% L
    E = 0;7 q. F6 s& r+ \5 N9 ?# Z! h
    delayUs();
* ]6 F3 u  I4 E4 [; J1 _: ]    LCD_DATA = cmd;8 _+ `; I2 V; ^9 M5 e
    delayUs();
, `, [$ D, @* g- k* v( Q% r* R* {    E = 1;
; R* j7 j) \( Y/ ^& y    delayUs();
7 \+ E5 a( P: j    E = 0;
6 x& R; V2 y6 ~3 G9 Z}' S4 K3 n! }& @
! y- @- h" \: F  s6 q0 b. G
//写数据% e; t5 H  j! ^6 E3 T3 X
void writeData(uchar dat); M6 j* k7 o: s6 k
{+ A. a0 b9 P& W. N1 }+ Y0 T4 U
    wait();
' a7 H  `5 |3 F1 Q( J- T    RS = 1;
/ N6 s7 h( u; c    RW = 0;$ |. O. C( n' @  }& v
    E = 0;$ F% i- R7 _% v! c. o9 ?" I$ D; x
    delayUs();
3 D- A1 _4 V4 ^# W& G; S/ f, T    LCD_DATA = dat;- t: N) N9 n$ n9 w% \
    delayUs();( x. D9 \. o2 `) e& ]
    E = 1;  K5 ?' [, G% f: _; x$ C
    delayUs();
" c' c9 G* {: O4 x# _0 _    E = 0;
- o7 n7 [: X* g! q}
5 P# Z" S8 p6 B0 n# O  w) W3 T' ?2 x6 y
//初始化LCD" o' B) r' H8 G( b+ A1 l( O
void init()
6 F- H4 Q6 |8 `' v9 U{0 @0 h% R  D( a) z) v2 b& H" N% H
    PSB = 1; //并口方式
. ?- ]  l- D  y5 ^    writeCmd(0x30); //基本指令, 扩充指令为34H- F% Z; q5 U+ G8 c/ p/ q: \
    delayMs(10);
$ I  P& ]% c* W4 \' w5 a2 a    writeCmd(0x0c); //显示开, 关光标
' {5 t) M! u: a  v! x    delayMs(10);
" w0 s; a- @" r    writeCmd(0x01); //清屏# |# Q3 h% B) C/ Z0 m& ?4 ~
    delayMs(10);0 C# r' k4 }  }3 o* {
}, o8 S4 B9 d* H4 n3 h2 \5 {
, z# |$ u  a' o. j# O
void setPosition(uchar x, uchar y)
( v3 {6 j% L: S( E' Z9 U) {{
7 ?7 _# }" w$ `0 }    uchar p;; M) A& f+ A1 a
    switch(x%4): Q2 B! p9 p( _5 C& K
    {# T' v3 Q7 c+ V3 e4 f
        case 0: p = 0x80; break; //第一行开始地址4 U4 C* \; X: i5 \! H
        case 1: p = 0x90; break; //第二行) D. d  e. M) j9 O) a% u, }
        case 2: p = 0x88; break; //第三行
+ n8 E* g7 v6 V: \9 l        case 3: p = 0x98; break; //第四行4 Q3 C3 s: @. O! E
    }
8 Z0 x% _8 b6 x2 O4 {& s" r( d    p += y;
2 f7 M% R+ D7 t- p    writeCmd(p);' }# T: |6 b! y1 x0 Y! K
}+ G4 J7 @( j& r  R. O
void writeString(uchar * str), _9 W4 C( E6 z* x5 x
{
/ U+ c/ h* j. Z' l    uchar i = 0;# q& I; y, L$ r2 d5 y  P) W
    while(str != '\0')
9 R9 A# I3 G" W+ O    {
" i8 W# b3 {- \0 W0 z) Z& U+ F        writeData(str[i++]);! f9 E, I8 @* w/ a% p
    }
% J  w( I* R. `0 O; I}: U- ]1 o$ O3 L

+ H6 l* e* \! }3 f/***************************LCD12864***************************************/! g- h; H. Y$ G! f" E& k( z1 v

  p6 G3 J* z4 T! Y* \& |void main()# H  f/ t; J( {( X) b3 Q0 z
{
$ l- F9 L3 E/ ]/ Z    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作3 Q5 d, _9 u0 Q% e" A9 A8 x3 q
    dula = wela = 0;1 J5 {& F) L1 j1 D5 |
    init();
5 Y! X% q, {* X  v    setPosition(0, 0);
% h9 |; Y) ?4 }7 g% D5 t    writeString(datas1);" S& B2 [" i0 {% p, m
    setPosition(1, 0);
! S$ m) M# X  t$ `$ ~% X4 L    writeString(datas2);
1 Q% I1 h5 }3 N: V2 f# \% @    setPosition(2, 0);" F0 M) Q5 B/ r$ C8 {
    writeString(datas3);
& m/ |) d8 j$ l1 F3 s) L    setPosition(3, 0);
2 M" C; \' X6 S4 R( w  V  v    writeString(datas4);
8 N! P* c, f6 v# M" H: ]    while(1);8 N: ?: m6 S: n) r" B
}
& z  q4 t; ]7 m. e$ f
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-5-30 11:38 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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