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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I/O接口与LCD引脚的连接详见源代码注释.+ `! r. t2 }2 b6 }/ W8 C
6 q+ _- U0 Q+ [* W, W
//带中文字库的12864LCD显示程序3 l; ~, Y/ y  k) n' C' w2 l: c+ ^' x! ]
#include <reg52.H>- d7 {/ z: k1 {8 T9 Y& A0 X
#include <intrins.H>- b& M4 |, [# U6 q% D: `

5 H3 n; r' r: ?6 p' l! q#define uchar unsigned char) L+ R- j( H* o0 a2 b
#define uint unsigned int9 @/ g- s0 ]& x$ _. [

' H. ?# b- _8 G# [8 Y9 K% ^3 xsbit dula = P2^6;
5 m, c6 T! q2 s  d% Msbit wela = P2^7;
" H+ J& b3 F0 ~, `% U//SCM12864-05端口定义# F! L4 _5 M& r' `9 ?1 I; I% U- s# \
#define LCD_DATA P0 //数据口
, V; R: R2 J& ~. A  m' ~. ^. Ksbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
" A& L$ _! k. Rsbit RW = P3^6; //并行读写选择信号, H读, L写
" h; V/ A: S* v; `sbit E = P3^4; //并行使能端, H有效, L无效
7 H8 A0 n- H$ f6 N  x' A; o8 b% Nsbit PSB = P3^7; //并/串接口选择, H并,L串: F& c" h/ ^/ T3 M2 a! z
sbit RET = P3^3; //复位, L有效. X$ ]7 @# i' G+ }
! P) k. _' d) O$ U' V
uchar code datas1[] = {"广东工业大学"};8 f/ d, J9 w; F7 p
uchar code datas2[] = {"自动化学院2004级"};
+ u9 [; n6 I% r9 t! h% buchar code datas3[] = {"网络工程 (4)班"};
, C' W. [4 \) J5 C1 O6 r/ uuchar code datas4[] = {"fengmk2@gmail.com"};- f$ C$ [/ Y: c+ ]+ [
& e0 b! d# _5 Z
//延时约2us$ i' C8 s8 {2 ~5 _# N
void delayUs()
/ T- J! w  t; Y. C{
. N; F0 m' ^4 t    _nop_();_nop_();
/ b7 n  R9 f6 W9 d, Q& B}
3 O/ Q1 x' Z3 b1 ?) \4 @& `//延时 a * 1ms* ], n4 E! l+ ^8 T
void delayMs(uint a)
' j$ d& `8 |* _& Q* M  b{  h  B6 {, T  y! ]; n0 d
    uint i, j;: y7 O$ j- m% T( s9 b! a3 g
    for(i = a; i > 0; i--): _2 Z6 t: `) S0 O/ V
        for(j = 100; j > 0; j--);
- F9 M6 |. I4 i& a/ X7 y' i. B}: O5 U0 g6 `# n8 R: n% F; H

; _  Y& I- G, p: [//检测LCD是否处于忙状态, 若忙返回1, 空闲返回02 e: I% t# i" f( n8 @* M
bit checkBusy()$ `0 T) d& |9 N9 f; j
{
! G: L$ _0 y3 S. N5 Y+ j    bit busy;7 {4 K9 k, F" ^5 U! S1 T" K
    RS = 0;9 W+ l. D; f: |) f' U
    RW = 1;3 a" s) Q! h: x0 |8 H) h& q$ F
    E = 1;
6 j+ H# Y6 ~0 i4 J4 h6 N/ e    delayUs();
* P& j) N& p2 t6 Z( n    busy = (bit)(LCD_DATA&0x80);
/ h* V5 R1 H$ L+ u  n; r; O    E = 0;9 U/ w  W+ z% R
    return busy;
  m. L- {6 G: J( f4 L}
& c- W/ ?" {3 Q6 S
2 P* z' P7 r2 _* q; F//等待LCD到空闲
; s  e9 f. ?! c. _3 Bvoid wait(): N" E4 z0 }/ p: d* N
{
& \' o3 q, o! I8 ]- A8 B    while(checkBusy());4 Z  e% j+ y2 J4 O
}4 k/ h9 R* X, J

- B7 H% i5 }, R//写命令
- x7 g+ K9 b. y# u, B7 d$ y" g0 Ivoid writeCmd(uchar cmd)) \( o; d" x! n
{
1 P2 s) ^9 ~, R8 E2 j3 h5 J    wait();7 K- s, n3 d9 C1 U. f. Y2 U8 S
    RS = 0;
/ r6 p: H9 L9 i- K4 i! K$ l5 D, t    RW = 0;
0 o3 t/ P& l! [- P2 S* m    E = 0;
5 V6 z* R8 P4 b* d    delayUs();
4 m7 X' E; ~: M! b    LCD_DATA = cmd;$ b6 v& x! u3 T/ D# X. L
    delayUs();2 i2 q  F4 l) P( z6 Q
    E = 1;
- A8 e6 A* }( }# N( J    delayUs();
% k, i9 P* @( q& ~    E = 0;
: t9 N6 P4 ?/ j& j}0 X& r" f( l. z& j9 P$ p
' X% P, ^3 x3 R" m9 @
//写数据5 k0 a: Z/ P5 e* I$ Y8 f8 g
void writeData(uchar dat)
' o! p% `  ^) A* [9 [{2 q0 @5 D* l, x! L
    wait();, K% U/ S0 P: a* P* ^  s
    RS = 1;
: b( J$ E; R  }/ S0 m0 g    RW = 0;
7 L8 Z. W6 j+ m9 T    E = 0;! S' P4 A$ b; \0 @
    delayUs();
/ W2 \/ a  U+ l# F- ?, `    LCD_DATA = dat;
! y; g/ Y) ~  A    delayUs();
$ J. {$ u# _. l  m' q    E = 1;' ~0 l3 ^9 m: s  @$ I1 h, ^* z
    delayUs();% d$ V, |, i, z5 c- n
    E = 0;) z! H9 M5 L* N
}, z4 r7 E  Y( ?4 W3 \$ ?
! ~. a7 l# X+ B# P3 J$ a% K  m
//初始化LCD
4 H4 C; q- y6 Q, b7 kvoid init()
3 }2 Y: z' r5 T( d5 X7 G{
: e; p8 _3 I* O2 i$ ?    PSB = 1; //并口方式" c' S; y1 H* o2 Y4 Z
    writeCmd(0x30); //基本指令, 扩充指令为34H
& N0 i) g! _6 ]" D% Q  i& f    delayMs(10);
) R% k0 @: c( Y9 }0 S    writeCmd(0x0c); //显示开, 关光标
* C7 p3 x2 h/ O& _6 j5 d: G4 V    delayMs(10);
5 ~$ A  R6 ~# u) x4 |    writeCmd(0x01); //清屏
$ E7 @' y) r# c4 b    delayMs(10);
" B+ B8 B! f2 E}
( m, p+ e+ ?( n) S: q
' h, L1 a" |% S8 }( M( I3 qvoid setPosition(uchar x, uchar y)1 s' u6 n2 f) R" e
{
' _- z  I4 [! g    uchar p;
! K+ j0 s! f! _! s  H8 r    switch(x%4)
0 P/ P( Z8 s- F/ J) Z    {3 c7 q# M; ]: A( P- x4 u8 ?
        case 0: p = 0x80; break; //第一行开始地址+ V7 `1 K: o: Q8 a. X9 j  a
        case 1: p = 0x90; break; //第二行6 K4 X- G; b' A, k1 c8 m
        case 2: p = 0x88; break; //第三行9 R! ~/ K4 [: v
        case 3: p = 0x98; break; //第四行! d9 [( _0 o" k: M& [3 x
    }
8 }3 V) R0 L2 M7 E    p += y;
2 w! ?' S5 F, \5 R8 I    writeCmd(p);3 w' R5 S) H: g3 ]' U) G
}
3 |8 H$ D+ D: c$ h" Yvoid writeString(uchar * str)1 m4 g, p& H) E7 i  t% g
{+ x( q4 G4 X5 i. Q8 e4 v$ Z2 N: c
    uchar i = 0;8 t- z0 ~1 E( ]$ d; o
    while(str != '\0'): b* ~- z+ `  X( U4 e0 t
    {
1 B0 o: K: o* X! S1 W& y7 W2 t' q! m        writeData(str[i++]);
4 L' U& T/ Y2 C! y, l. h    }9 D8 U+ K& A8 l. N
}
  U  B' M; ~) H/ v, |+ k  b/ M, |5 y
/***************************LCD12864***************************************/8 x  t$ s- K5 ~9 _! Y
9 J2 H% u% b6 O( k) r1 [
void main()
& i  @, p( L! i7 ^, d& S. B" k- ?  |: }{. f) i* K$ ~1 ~2 m
    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作- {, n( S2 w) s, p7 {* C) X
    dula = wela = 0;
; U8 U+ J) T0 g! R/ w* F( n/ n7 ~0 U! W    init();" E/ N4 m9 S- C% J. h8 O5 m
    setPosition(0, 0);9 A; i$ L9 I* B/ L
    writeString(datas1);
2 i* Q4 z: P( a# m  A: s# I    setPosition(1, 0);
; k+ Q( V; A; J5 V0 Q* r    writeString(datas2);
0 u$ V4 j# _" g$ y) m    setPosition(2, 0);
2 T( P7 p% K7 R9 t; {    writeString(datas3);' |2 C. `3 w3 G% h
    setPosition(3, 0);
# i+ ?, c1 z  H    writeString(datas4);
. S& N5 R5 ^+ ^5 {! E0 }) z    while(1);8 Z; Q1 z& P8 D/ m: }
}
% [4 s8 H4 X& l/ s* q6 n4 A# n3 T7 P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-12 14:24 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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