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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I/O接口与LCD引脚的连接详见源代码注释.2 K5 y/ `4 u* |; B8 |

) ^; ~3 U! o3 L6 A/ E, ~( a3 u//带中文字库的12864LCD显示程序. w) e$ g5 X, `! B' C; N; Z1 v
#include <reg52.H>4 l- |' O) E% n( j
#include <intrins.H>( p: J; Y3 l6 Z" @
: \4 u  x- A* H& g! g$ S
#define uchar unsigned char
% x# z: y/ o  d. k, P5 f( k0 G#define uint unsigned int
9 B% S4 `4 e/ [; \# M7 c
7 G: i+ r' G- r1 }+ I- ?6 nsbit dula = P2^6;
/ i5 N& U1 s  d; E0 u6 Esbit wela = P2^7;
. f% G% i1 |; c3 W0 n' z9 l: |//SCM12864-05端口定义! N6 m+ o) c* O; `' O- |; R' N
#define LCD_DATA P0 //数据口
4 R6 ]3 C) d$ ~" m+ H/ e0 `sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令' D, B$ h# ~! p
sbit RW = P3^6; //并行读写选择信号, H读, L写! G, P3 `  L1 K% _7 |
sbit E = P3^4; //并行使能端, H有效, L无效
- W. B/ X  J0 ?7 u5 I' T6 |8 dsbit PSB = P3^7; //并/串接口选择, H并,L串% N4 O- g; w" y2 r8 n  b/ C
sbit RET = P3^3; //复位, L有效- ?3 U& e4 X- V/ l

! S( E3 e! X- Juchar code datas1[] = {"广东工业大学"};/ P4 q- n) \: R& x! _; j
uchar code datas2[] = {"自动化学院2004级"};
3 p2 Z  d) Z6 \' x) {. m8 Buchar code datas3[] = {"网络工程 (4)班"};
3 r- t0 r* T+ tuchar code datas4[] = {"fengmk2@gmail.com"};' c5 z7 @: {2 R: V, C
& X! t# |$ D5 f& x+ N) P6 D" B
//延时约2us
$ w( S$ g  {# O2 |3 r8 o3 v0 Zvoid delayUs()0 Q) N1 v; u: @$ [; [
{
! x$ ]; I3 s- i( l* ?. e* v6 r: X    _nop_();_nop_();
6 [5 x+ u1 |3 p, P}. K9 O2 Z' `( w( O- q2 @
//延时 a * 1ms5 l& r' ]# c) H( ?2 c0 ]
void delayMs(uint a)
% r' ~5 p9 ], a2 Y. q& h' Y4 L# r{
# @$ x; l; J& J7 ^1 O9 D7 @    uint i, j;
$ C/ @2 v4 D) a; [" p% s7 l    for(i = a; i > 0; i--)
9 a1 s" Y) I$ x, z        for(j = 100; j > 0; j--);
+ e* q7 n. x  D. {2 A) f! E}0 o  ~- S9 X; M) Q
! a% }2 `. i3 ]4 J! F
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
  _! i) w9 P$ l& ebit checkBusy()$ b$ P$ }0 U6 [0 `8 f+ m
{
& c: O- c9 {% i( x* E. ]% g    bit busy;# |% X/ Q5 R' c- {, j/ _# d
    RS = 0;
8 L3 I, ~' h) b$ r9 B    RW = 1;# s! Q# u. t* e/ h. S  j* S
    E = 1;0 o- K& k: y+ |- E
    delayUs();
  r1 C5 T8 ~" B8 n& }    busy = (bit)(LCD_DATA&0x80);
! l  S3 Q! N; c    E = 0;
0 O8 r2 ^! ^$ D    return busy;2 J' ?4 m5 n, h( k
}
' D$ o$ h) _2 P$ f2 m$ g2 G+ ]. N: g* ~  f* Q7 q
//等待LCD到空闲
7 L/ z$ [& Y- ~# n- h7 i3 }void wait()! M6 u: H: B' N! r; Q5 h
{# b$ @4 e( [; ^2 g8 T  a; R5 ?) o
    while(checkBusy());
9 Q& X) `5 X2 W5 Q}
" ?" |# Z" M! m; s+ r. s- W& u  F0 F; ~+ M1 U% `
//写命令
% J8 Q$ a$ y' N, r$ K+ W' \void writeCmd(uchar cmd)8 Z0 O7 ?6 S; w7 R. k  e! I" G
{9 w2 j2 R9 l/ F4 F9 \! k
    wait();- J$ P" G* g: @0 z
    RS = 0;# }( C2 x' V4 d5 b
    RW = 0;
, A$ X' w' e$ I% n4 \7 w    E = 0;
- T) R$ T2 n8 |3 X4 b8 t    delayUs();5 Z/ ]0 c% z' {
    LCD_DATA = cmd;; K1 V) F8 H+ ]
    delayUs();
% N6 H* t$ x# ~+ p: M3 I7 Y5 w: C& _    E = 1;
0 m5 V4 I2 |4 f+ g, w- k) U    delayUs();- Q) c8 T5 h. u4 J+ a
    E = 0;
5 {" N# ?7 [. F+ X}
; Y( N0 v% l4 `( M  w. V& \
4 }' C/ K& r0 Z//写数据/ r' `9 B6 d1 L% F" z
void writeData(uchar dat)
1 ?  g/ ]6 p) ~: u* c5 T{( B# L  ~  D- \! y2 Z: }- z
    wait();# f4 Y7 x' J0 @+ C1 E+ |
    RS = 1;
2 p6 L! B% ^' r  j: j    RW = 0;0 h3 y, n) J7 v' U9 Z
    E = 0;: D: l8 O+ B) f; O. @% Q4 x
    delayUs();
/ C8 N6 M2 \3 f  b4 ?/ H+ h- Y    LCD_DATA = dat;- _8 n, R) m9 {$ d3 a/ M; [
    delayUs();
, T* t9 s1 g7 ^! Z+ ~4 p$ x. Q' @    E = 1;
1 p( G. F& f" \4 p* i    delayUs();' S0 q' A) Z+ d- o9 X
    E = 0;4 i3 n, ~$ r: s
}
" a7 s  d$ ?+ I$ ]$ v
. z0 B6 k$ {/ ?5 e/ H& @+ O//初始化LCD  y, Y3 k7 x& M8 r6 Z6 [, u% Y  \$ A
void init()
" L' S2 x, R0 h! P{
9 _. m/ h. J1 Q& g    PSB = 1; //并口方式  S2 E9 d# A) H# y9 c
    writeCmd(0x30); //基本指令, 扩充指令为34H, }. `8 K! {. u" y# x* ?8 h3 _
    delayMs(10);
, o9 z1 I; G: l( e& k6 Z  y    writeCmd(0x0c); //显示开, 关光标
, G7 R0 X/ V2 p8 q) p* [    delayMs(10);
2 v1 d$ y" M, w2 P. z    writeCmd(0x01); //清屏
3 s" d" f) h0 F( p6 \* O! j+ V/ K    delayMs(10);: j2 T$ Q. O5 b3 J* T
}1 D. E/ w% h- c& A6 e1 y
; |! [, ^0 e( U$ @0 \$ p1 \. N! n
void setPosition(uchar x, uchar y)
! f) I; X+ U6 n{
6 C  ?9 T$ u% D! U    uchar p;
0 o/ q6 s$ x* O1 H    switch(x%4)
0 ~7 {! o) X/ c6 ^3 o2 r9 s    {
" B' L" Z5 U% ]4 m" f        case 0: p = 0x80; break; //第一行开始地址9 `7 M  G" F1 o  X- B9 _! i& `
        case 1: p = 0x90; break; //第二行3 m. o- l) O9 w
        case 2: p = 0x88; break; //第三行2 [  q/ E5 S  d' K6 e. S7 s$ V5 d- Z
        case 3: p = 0x98; break; //第四行, ]) M  e* @. Z
    }
5 ]6 K# _6 M# b    p += y;8 e7 a3 V* F5 O, u
    writeCmd(p);1 [) a5 l# B2 x5 {
}
# I7 t+ A1 j3 x* t1 ?: Y9 \void writeString(uchar * str)
/ N: D1 o, Z& |) B{5 E3 A5 Y, }6 i1 n
    uchar i = 0;
$ W" ~2 N% S9 l( R' Q5 B9 S    while(str != '\0')
8 l; y) B% p. q0 u    {
& C; N( Y0 O: v' p* Y. H& M        writeData(str[i++]);
/ z- P% ^1 O0 \0 W  D' m3 b) j$ D( l    }0 B, v1 ]  T' ~4 T! K
}
9 n. |  d- \% `6 H2 ?: U$ E: Z1 i- d
/***************************LCD12864***************************************/% i, g% X: ]' X
' F1 ^& j2 A3 I$ c
void main()
# G) g1 C+ J  T{+ g) f9 @* D- x5 t: C" E" E
    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作
5 k3 _3 F8 o# p" n. v9 R8 f% x    dula = wela = 0;
- S( M9 L" Z8 V1 Z% g    init();: q& F9 a7 u; G0 W: r8 K
    setPosition(0, 0);1 F4 G8 u3 P1 `$ x; H
    writeString(datas1);% K, ?* ]5 d, e3 \8 s4 w
    setPosition(1, 0);  g. d& a9 b' P7 Y7 N; a; K
    writeString(datas2);! e- Y: X) r8 J+ O' J9 g
    setPosition(2, 0);
0 G  Q* R; a4 M    writeString(datas3);
) F" D$ X  s2 G" r+ t& }( P6 }9 s    setPosition(3, 0);% W- o5 L4 d# V* p; z
    writeString(datas4);
; T+ n0 h7 I! V    while(1);* M- N8 s- c* M4 B
}# v' }, B, J) i- l$ @& N6 j
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-26 10:58 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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