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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
I/O接口与LCD引脚的连接详见源代码注释.
: q5 O" j- l% G- l3 {* i9 u. y& D- h9 p# Q0 H: R% V
//带中文字库的12864LCD显示程序$ Q- H1 t* F) v! X; p; n& h0 T$ R
#include <reg52.H>
5 p3 y+ ?4 q5 p( E2 f#include <intrins.H>
/ {0 A2 i0 l  F+ u, d
) ~( J4 K) T6 t1 F5 B#define uchar unsigned char
& G* |( V( p  {9 ^  I# u#define uint unsigned int
6 M9 P( T# Q) P) b: ~! ^
3 g, q9 `3 ?# bsbit dula = P2^6;
$ _1 ?0 @% ~1 {' o# p* M3 Bsbit wela = P2^7;
* ~* h0 \7 a1 g, D//SCM12864-05端口定义
' G" o. w+ y/ ]& O; e#define LCD_DATA P0 //数据口
: L6 c1 U7 G( _  s7 `sbit RS = P3^5; //并行的指令/数据选择信号, H数据, L命令7 A* Z/ r4 v% c: t4 v* ]1 I9 C4 U
sbit RW = P3^6; //并行读写选择信号, H读, L写& u) B/ t2 k2 q9 C
sbit E = P3^4; //并行使能端, H有效, L无效( W+ @; N: B; X2 d  K. b
sbit PSB = P3^7; //并/串接口选择, H并,L串$ v# z6 L1 R$ G# n- I# b
sbit RET = P3^3; //复位, L有效
$ x9 D  P7 E! K2 f% E
9 o% z' c- L3 ]1 r9 s. buchar code datas1[] = {"广东工业大学"};
6 Y  B- L' D. E2 huchar code datas2[] = {"自动化学院2004级"};# ]! o7 V) _9 h/ B7 W/ l
uchar code datas3[] = {"网络工程 (4)班"};# \& P8 a7 ^  m0 K
uchar code datas4[] = {"fengmk2@gmail.com"};' W  h' J& \8 w$ M0 ]5 ~/ r4 ?
+ `" r. j0 o3 }$ R7 Y
//延时约2us- g6 V6 `  a& f; t! d+ k0 M
void delayUs(); Z7 G% I: m* b" u# [9 ^
{
  B' W8 h# @! ~  r; r    _nop_();_nop_();" @6 M: U3 y" L9 H  L
}+ Z9 ~+ |: T, k2 f/ O7 j
//延时 a * 1ms* d% |! m. a! a2 z4 D7 O, d; T
void delayMs(uint a)* e- D) ?% t: j
{5 J2 Q% `$ a+ N4 y( f, p
    uint i, j;- k* l- H  l2 _8 n# J% _' i
    for(i = a; i > 0; i--)
) A7 Z2 M) X6 d1 u& o        for(j = 100; j > 0; j--);
# R' G# \1 e: O6 q/ k0 n! P- p}
+ M: \4 J7 x! J8 S; `6 ~2 t) \+ w( \' S5 h: Z; r2 X
//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0- A+ ^* l6 i* C$ y" W6 G$ K' i# ]6 k
bit checkBusy()
) Q5 [; p3 V# W0 f& @) Q{; f. |  d# ^9 x3 Q8 ?
    bit busy;
6 [' G$ Y1 P' Z& W3 [' L! a    RS = 0;$ K$ o6 r) z1 S2 n9 f% h- z
    RW = 1;+ O' h- \4 r6 e( r
    E = 1;) A( |* N, ?% U
    delayUs();4 X% t; ~; D# F7 w9 K$ E5 |" u
    busy = (bit)(LCD_DATA&0x80);
3 q3 P' y2 x  C2 a+ {7 Q" T    E = 0;. S& C' m0 N; O: b' w6 E+ L
    return busy;
' p# J* H$ S$ }2 e: a! h}
7 v8 k! b; {" v  Q0 ]/ s- }% o/ v
* y5 o  u; A$ h9 |8 \# g& C//等待LCD到空闲5 x/ e" v# |1 A$ T' y$ B$ h8 T, A" q
void wait()
9 u4 I# p9 x2 c{2 r, Q  k" A$ I1 [
    while(checkBusy());
% ^6 ?; O& F+ a" h6 P. S8 o}
- U$ s) c; ^9 v
' S" k8 Z& b5 K) f//写命令
4 S( w+ K( `4 W8 m( B" W; bvoid writeCmd(uchar cmd)
: C5 L1 {1 f0 o! t{
5 S( Y# A: R' Q5 ^, s    wait();/ \5 ]5 J. N# d% O9 Z9 e0 r1 M
    RS = 0;
$ V0 ?8 L7 \$ T0 V, W' l" h4 R: b    RW = 0;
( W; X6 F6 {$ m    E = 0;. [9 p- z) J2 |) X4 E
    delayUs();1 x5 }; e! h% O6 i& T7 a
    LCD_DATA = cmd;
0 P1 S- I! h% X9 O! y    delayUs();
; s/ e0 D* z0 _* N% {    E = 1;/ w  }: W8 o( S7 `& ?; C
    delayUs();
# X) w/ V1 |6 O    E = 0;
- f# e1 H3 {+ B+ C3 M}' }6 O. {6 i6 ?" a' X
. T: b. ~7 j+ c$ U0 a1 A, o' O  T
//写数据5 t( Y3 V8 _4 _* X
void writeData(uchar dat). M8 G: M. Y' M/ W8 A
{) t* w& J2 w! j' X, R  Z; W' Q
    wait();
6 J: r8 Y" y0 a% s2 |3 h1 k7 E5 A    RS = 1;. x2 o  `5 |" q9 k& @( h, k
    RW = 0;% v1 I! j  j1 G& K' i. `
    E = 0;
* B; R$ a$ F+ l7 e( A0 F. s    delayUs();  V. Y% i# `( |  q% v. |
    LCD_DATA = dat;4 |4 j/ u+ a5 b  e( Z
    delayUs();4 E/ n/ J1 }. h+ E4 a
    E = 1;
# Z( J: A1 i8 H# l1 |6 M    delayUs();; K3 r# b( ^# x1 s4 m# E
    E = 0;
& k) \0 y  y- O7 N: B$ ~}
4 p) w4 Y7 a5 N5 h$ j1 c( U$ z( q8 m% B  g" x
//初始化LCD/ N  p/ |8 ]  ~1 g
void init(): s! H7 }+ ]. k3 X) M
{
# P* P) @4 Z3 B# |9 V! \    PSB = 1; //并口方式( e8 X( }% |: k+ O) P9 M
    writeCmd(0x30); //基本指令, 扩充指令为34H
2 U" x4 w1 I) h* R$ t4 M( l    delayMs(10);$ {4 t( Y. Y& n# ~1 o
    writeCmd(0x0c); //显示开, 关光标9 F* o2 `, f' z$ @% c  T" ^( O* K7 J
    delayMs(10);  V, @( k' G/ b: m  u/ ?5 K
    writeCmd(0x01); //清屏
1 A; G% X  N' F  ^/ r    delayMs(10);
8 C& S8 s1 i: }7 H3 a}
3 q: ]# P, S& R6 r- ^
8 O' [4 Y; Q; Ovoid setPosition(uchar x, uchar y)
  X/ E7 ~/ T$ P1 O: N{
9 h) ^. a' S8 C6 W! W. S    uchar p;
7 z6 V. f3 F* D; G7 i6 O( s    switch(x%4)
3 Y, @7 x9 ]" z- X    {' @0 X' n4 g* r
        case 0: p = 0x80; break; //第一行开始地址; F7 m* [0 I$ v8 v
        case 1: p = 0x90; break; //第二行2 P4 F- O1 M4 c3 c" J
        case 2: p = 0x88; break; //第三行
& D* C) d9 u& p* T8 Q( b        case 3: p = 0x98; break; //第四行
2 [2 }0 j8 j: b$ r" K    }
' Q- G5 [6 y  T1 m& {# n. q$ H    p += y;
+ j! Y6 n5 ^, T/ w- B    writeCmd(p);
: l0 c6 h8 u# S6 V}( Q7 K: b& y" @& P
void writeString(uchar * str)0 n4 R& \# }* I6 S
{
; T; Y& J( M! R! f+ ^9 j    uchar i = 0;" M: J$ B+ D: T- Q+ N0 Z
    while(str != '\0')/ E' g' l! Q0 e+ o" d, z
    {% e; j  s: q# B# a
        writeData(str[i++]);7 {' d+ G/ V1 f0 G8 O+ z- M
    }9 H& c; _9 Y( C) d, L1 G
}
1 b$ r; l: |! z" H/ Q7 c: X; Y% o
! p: |$ W6 n2 @+ n; [- \/***************************LCD12864***************************************/( \" E* w( J5 u2 b
: }/ R! X" R4 ?0 V
void main()
9 g+ ?8 D* M( V+ x7 E4 g* O* U{
0 U% D6 C9 |* g* O9 A* Z    //先关闭数码管, 使两个锁存器锁存, 因开了数码管, USB电压驱动不够, 将无法使LCD正常工作  f& Y$ m3 @( ?6 U5 \! n* K
    dula = wela = 0;
2 u" I' ]0 c, ^- e    init();6 M1 c0 \  R% U5 Q* P7 h+ l& A
    setPosition(0, 0);, [5 D* l- }# T+ H$ n2 }% K( f( a
    writeString(datas1);
' _( a+ ?3 j' D: ^  a" M& R    setPosition(1, 0);! N- m1 l7 f0 D1 @; ~
    writeString(datas2);
( l8 [7 M  Q" w$ z+ ?    setPosition(2, 0);
; `# R; U+ D8 C+ ]9 l- {  R    writeString(datas3);
, [* N: J3 B" `4 e# ]) P    setPosition(3, 0);8 j! g. m% m3 k1 \& e
    writeString(datas4);
4 I4 ?. Y: G0 u7 s- |( @    while(1);, j1 H1 C5 L1 [0 {$ |2 K
}/ P6 j6 `& x) ?% y( m+ @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-18 16:05 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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