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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I/O接口与LCD引脚的连接详见源代码注释.+ L+ r: ~0 K0 I+ ?% r6 y
2 P. n8 e; x! N: ?/ R' p
//带中文字库的12864LCD显示程序
( E0 t! q2 e1 R( W% Q#include <reg52.H>
1 r4 ~* r, o2 H. G" E- e4 e4 e9 r#include <intrins.H>
2 E! _& Q6 h+ h3 C8 O+ L
" d; H" ]% L% r* d( P+ N#define uchar unsigned char6 p* ]6 V3 J/ P) ^" Q* j3 F4 s& H
#define uint unsigned int
6 o( x2 s% B# M" z0 F" n8 t5 U0 R$ J; S. q' h- C: r! [2 X5 s
sbit dula = P2^6;7 K. k* l+ M0 Z: ~! ]
sbit wela = P2^7;1 A' c6 Y* L+ W  z2 n
//SCM12864-05端口定义
# {# i( H0 Z. `/ X#define LCD_DATA P0 //数据口5 b6 i& p. h1 y0 d4 W. D2 a
sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
" X- P. l  ?% A& X- Ksbit RW = P3^6; //并行读写选择信号, H读, L写
' p5 r; P+ u+ r, Q! v8 r3 d$ wsbit E = P3^4; //并行使能端, H有效, L无效; h2 V( O0 }! U
sbit PSB = P3^7; //并/串接口选择, H并,L串6 ?" O4 u4 l' B7 n' m8 q) T2 M
sbit RET = P3^3; //复位, L有效& @! {7 i3 q) ^2 v# h! q  D

6 q2 D+ l3 M1 A& g1 \( S/ |3 R: Puchar code datas1[] = {"广东工业大学"};
7 K7 n3 _$ F" V6 Z' Luchar code datas2[] = {"自动化学院2004级"};
" I5 `2 ?) |) d% p3 B' r* }uchar code datas3[] = {"网络工程 (4)班"};
6 I8 V1 H  ]. Y9 V* M' C$ F9 nuchar code datas4[] = {"fengmk2@gmail.com"};
5 \# {  y: D9 p" y* W3 d, H: {0 @
. [" x) h0 j" X, {, B- D$ c//延时约2us$ P' C0 N7 Q! ?
void delayUs()
) |" `# ]2 ]+ v6 {& V2 Y" Y) Q, P{% w& T7 {+ p0 a. }* E8 _% n: h
    _nop_();_nop_();: N* K! y+ W6 A
}
- N& K7 ^/ {! Z6 M" `! y# w//延时 a * 1ms; q- e! f" p4 B8 N+ y0 ?% F2 o! g
void delayMs(uint a)
4 Y2 j- U2 _  n( j, M9 A9 R- _. V* r{" }! v; \7 F( S
    uint i, j;6 t- g. C$ O5 b9 I) J2 ]1 `9 n; e
    for(i = a; i > 0; i--)
9 {. i: F2 O/ M4 z- G        for(j = 100; j > 0; j--);
; z" a- B2 b! N& F: m$ B}% |+ o- X& R+ }7 X; A& K6 |

$ ~* Q: v; f0 I- a: q8 ]( x//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0/ |$ }4 b" A8 V5 `' e
bit checkBusy()
! n3 ^& z0 V# v2 g& C{
4 K9 p# l& b( L1 P    bit busy;
6 z; {; Q3 B. V. N: @    RS = 0;' L% k& ?  \3 l% f7 f
    RW = 1;
; o) @1 B% C; h- w6 Y0 h: m# p- I    E = 1;: ~, [2 u5 M/ ~$ I7 Y/ Z, I: \
    delayUs();
7 z0 E* }/ W7 O( y3 |    busy = (bit)(LCD_DATA&0x80);
" H4 |5 h9 e% }' B: U9 k- N    E = 0;; J0 t4 ^* P: M0 d' }0 k
    return busy;: i2 M  v  V* |' P3 J/ L
}
- w1 h0 u! F! {: Q; k2 e
. F# L4 z$ I* U0 S$ Y. I3 @//等待LCD到空闲
; X3 q8 Q  ^8 @, E1 V" j5 V' Nvoid wait()
! I7 X. q5 b) {8 J, m{
+ G0 \. V1 |& b3 m: X6 P2 m! w    while(checkBusy());
! t( b1 C. Y; y1 |0 M8 K}
2 F  J7 W2 N8 I% b2 f- A
% ]2 ~; X0 k* x$ I0 N//写命令
0 \% G# _! Y# B( Uvoid writeCmd(uchar cmd)( }7 w! M4 ^, A# ~
{9 s5 W" L1 ^% S5 j6 v  I
    wait();
- y8 j, S% D' k* B! c/ [    RS = 0;5 Z6 Z- [7 i; X7 ~7 _+ b
    RW = 0;0 |6 V! @. I8 y& |
    E = 0;
" K! m( U6 U; q5 R; U  ~    delayUs();
; R. u8 u1 |; c* [. n7 l/ A    LCD_DATA = cmd;
: s& n1 ?0 k. p0 I# K    delayUs();
" D0 f7 a- _3 M    E = 1;8 x, U8 }. i* X+ C8 h3 }3 Q
    delayUs();
  c  u' q0 ~7 h    E = 0;
+ \- M( p% _( N6 |2 |1 @/ L}
( K1 J  v9 h6 Z7 I3 a" z7 o
' ~( y5 [+ X0 z+ y//写数据9 d) p, j6 x9 u, Y* }/ a
void writeData(uchar dat)
6 c$ s# h3 a* ?& M. F0 Y6 q: i{7 P( _9 W8 `, V! F" z& m
    wait();
2 r; a! ^$ @: k/ G$ u    RS = 1;
1 x8 ?/ {* S4 Y7 q" V    RW = 0;
8 q7 F: e% j- v' e    E = 0;
5 Q2 Q& N/ {0 u    delayUs();
  p4 W9 q6 ?) H! S    LCD_DATA = dat;
3 D( t- R, m# E- x. T4 w    delayUs();- B9 A1 F& O' }$ f: I
    E = 1;
% D& G. x% `9 e4 W3 T; L; e  S    delayUs();
1 R; ]' y# x. N    E = 0;
- {; S/ B- R) i5 S: A$ `}
/ a- k5 c8 F9 |+ X1 j8 p  \1 D5 `& p" A: N& B# i% O
//初始化LCD1 x; @/ Y+ I: v. D! H# p) v+ N
void init()$ v0 ]: g4 t' t- s9 W
{
( C( K0 x- [) C$ T) A    PSB = 1; //并口方式, ?9 e1 ~6 C' g
    writeCmd(0x30); //基本指令, 扩充指令为34H
$ ^: x4 a* U& n1 T% s    delayMs(10);
% |' M5 x; R5 F  M# `6 D* n- o; N    writeCmd(0x0c); //显示开, 关光标
, K/ l9 l% N8 }2 u8 T    delayMs(10);9 \+ B4 }4 g5 y% p; [
    writeCmd(0x01); //清屏
) Q# G/ [/ i- O% ^2 u    delayMs(10);
: \" {* u$ R9 M" X7 o}$ ^4 }" ?2 N, |" p) G; H

! Z* l6 T" n" T0 v. Q, c. {  ~void setPosition(uchar x, uchar y)- F9 z* q. s" ~8 F
{4 M! k7 z, B1 R. O6 l; A$ _+ O
    uchar p;9 N  Y* e2 h! a
    switch(x%4)
" {" J0 K0 d0 P7 g5 d    {
$ N2 f6 z5 K" [4 _+ f8 R4 Q        case 0: p = 0x80; break; //第一行开始地址
0 Q) b3 \3 d6 j/ s# P! K; v        case 1: p = 0x90; break; //第二行) D1 Y+ z4 ~; u
        case 2: p = 0x88; break; //第三行" ]/ F- ~) j* ]7 c
        case 3: p = 0x98; break; //第四行
# ~0 c# I+ x  A; K% o: R    }1 Z5 A- {; Y2 h: F7 ^+ L7 t# n" l( ]
    p += y;
9 i, X0 u8 I1 t* L; w8 E, P- i) ~, R    writeCmd(p);1 @; {" s; q! u7 R2 b
}$ }. j$ O! A+ s( v
void writeString(uchar * str)
% H; q0 W& L' M  b- t{" c9 {5 a$ \8 r' e) `. C
    uchar i = 0;
9 g6 S. I: p. J6 f4 d! q5 d- J& K    while(str != '\0')3 d2 X/ i9 s0 N: ]
    {
2 _& k9 o7 _3 u) o# L% v        writeData(str[i++]);
% b7 E; {( p3 U8 W2 r    }' o2 J% {, p5 }% m  o
}
5 j+ C4 {" }% U) k' @% ^) h; o. `3 s( X8 i: B3 Q" h8 E1 C
/***************************LCD12864***************************************/
& W& f- b& E& I. J9 @' c; ]* L% u% j( ]
void main()% I5 G0 j% K) p' x5 U. C+ t9 m
{) J6 V  C4 a9 f+ t( _2 \) I! O
    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
7 M# F2 q; a0 Y7 _( ~/ \6 L' j' n    dula = wela = 0;
: J4 V3 u5 e* [* R% c- _9 n    init();3 n" _+ x  j7 J! c9 i
    setPosition(0, 0);# z# j' l) R- r( Z( V2 I
    writeString(datas1);
1 {, O3 }3 {9 ~    setPosition(1, 0);
" @& _4 n( R& D  T; j    writeString(datas2);* N# H* R6 ^( D6 g( k8 k$ c. q
    setPosition(2, 0);
0 [1 z  ~2 n& i+ E# m    writeString(datas3);8 v/ b* z& W: _7 U
    setPosition(3, 0);
- n: @$ ]2 t' e3 N    writeString(datas4);- s/ X6 ?0 F) @8 c3 i' G$ A* s2 ~
    while(1);  L+ x' E6 p+ g5 R8 Y$ M7 K
}; c. W* x) L, F
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-26 12:01 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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