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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I/O接口与LCD引脚的连接详见源代码注释./ v' g* c; w, J; ~2 ]- M
) [( S. f7 {+ T5 h
//带中文字库的12864LCD显示程序
' }2 J0 T: w( Y3 L; B% l  y: Y#include <reg52.H>& f9 c8 A3 X* F2 O% f  |0 X5 Y; h
#include <intrins.H>; E/ {& I9 ^3 l5 j
- k5 Z: t, G, j# }" H4 T0 G7 r
#define uchar unsigned char
/ _5 X/ X0 y  |#define uint unsigned int
6 Q7 @3 A& y* ?' t2 z; i3 b' B6 }! B5 Z
sbit dula = P2^6;6 r& \3 e4 C6 {# e' {
sbit wela = P2^7;9 d5 X" L- |! u6 A* a$ g# O
//SCM12864-05端口定义" P/ K( N) {8 H  n7 _& J. E1 h
#define LCD_DATA P0 //数据口
- ?3 O8 r" U7 J- g8 Q* jsbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令
$ e8 ]2 Z, A, M0 J1 Ksbit RW = P3^6; //并行读写选择信号, H读, L写8 j  ?' C2 e& o; R- z4 a
sbit E = P3^4; //并行使能端, H有效, L无效  g" P  P" B* n
sbit PSB = P3^7; //并/串接口选择, H并,L串4 Y9 S. k$ s! r; t* O3 V
sbit RET = P3^3; //复位, L有效
2 s+ a# K) h( c1 ~6 p' Y: p: d+ u+ y1 n- j
uchar code datas1[] = {"广东工业大学"};
5 E% j: l' f3 ]5 p  Luchar code datas2[] = {"自动化学院2004级"};
& ~" C' \" u- g  r9 i( Z5 {uchar code datas3[] = {"网络工程 (4)班"};
* d) l9 q6 K% g$ b8 Wuchar code datas4[] = {"fengmk2@gmail.com"};
9 Q5 m& N  @$ m& U) S" C
9 T7 W4 O3 c, G0 P1 l1 Y: ?6 \4 \( X//延时约2us
" J& \' E- T1 @  K2 avoid delayUs()% `0 k% x% p" a7 Y- w  O
{& K+ }& n% z3 r' E
    _nop_();_nop_();9 e5 f8 b6 I# R# z7 \9 j$ T, t
}
6 E2 u$ E3 \: p; V) k1 \//延时 a * 1ms
+ x) S* o1 I) p5 B* L5 g$ rvoid delayMs(uint a)6 u$ n9 k& X, \+ v" D, N2 ~
{
6 K" Z( H$ y2 Q    uint i, j;. k" B* g5 w1 P. W# l4 ?
    for(i = a; i > 0; i--)
, R4 K. X( k+ B  D: [3 I        for(j = 100; j > 0; j--);
, E8 i) B( S( e7 e$ Y- Z& p. A" ?}8 J2 |4 m; \. D* W1 K# r7 }, H

* P. |) }5 a+ i4 {$ n//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
! P2 T9 ?7 g" x: @( W! W6 jbit checkBusy()
3 W! s8 }1 i$ ~/ N/ I" F8 a{/ J: K' M' t/ ?) d* A
    bit busy;* R4 u1 x8 ]) m) t6 p5 b  M: w
    RS = 0;/ p% R1 k4 F% d) n
    RW = 1;8 z4 ~' }1 y% h5 q
    E = 1;6 e( x2 D9 R9 X) d( r) M/ r
    delayUs();, X  R6 F% Z4 I& [3 P# {; F
    busy = (bit)(LCD_DATA&0x80);
4 s2 y8 p4 g4 T& F/ e  x/ E3 }    E = 0;
5 }& O6 H. M8 \    return busy;
0 k& A; W9 H' r& |" G5 G}
; x2 ~+ A7 `( D( i3 d9 P* X+ g, G: z2 q, [+ g7 {; u
//等待LCD到空闲
8 B0 X- Z; x! w( E' vvoid wait()
2 V" `) C3 o$ r# w: J{3 c+ F) n, V0 N6 i3 @' Y. a% d. ^  K
    while(checkBusy());( c2 n0 x* f- _% T7 m  C
}2 o; y' n9 M9 V" q

/ \' Z  }* _; t2 O  c' v//写命令
8 `7 X5 D$ v8 }( ~4 U7 U* rvoid writeCmd(uchar cmd)
" J% C1 M- x; {3 L; j3 |) V{
! s& P0 [! c6 P4 ~% P4 R    wait();! o0 @6 q# I) ]* c- V
    RS = 0;
/ x% F6 u6 j/ ]( e: N0 ]    RW = 0;
8 ^. B9 P8 B4 w# h6 w5 T" e; O! h3 S    E = 0;
  D! ]6 U( W$ H) H0 h9 b% {    delayUs();
9 g0 G7 N2 P& [8 h& q7 v6 x    LCD_DATA = cmd;
% H* c7 |7 [. z" {    delayUs();
* G5 E3 D: h; ^* n    E = 1;* S6 _. u6 m1 R
    delayUs();
* T; D, r! u' C6 Q9 A* Q& J    E = 0;
3 n/ }/ f6 ]! O6 K7 `}6 k% j. F) E7 \7 q% U3 D$ ~, t

. G6 Q% g6 f1 s+ R5 a//写数据+ b6 N" z$ p$ ^2 Q1 o
void writeData(uchar dat)1 P$ B* V3 V+ @. i7 k0 f$ D* O
{
2 \; t/ \6 S  |7 n2 J6 [4 o/ i    wait();
$ h- c- O, a* H7 o- ]! X    RS = 1;0 ]5 h1 d5 v, |$ W, N9 k
    RW = 0;  w& e) L8 i' E; q9 }
    E = 0;! W: T5 j6 @! g; b
    delayUs();6 g& |% _( o2 m
    LCD_DATA = dat;
' b$ L/ T" ~* b    delayUs();; V5 X% S9 |; i: p
    E = 1;
- A9 g8 q  x# Y6 N( L/ }# R    delayUs();
- g9 o) s7 s& d7 `+ [    E = 0;: b* r) S8 O: P, h8 F
}( p. [8 R6 J, A. u) j- d

% t; y& a2 z; Q& E/ ~+ h//初始化LCD' [9 _7 W" m8 p/ c& r0 ?
void init()' V/ F( }7 q% C$ p$ F
{0 @$ W# C8 a4 o, C
    PSB = 1; //并口方式( u3 h* ~: b- K8 Q8 D4 r
    writeCmd(0x30); //基本指令, 扩充指令为34H
1 a! W0 }: ]3 ^2 ]    delayMs(10);
, A0 `5 o: N( ~1 s( K9 b    writeCmd(0x0c); //显示开, 关光标
" `* K7 a& n% _/ n    delayMs(10);
4 b& K1 n* [' o' _    writeCmd(0x01); //清屏
- i/ D+ w0 Z& p( E2 M    delayMs(10);
* K) R2 s  ?( d/ F+ E}
- _1 N; a7 a3 U# w" `  B) `4 w: \9 \. Z' Q
void setPosition(uchar x, uchar y)9 F; @0 G. n/ P/ ^
{
+ m# F' U: V1 J' W/ Z    uchar p;# m. T- C- x; F5 t; V, a
    switch(x%4)
8 Q2 [$ C2 |- ~5 ^9 c1 N* @9 Z    {
/ z8 D! h. S5 L" x1 Q8 P        case 0: p = 0x80; break; //第一行开始地址. p& f1 j" c1 {0 |- U
        case 1: p = 0x90; break; //第二行& |7 w( p, @2 J" z. v9 B" D, A4 z
        case 2: p = 0x88; break; //第三行. s4 r4 ~4 Z: S8 z* w
        case 3: p = 0x98; break; //第四行. w6 G* e* O- Q0 P- G
    }
/ e4 `$ a& K+ f" P4 |' ?/ N" y  q    p += y;6 v9 Q! d5 P$ w# \
    writeCmd(p);2 I1 N8 ^# k! ^; l# W0 F6 r
}& [' B2 N+ [& a) v; D, w
void writeString(uchar * str). i' g9 H7 k) P% C# {) b8 M3 J& j5 P
{* d9 r0 M. a  ]0 B0 Y; i
    uchar i = 0;
0 {: z7 l/ o3 Y+ G* g# z    while(str != '\0')
: S9 {& K! @7 p8 j3 ~0 d    {. A% x9 Y! H. n3 C1 L. d, h+ H  Q
        writeData(str[i++]);6 R: x7 h+ N- {
    }
) S. k# _; e; Y+ x" y1 W}
5 k& f' }  L4 d9 ~: M( e5 W2 I; L
/***************************LCD12864***************************************/
' Q7 _- n& k! |1 ~. r2 I( X) d1 L6 F' b0 w
void main()
* g+ W& \2 ~% D. z( z1 b6 a: |{& Y, q! {; d2 V! q% ]" _
    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作( g, R) [; i, y0 S# J6 F$ }* Z
    dula = wela = 0;
! t. u: e( x" \9 K2 Y- K, i! S    init();/ D6 |1 ]) I. z& [9 b0 a
    setPosition(0, 0);
4 C; S, m* q1 n! M5 N5 f7 X& q5 }    writeString(datas1);. A8 m% f) t- b; f3 c6 \: J, f7 Q
    setPosition(1, 0);
+ `) E0 m! i: C4 n7 Y, D5 D& v' {    writeString(datas2);4 X/ E# c3 X  x/ S
    setPosition(2, 0);
! Q) O6 C& z- f' U. W2 ]) c    writeString(datas3);
! `( ]3 w* C* H  Y) _    setPosition(3, 0);3 R4 t$ a( w8 Q$ e, k
    writeString(datas4);) U) R" Q! P+ O' `4 {9 t
    while(1);- m8 v7 K0 H2 u( Y6 Y3 F( K9 G
}
0 f6 s8 y; ^3 d: ^8 M2 v7 y/ q# y1 u
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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