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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I/O接口与LCD引脚的连接详见源代码注释.
) r/ ?) j) i9 s( s) c  {5 x# M9 w# q" p: |) d- ?1 g
//带中文字库的12864LCD显示程序
3 D, I# W0 u. Y% h+ v#include <reg52.H>
3 D2 E/ [; s( }1 _#include <intrins.H>8 H4 E" f$ x( b# _
7 m7 h5 p, q6 g8 h' a6 R  j
#define uchar unsigned char& O5 ~8 j5 s6 b$ Q/ e) M  i3 Q
#define uint unsigned int( J1 ^5 e' o3 M0 u9 }
7 V1 S' q  S3 D& F
sbit dula = P2^6;
" `. ~; P% y9 W4 V3 H& nsbit wela = P2^7;8 m( e/ B( j! k$ w9 ]6 Z- M8 k0 ~
//SCM12864-05端口定义
: E, h& X3 t# k4 w! R- z#define LCD_DATA P0 //数据口, B; n: P# v9 M, Z9 F, N3 N
sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
6 {  J- U0 Q4 p( U5 t% Esbit RW = P3^6; //并行读写选择信号, H读, L写/ {& l4 w) y" X7 m8 y% z4 V
sbit E = P3^4; //并行使能端, H有效, L无效
) W& v8 D* _* v% u  T- ^2 N; vsbit PSB = P3^7; //并/串接口选择, H并,L串; k2 o) ]! R( n  {, n& [2 `9 |
sbit RET = P3^3; //复位, L有效8 M* R/ |# h% e# L3 \6 _1 U, x# E  G
- r+ T0 g, J% y: t/ n
uchar code datas1[] = {"广东工业大学"};
; h5 Q9 e. W' a+ G4 B* ~uchar code datas2[] = {"自动化学院2004级"};. J3 H; n3 T& W3 {4 ?9 T3 q. z
uchar code datas3[] = {"网络工程 (4)班"};7 Q8 [  a9 `6 d0 Z. f
uchar code datas4[] = {"fengmk2@gmail.com"};, _, p/ i6 f, ?( q, A" S/ \
4 K2 k) U' x9 \# a& ?6 d% j/ Z
//延时约2us
: Q3 v4 M# w1 p* O( S+ ~void delayUs()* L0 I" x' b% G! V0 R: G: \! O
{  _( S6 D- p1 Z
    _nop_();_nop_();- \- N0 v! q- M' ^( @5 I& l
}
" H0 K$ y! k9 ~: `  |//延时 a * 1ms: D8 A5 I! H1 K. B7 F) C( O
void delayMs(uint a)% x/ h' A2 ?+ F( {
{
6 W7 x% T* F/ r    uint i, j;. O+ V  Z" U' a& e/ R( P% T3 F
    for(i = a; i > 0; i--)
- c! g, |1 ~8 }  r( n& D        for(j = 100; j > 0; j--);# y! l* p& ], |- r) x
}, J- j2 @7 |* l! \& Q

. B" K6 z3 H# h# a//检测LCD是否处于忙状态, 若忙返回1, 空闲返回00 ?) j& u% |2 F7 Z/ A' V- l7 ?
bit checkBusy()" M% \$ ^' H0 H) u. C1 a" }# ?
{
& k1 t: {9 ~6 n- w- M' @    bit busy;
! P4 n6 C+ v1 t. n$ u1 v# V    RS = 0;) g1 E' c3 E- e# l" x
    RW = 1;
3 z# l3 Q1 j: I2 I    E = 1;
( X: k- e3 E* r5 q9 p    delayUs();
5 c$ Q/ K; |6 l# W: A  c" k    busy = (bit)(LCD_DATA&0x80);
# t  Z; L5 [( l8 u8 B1 Y$ F1 w4 g    E = 0;% h7 g4 K' L/ Q! h
    return busy;
& v" z1 T7 R$ o" i( N}( N# A% p9 V8 v8 d' D# |

' |! o9 P: j, N* U& D% y//等待LCD到空闲. L& y0 \) L8 ~+ X
void wait()5 z# {. K- e# K& H/ Y
{# o/ w- {8 R2 G9 P% w' T0 b5 Z
    while(checkBusy());
# w3 K$ B. K4 ]& O1 C}
& U1 T: G: H# y2 `% x+ w- z% U  X, J, e! [7 l  _7 s* Q
//写命令: y! C0 c6 B7 U  D
void writeCmd(uchar cmd)2 h9 n. w  n6 [2 `
{
2 h0 K* B3 D7 f( h% _0 u( v    wait();" [% K  [! w. X
    RS = 0;4 n: T8 U$ Q+ C% q/ P9 T
    RW = 0;
+ ?/ y4 A! @% i/ ]. b5 C: V7 S    E = 0;
; d. i9 q) K: U    delayUs();0 p" N' H: z6 s. i) H* q8 R
    LCD_DATA = cmd;8 s/ _/ k7 [( ~% q; N1 s$ }5 O
    delayUs();
( l; B6 D2 p# r/ m. x, k    E = 1;
* I( a1 s( y& K, R1 b    delayUs();
* X, ?3 v: I4 A! r% ?  O    E = 0;
; _! {- k) A  z( ^}
  H& B$ j: x" D- u; M* h" t  ]1 Y' H3 }  v- o1 e# F0 y
//写数据% M$ x+ d/ e- `3 T' \1 a
void writeData(uchar dat). A! _- N8 T( d
{0 k4 {( x  f; H- M9 N: d, D
    wait();0 t8 W* C$ N3 X6 ?
    RS = 1;: E6 Z6 q& v  B+ H# _/ T/ z
    RW = 0;
1 C& C, w; t6 A6 K    E = 0;
% S9 h- g! r3 Z! u5 u: m    delayUs();3 a9 o/ }( {8 t! F4 P
    LCD_DATA = dat;
0 h& i0 u) O. e    delayUs();- v7 E6 b" G1 ?3 r% x! y
    E = 1;! l" y4 M  U. i; [1 }* n
    delayUs();
, l5 _) ?  y* v2 D5 j    E = 0;
9 G) H( X* f. @0 y}& |' M; y7 |" G5 N
1 i  _0 Z/ j% ^3 n; I% I
//初始化LCD; F. o; y5 w3 H8 x( Y. E  g  l! w
void init()
5 f' J) t7 K# J9 H$ r$ v{
: `3 b; c1 S$ m    PSB = 1; //并口方式
9 @6 S8 \* I0 t$ C    writeCmd(0x30); //基本指令, 扩充指令为34H! f8 R$ ^, H2 D8 J
    delayMs(10);/ g$ W2 R8 R; D6 M9 d; X
    writeCmd(0x0c); //显示开, 关光标
- m/ T0 t9 T# j    delayMs(10);- y! q$ a5 y/ r# }+ ]# {. h" L8 x
    writeCmd(0x01); //清屏
7 `9 m7 {( c" c$ d  i: U    delayMs(10);
  G' N% w8 w( u7 V4 N, \% c  H* E}/ i8 x* W0 }+ |1 z
3 R' [- ~. G6 T5 X+ Y% }
void setPosition(uchar x, uchar y)
- Q8 S+ x! r% U4 U- j{1 g$ U6 {$ I$ c/ {% j- H! E
    uchar p;' p; k" c& C9 `( t! C$ N! ]
    switch(x%4)
) D; _3 O4 Y( k3 n    {8 N6 G$ O5 l: L& @" F5 D1 R  }  X
        case 0: p = 0x80; break; //第一行开始地址' Y3 q' M1 g; {/ ?8 w+ X* o7 [' |( L
        case 1: p = 0x90; break; //第二行
3 p; S- o" q; {; G        case 2: p = 0x88; break; //第三行! I* L, H' e5 x) Z
        case 3: p = 0x98; break; //第四行+ e; a0 w) ]+ @3 g, s0 }
    }4 |* A6 z3 o9 x1 l$ t' i
    p += y;6 O) \; M/ ~9 w
    writeCmd(p);
  B& [9 K' F. J- P4 q3 W9 j+ f}  u' _( E- M4 r# j! T1 a
void writeString(uchar * str)* X$ ]2 o7 D$ ~0 I7 n( a
{
0 s7 j! r3 Y) D) U9 u) ^$ Z$ C    uchar i = 0;. ]3 O( x0 R' w/ o1 d
    while(str != '\0')
9 {/ b6 j4 i, a+ S5 E/ m, p  A    {
# \. ?; e. K# \/ `        writeData(str[i++]);" _  |# E0 L* h& O' |, k1 Y
    }
0 ?! V* [7 X6 y% H$ X( E}6 T9 C, ]! f2 s6 t7 L/ M

. X/ O7 l" S: z2 z) t2 Z/***************************LCD12864***************************************/* l( w; Q2 v! a8 f0 ^, J8 N) F
) |; j9 \/ ]8 F
void main()
; J$ t6 H6 |, V4 F4 x{
4 z- t4 b, s  i- l- M' J) r    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
: ^1 R6 C$ @( |1 Z6 c- O    dula = wela = 0;( H0 V+ k6 k4 a+ J6 L
    init();
% e% O" @$ g7 U7 t/ O/ F    setPosition(0, 0);& s7 x8 c8 w' l5 ?
    writeString(datas1);7 ]! n6 N- B: ^
    setPosition(1, 0);
' D, d5 r; O" K2 L" [' v    writeString(datas2);
  }7 b, ]: I) w8 L3 O) H    setPosition(2, 0);8 Q  k6 S* J: y+ h3 b; _$ w* L
    writeString(datas3);
1 |- y2 W  {# B2 u3 b; T    setPosition(3, 0);
4 r4 N/ \: |( x1 N/ \7 ?# D+ m    writeString(datas4);
8 v, d/ B! O5 N& r; d! I* B4 N    while(1);
8 y- A+ M. @8 z9 I}
9 c, H- H6 \: ^( ]2 r. C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 09:18 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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