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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I/O接口与LCD引脚的连接详见源代码注释.
  p! ^. w  f: g: M/ G9 R0 }0 ~7 H
% Y. D7 f( Z* w3 U: u8 r//带中文字库的12864LCD显示程序% L# T6 Y0 j( i5 B$ h' L" K
#include <reg52.H>
8 j" C/ D8 X0 K7 M: [1 ?#include <intrins.H>
7 s. v4 O1 I( ?' h0 L+ h$ x. H* q$ y6 J
. b3 h  O) @* r#define uchar unsigned char, ?/ f6 E- B5 s
#define uint unsigned int
+ U8 h# Z/ y% d% ~5 G$ Q- x3 o, f/ {7 |2 W8 ~
sbit dula = P2^6;
4 Z' I8 E1 r& y3 H+ l0 bsbit wela = P2^7;
8 K; L# o  |4 A$ Q) s6 ]//SCM12864-05端口定义
  D6 U- I' O, O) ~  b#define LCD_DATA P0 //数据口
/ x- W4 P  D6 W& Hsbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
* W( ]# d, [5 O1 l+ gsbit RW = P3^6; //并行读写选择信号, H读, L写$ \& ], N$ e9 p( P5 W+ p
sbit E = P3^4; //并行使能端, H有效, L无效7 h4 O' ?; n/ k5 j5 {
sbit PSB = P3^7; //并/串接口选择, H并,L串
1 v9 D/ d$ M, I) I" dsbit RET = P3^3; //复位, L有效: w. `! Y6 M4 S5 Q

9 F# u+ O8 K; |1 s  Buchar code datas1[] = {"广东工业大学"};
# d5 `- [3 P" w; cuchar code datas2[] = {"自动化学院2004级"};5 c3 B5 y6 Z# z7 g
uchar code datas3[] = {"网络工程 (4)班"};
; _" z& g9 C9 {+ ?; V, ~uchar code datas4[] = {"fengmk2@gmail.com"};
% x: M! A# I% h: Q1 q" n
, Z8 y) _7 _$ o1 A2 j" ~//延时约2us
4 Q8 q3 F; M0 X' S% `0 h* H# rvoid delayUs()* g8 V3 |" l4 d& V; K
{/ q; a2 Z: Z. ]0 @
    _nop_();_nop_();, C7 G2 A- t4 q1 G
}4 p) v: e! z; d& x0 b  g
//延时 a * 1ms3 F9 `. N0 d6 h6 K; B
void delayMs(uint a)
0 L) I, {: x" z" `5 m- v' P{
, Q3 k) ?) _: }    uint i, j;9 q5 R6 J* B4 l) F* o% @
    for(i = a; i > 0; i--)
$ A) l. f/ t  _' T# J8 ]# d* o        for(j = 100; j > 0; j--);
! S" n, v+ o6 i1 D' p" _& }  m}# v, p) I1 S7 P2 V/ s; \
: s  ?  ^. m7 y- n) t3 t
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
' @6 g, a3 _  z1 n0 g/ X8 gbit checkBusy(). O, ]  m: _4 k% g
{4 S0 x. [* A: g) l
    bit busy;, c5 b5 B' ~( J+ q
    RS = 0;8 U; V: m2 g% D* D( O- o: i
    RW = 1;4 ]7 F( O0 C" x' Q
    E = 1;% F2 Y- g3 Z6 ?
    delayUs();8 F! r; ~" _% i+ q0 a
    busy = (bit)(LCD_DATA&0x80);
6 e+ F5 e) K; f. F9 o, f! z    E = 0;
7 ~0 J6 k- n9 d3 S" i& u    return busy;
& i, @1 J- }2 W4 ?2 ~0 X3 I}6 I- B$ w7 T3 p8 i7 O" x  ]9 S

( T; a! o. `. a% ]- z//等待LCD到空闲! K" h! E6 U7 d' B  S( R
void wait()
! }2 w) _1 @% d{% B. f- B% l4 |
    while(checkBusy());
6 S" ~9 _4 w1 k0 Y0 Q, O; d}
* C( a1 p; K! ^4 x! N& y; Q' \- F% [  E3 [0 t# s) L9 ]3 _* J
//写命令
# P2 I: G  M' e% Fvoid writeCmd(uchar cmd)& V: ]6 S& b7 D3 G
{9 M2 [( M$ @' n8 e5 S
    wait();& c; x; ^9 I7 L: s8 Y, ?( _9 t
    RS = 0;
9 V) V: R( M: Z: y+ @    RW = 0;8 X. P; T; N7 {8 P& m
    E = 0;. \. i1 L+ E2 c3 D+ A
    delayUs();" K  B* ^0 F# `" ?. |, e1 \
    LCD_DATA = cmd;$ C! U. A* H, N/ h
    delayUs();8 E* g* d4 Z, o# A# u# D! t9 c
    E = 1;
, Y1 q7 R7 r$ B+ d: @& t- x# o/ z    delayUs();
5 t9 t2 {9 G6 Z1 n! w$ Z    E = 0;
, y& b: Q& R: A7 ]) t0 |}# a: v5 F$ M8 ?: D8 ?& H
) @+ D1 p- x+ x% y. ^
//写数据
, T4 r0 M! T: I) P: Kvoid writeData(uchar dat)
* k3 b( q! G- h0 {2 W{
2 b" M; z( L/ Q3 g' |9 v    wait();  {3 V0 f  e* D- r1 S0 O( w+ U
    RS = 1;
7 v, Z% T  s; ~    RW = 0;, \. a. M- f4 i4 a
    E = 0;( r* d& [2 S; l- P
    delayUs();2 A6 T* _+ o! c+ j
    LCD_DATA = dat;
8 L# d( O  ^2 {! K  {' U9 q    delayUs();
+ g4 {% ^+ l6 `& Y0 V    E = 1;
& J1 P# m! I: T- S    delayUs();/ Z; i4 z. L3 w7 F, ~0 D
    E = 0;
9 A: ], I! Q6 P/ d5 R, d}
1 b3 J- J8 t+ K- W/ M
& I% U$ C* t- }) {5 |5 s//初始化LCD2 T  ]' E5 j+ k5 ^$ _5 Q$ S
void init()$ Z* o+ V' n7 l+ X' u9 Y
{
% B* j7 `4 z  [$ H0 m8 Y    PSB = 1; //并口方式- X3 L, z/ [& {4 @( h% d+ ~
    writeCmd(0x30); //基本指令, 扩充指令为34H6 a4 b8 ?6 }2 ?4 U* A8 a
    delayMs(10);7 t! N5 z4 d9 Y6 G% l# K9 |6 Z
    writeCmd(0x0c); //显示开, 关光标
2 n, }5 J' q; {    delayMs(10);. ?# O, q* B3 _# F" U/ o1 P
    writeCmd(0x01); //清屏( q3 S9 r* f5 d' A! O- }# G/ o
    delayMs(10);
; w( N/ Y7 o' c}2 e8 ~3 @* E, C5 T9 g
$ u6 l1 }$ l6 e/ ?8 w# e' v+ S. K
void setPosition(uchar x, uchar y)
2 B9 B( }- \( }{
: ]7 J) ~5 t  E9 d( u6 `& J    uchar p;+ w1 j' t0 Q' E( R0 x2 B; n
    switch(x%4)3 h& ]5 l* w) Y7 i
    {0 X8 ~9 R4 z% {
        case 0: p = 0x80; break; //第一行开始地址; b/ m$ z  |1 J1 H$ A
        case 1: p = 0x90; break; //第二行0 r- M3 Z( Z' f2 ~6 C
        case 2: p = 0x88; break; //第三行& y2 H( x. W+ {) W5 L
        case 3: p = 0x98; break; //第四行
5 O; G, t) m: g1 W+ S9 k# ]8 f) f    }
9 Z0 O( L' V: u& k2 M    p += y;+ M" ]3 [9 `& V; Z. D3 c6 G
    writeCmd(p);+ r, l, q1 H6 }, q1 R& m
}
- x# O( k* k8 ]0 Rvoid writeString(uchar * str)
! A/ l6 C0 m' J6 p7 p{& R8 O3 O' @! ^
    uchar i = 0;' p$ Z, Z( L2 U- o' ~1 }
    while(str != '\0')
# I% J* Q- d3 Y/ |* M6 \2 z1 }5 r    {
/ e+ {  G5 i; A1 \' @1 \        writeData(str[i++]);
* g; G* p4 L9 `+ _* C    }) T. Q, Y4 }3 Z% y* Y) a6 q  Q
}
' t0 P7 I& f; Q
2 d' ?  b% ?, |* ?/***************************LCD12864***************************************/; z  a4 K) J1 e& T% V
" S9 a7 l7 A, G3 b5 Z6 U
void main()
+ q9 ?( d( c& a{
3 O! h2 m7 [( R- X2 J- j* t    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作# s8 k) O6 n0 w+ y8 c
    dula = wela = 0;- C6 c# i6 u2 U) M, s1 Y+ M9 g3 y
    init();7 N5 _3 C  W1 G& ?& H
    setPosition(0, 0);
5 L7 R9 [/ N5 e; g$ E    writeString(datas1);7 e6 |  P) t6 y& H  e/ M& w
    setPosition(1, 0);
9 f; H" \4 l8 f1 y1 V' y    writeString(datas2);
+ D* Z+ Q" {6 f1 T    setPosition(2, 0);& r# z) a& D/ w; I( [' M2 ~$ {
    writeString(datas3);. k' N+ ~7 j% ]& l$ E# n
    setPosition(3, 0);
4 G5 i! s# s$ @6 S2 F7 U    writeString(datas4);
" B& P* p4 V- e# [! [1 y! X    while(1);( F& i/ P# s- L% C: Y; j9 d2 t
}
  e8 Y) m6 b* t: e: e- w
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-4 08:30 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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