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

基于51单片机的ST7920芯片lcd12864液晶显示程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的ST7920芯片lcd12864液晶显示程序: e: ~8 w: C3 t- I/ V( o
  T4 q3 Y) u& o

: ~" J; i# L4 j( ?3 z% u有助新人学习12864液晶的资料
  d7 q( M; d8 x0 v
9 y) l% P6 {. v, h* I1 ]9 h7 Z$ j% wST7920驱动程序:

7 x1 ^. Y4 @4 x7 l/*********************************************************************************
* C/ H3 l2 s7 K( v: t* 【编写时间】: 2017年3月19日0 `1 d+ ^! s. g. [  Q, j% x
* 【作    者】: 清翔电子:03
* T9 d: @1 f7 t- J4 H* 【版    本】: 1.0
' k; g! K6 t. V/ O9 o9 @" u6 v* 【实验平台】: QX-MCS51 单片机开发板- V+ T8 r6 j3 T) n! E' O  b# ~# j
* 【外部晶振】: 11.0592mhz        - I5 |& P. U4 D5 M
* 【主控芯片】: STC89C52RC
" y& ]5 [6 g. `% M* 【编译环境】: Keil μVisio4        7 K3 P# m; \) S2 p+ Q: v
* 【程序功能】: 12864液晶显示测试                                                                                           4 J8 G3 B, s% p% p- \
* 【使用说明】: 使用液晶前拔下数码管J6跳帽
! n4 H5 ^9 n; x* W12864屏幕向板子外插,插在L1排母上
& T0 P+ P9 a* R: v# F7 G  T**********************************************************************************/
* }# e  I  c  M3 z( L( t- W
$ V. M( _; g, Q& [& n+ d3 p

- O0 R; G( r% p$ P2 S- Z#include <reg52.h>
" O. \, K$ r3 [, T. A#include <string.h>) {$ f5 o) q, z, F) k3 W
. o/ m& ~& d1 X

. T. f' j: |  [8 Y# c#define uchar unsigned char& W8 }+ O' t$ u& M/ H
#define uint  unsigned int# \8 q3 o& w9 ]! \3 Z/ R& [

0 P5 R  q  U0 T3 f
3 D9 n* ?% o$ v& ?- r
uchar code IC_DAT[];/ k$ P, U5 i9 u, I% ]
uchar code pic1[];% R4 J  S* S: Y# S; U# m7 m$ X
uchar code pic2[];
0 B' h6 M- Q; \! |uchar code pic3[]; ! }5 A1 d# ~' g# Z7 J- X
1 c5 |, R) \6 a$ ^

- {" ~0 T+ B2 {sbit RS  = P0^7;
' R: K; P% w4 p4 a! w0 Tsbit WRD = P0^6;; I. {  r4 N( ?) E2 l1 d
sbit E   = P0^5;
( b+ x" m4 K& @9 x4 a' Esbit PSB = P0^4;
' \0 W8 B2 o4 o3 |sbit RES = P0^3;7 o( d: j4 I: a- U) L2 Q
" ?2 e! R: V5 T6 Y

, g+ }' a' B' ?# \void TransferData(char data1,bit DI);
- e0 d( p, ^. Y- q2 K- u! c; {void display(void);8 J! @5 P" v5 `! i4 l8 k
void display_grapic(void);4 ]  J$ u  R. R, L
void delayms(uint n);; n& x: r1 E6 n* I' T
void DisplayLine(uchar line1,uchar line2);, q; O$ G$ [  a* K$ ^" X- b$ f
void DisplayGraphic(uchar code *adder);6 w9 z- m( \2 H- |6 w6 i2 _1 Q
void delay(uint m);6 K7 j5 i# J2 I
void lcd_mesg(uchar code *adder1);
9 |  \4 G& [2 |) k( j+ X5 v$ u# y7 x5 I& d8 N# @
- O9 Z# s$ c5 [: R
uchar code IC_DAT[]={/ @7 b6 T) d' ?0 t6 h3 B4 s
"    智能小车    "  & X  }$ W6 }3 u' U
"    俱乐部      "
$ l( M+ Z0 u3 s& Q) O) _6 X# t"    QQ 群号:     "
. `; T. a' Y+ d' Z5 q"   12933307    "8 [, K- g. A& Q
};
% c' E1 I9 U/ u  W9 V, a8 @7 P/ X3 f7 ^6 @3 l

% l# z) ?: e& U% Juchar code IC_DAT2[]={  b6 v3 o- e4 u* h' u+ m- s/ b
"  床前明月光,  "                        //0x80
  s: [+ n# \$ h! C2 Z"  疑是地上霜,  "                        //0x90
9 u8 y! x- }( K"  举头望明月。  "                        //0x88
, h) M- K& J+ u# n4 u"  低头思故乡。  "                        //0x98) C# G0 F9 K% S) V1 `7 M
};* q, M# I( [7 G' [, S8 f& R
9 `& R. R8 N, {% t1 t! V6 U
" x3 ]+ }/ c6 J; w: ]1 ^2 L
/********************************************************************
/ L! F9 P, \( g  s* l* 名称 : Convert(uchar In_Date)
, s$ o4 b5 d! O* 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。) K6 [( P1 m6 |& g
* 输入 : 1602资料上的值) f6 i# T/ Y7 D2 T+ K
* 输出 : 送到1602的值# Q% m( k8 g) X" u% w
***********************************************************************/
) G- N& P8 y# U/ R( D& s+ Munsigned char Convert(unsigned char In_Date)- b$ q+ {/ P0 I8 h! ]
{
# t2 |+ F. _; X7 |; R    unsigned char i, Out_Date = 0, temp = 0;2 [5 w! n. z& B) P
    for(i=0; i<8; i++)" w' S1 c1 W8 s& H1 t) ~+ f
    {" z9 t( b& ?( l4 ~/ ~, Y6 q2 C
        //temp = (In_Date >> i) & 0x01;
) W- j8 v+ C( V7 ?; H4 \) e4 L        //Out_Date |= (temp << (7 - i));3 V* D7 \+ m  f" k4 g9 T( ?4 n
                Out_Date=  In_Date;
0 L; d0 \' z% W4 q6 w7 l2 [
) @9 w2 P! v6 D( u4 J

/ r! M: k" @8 U* B9 N7 g6 y* c' h    }; y7 l/ [* q% M9 o
    return Out_Date;
  q4 P' ^& b! K. Z}; [# ]+ K; u: {# [
  n& |" Z* ^( x' B( F
5 r6 w, e. {1 V, X5 ?, |; X0 @4 R7 M% m
void initinal(void)           //LCD字库初始化程序8 V! ~5 `  Y- _4 j( M  [4 Z5 h
{( K  \7 n, s3 U3 @0 x( y+ [
           delay(40);             //大于40MS的延时程序7 e6 ]3 z+ g( \" d4 Q2 S
           PSB=1;                 //设置为8BIT并口工作模式
) }$ f5 p( L; Q! b: S' Q( ^           delay(1);              //延时, ], H  Y( r! ]. j( L
           RES=0;                 //复位9 D) Y, Q% Z$ _* U) h" c
           delay(1);              //延时
: h2 ~" @9 A4 V, L  y! g4 E% ]' ^           RES=1;                 //复位置高( n8 {9 d" ^7 }6 F  m1 P
           delay(10);- m! v- ]/ b4 A8 l
           TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF/ f* Z' X( I4 ^- s: h/ l# w
           delay(100);            //大于100uS的延时程序, M. M5 e: Q5 ?4 h+ k3 g
           TransferData(0x30,0);  //Function Set
: _& b2 }  a  Q# q- l           delay(37);             ////大于37uS的延时程序' I* o: w, v, a& N  S+ Q3 p
           TransferData(0x08,0);  //Display on Control, T1 B$ O( I( Q
           delay(100);            //大于100uS的延时程序
) b) ~) I2 r; Z7 y           TransferData(0x10,0);  //Cursor Display Control光标设置( }. ^) M2 p( C% j$ v+ B
           delay(100);            //大于100uS的延时程序3 W7 ^) \8 S5 P
           TransferData(0x0C,0);  //Display Control,D=1,显示开. B; h0 X& h8 l/ R8 c3 D" b
           delay(100);            //大于100uS的延时程序
; ], z; g$ R- W3 w# j* W/ `4 I           TransferData(0x01,0);  //Display Clear
; f# Y8 x7 s- L5 h' L           delay(10);             //大于10mS的延时程序
0 Q, d/ A! t6 S3 }( z* v* ^( e' @           TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动
$ a* z; x. P) ^           delay(100);            //大于100uS的延时程序
1 a) }7 ]" g7 B0 Y; h0 n' J8 q1 O          }6 Q$ B& p) R$ e$ Z* h3 J/ D) ~

' V7 v4 W$ w$ @9 i' p
8 }- b; u- j3 K, D3 |
/********************************************************************9 A& H% y) F2 c4 k6 g: Y. ~
* 名称 : Main()
( q! Y4 p, k, V( Q+ z5 p  m* 功能 : 主函数2 F$ l8 f1 w: ^. b
* 输入 : 无
+ X4 f, p2 {  E9 o) y* 输出 : 无
& N9 a9 D' ?. O# S***********************************************************************/
- S6 f3 f  d5 ~/ Evoid     initina2(void)           //LCD显示图片(扩展)初始化程序7 `/ N5 P% L* P  b4 M: @3 v( T7 O
          {
7 y/ F& b$ Q# }- T+ p' \           delay(40);             //大于40MS的延时程序8 B! O5 L( E0 E& ?( X3 T
           PSB=1;                 //设置为8BIT并口工作模式
' ~+ B4 i' t# b0 a6 Y* i           delay(1);              //延时
7 t/ H; `9 v4 E           RES=0;                 //复位
! e' c, x$ {# Q           delay(1);              //延时7 U$ [0 e5 X2 v
           RES=1;                 //复位置高
3 b% W: x: S+ D1 Q+ s& O# k+ p           delay(10);1 Z" K% S, l+ k
- V" }$ G0 P: B: ~& m

! }! ^+ P4 i# Z: I+ Q           TransferData(0x36,0);  //Extended Function Set RE=1: extended instruction. ]- H) e; M" g5 W% I
           delay(100);            //大于100uS的延时程序  p- ]4 u+ Y+ Y9 [2 |7 p/ G0 m
           TransferData(0x36,0);  //Extended Function Set:RE=1: extended instruction set6 C6 ^, x) d! S
           delay(37);             ////大于37uS的延时程序! x* ], q3 _4 M5 o: k9 f# o1 D
           TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)) Q' U( J; i# E; x  X" _1 `0 s* n
           delay(100);            //大于100uS的延时程序
7 L- L+ h+ |$ C% ]6 n           TransferData(0x01,0);  //CLEAR SCREEN
7 s( Q- n; E! K, I, Z2 |8 Y. u           delay(100);            //大于100uS的延时程序, p; v% d2 p" x0 w' D5 ?
          }
# m: j' v( }; _  }! L6 w% W0 \( R  Y5 _( K3 I6 O$ k4 C

  W; v* z- _2 t& [/********************************************************************5 j# K7 T) \, U. {
* 名称 : Main()
+ f; u" G4 {" |; X0 V* {* 功能 : 主函数
9 W5 Z' h% A5 }4 L9 h/ H6 t* 输入 : 无
# b& G2 \# W9 F* 输出 : 无4 K6 P1 Y% U/ O7 r6 _! z8 F
***********************************************************************/1 X, |  A2 F7 h! ?' K
void    main(void): ^; ?, k2 K5 V
     {
6 Y. G& x$ f$ N+ a         while(1)
5 Z3 ?7 V  m- S' }( o4 _5 P1 L            {
4 D$ }% r0 l8 e( _6 d% V                  initina2();            //调用LCD显示图片(扩展)初始化程序" B( }6 y8 f& C. }, A! [
  5 o$ e* R% n7 d- W8 i+ _! D
          DisplayGraphic(pic2);  //显示图片2& ]7 p- c) {- K
          delayms(200);                          
- c$ n; B3 {. W* I& m, R
7 `0 |+ U4 M# @3 x( H: _

+ t. M7 I& {4 t, }) N% _7 g          initinal();                    //调用LCD字库初始化程序1 \! w/ d2 I+ }( R7 N$ g
          delay(100);            //大于100uS的延时程序+ c8 G$ W: U8 }0 p8 `8 e- L# Z9 f
          lcd_mesg(IC_DAT);      //显示中文汉字19 Q6 U. g1 V5 f( R' d
          delayms(240);
+ k+ j  I$ ~4 ]+ h' H; D7 v          delayms(240);, o+ n/ X+ Y$ D" |$ Y8 i3 V
           , z5 E0 a- b/ |% I/ v% ~; b
          initinal();                    //调用LCD字库初始化程序4 r5 `  C7 J% Z+ i" i9 C7 `
          delay(100);            //大于100uS的延时程序
8 Y; \  b; P# c" [; `          lcd_mesg(IC_DAT2);     //显示中文汉字21 ]5 O  y" G9 x4 Z5 l
          delayms(240);
8 c# C' ~0 A4 X# D                  delayms(240);$ D3 a! U; e' ~( e! r
                  initinal();  
4 j, W( p- P: o& D6 H        }0 Z( [$ p& k) I- P- |* X. n! ~, l
      }
2 D( x0 V8 l8 D
, W5 U) h$ D; R1 g* F: @0 O
+ N) l3 U' O8 W0 y) z4 J$ Z4 {# b
/********************************************************************& n- {8 N5 U  ^2 P" n, ^- W, H
* 名称 : Main()
3 R5 `! ?7 P' ~1 c* V8 F0 t% J, P* 功能 : 主函数, e, Z( N3 I7 w- f
* 输入 : 无
" }' N, z# J3 N: a" [6 z* 输出 : 无. \  G5 B& O- N) [7 ^+ {
***********************************************************************/
$ Q0 `, I8 c- B! vvoid   lcd_mesg(unsigned char code *adder1)
2 T3 L4 n  ~$ e5 e: k; k3 J. F* p{
8 R3 S! B: i2 X0 x& }% M        unsigned char i;
( {  A/ o' d6 `0 z        TransferData(0x80,0);  //Set Graphic Display RAM Address
4 M* m/ l2 d$ j* v7 M. Y        delay(100);$ I, ~& J% f2 V% n6 `
        for(i=0;i<32;i++)
0 x1 p5 @7 c# \* j8 e                {
5 d. K9 F3 |# R$ {8 ^                          TransferData(*adder1,1);- a9 M* L5 r: ?, C
                           adder1++;
( v% F' I- X* C% q! D                }7 B9 S5 |' S% \) l

6 t4 m+ p- z" T' n+ u. p! E

' P3 p( E+ s" {" q+ [8 }' {        TransferData(0x90,0);  //Set Graphic Display RAM Address1 e, O8 l' _1 M& B4 C( ]2 B, q
        delay(100);
9 @: m$ C9 }' {: a9 {/ C# C        for(i=32;i<64;i++)
) ~9 e7 h7 _" r0 ?* E$ p8 k                {8 U" \$ P- S1 ?5 l+ z
                          TransferData(*adder1,1);
/ C) y. \- B! u% m+ [0 B& v# i" k6 q                           adder1++;! t$ w0 I) ~6 D
                }
+ {& m9 ?' c, H; |4 A3 c}! _. a  H3 {# n

0 v) c* X) M8 ?
4 l; W% }# v& o- E$ I* w# Z' q% C- N
/********************************************************************
# B' ~# F$ c4 i% ~4 B* 名称 : Main()
5 J: Z/ X4 z: F! O& W* 功能 : 主函数8 u+ ]3 j: s: I' p9 ~
* 输入 : 无3 A2 [3 i& J" Z( T. T
* 输出 : 无, {1 z) F4 Q8 `) B. T
***********************************************************************/
  K- I! Y6 N( T. v) \/ uvoid    TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.. H9 G7 U. ?6 G
          {
( z8 O% _( t' o( H  D% F* p9 v            WRD=0;$ I( D+ ?2 \7 F3 ~" Z
            RS=DI;
) w2 ~9 E% H! _' L7 D2 w            delay(1);
- _5 Z( A% N; m$ o* ~            P2=Convert(data1);! M& Q9 x/ E- w7 h$ H) H
            E=1;
9 f% c3 F- C9 S8 _! A9 r4 ~            delay(1);
% Z: c+ J; z1 A6 ~/ J: ~, y            E=0;
7 }' ?/ q+ B1 n: v+ X' C           }  q0 A; {( N3 B3 c8 D
( C9 e. ]* R' b& [  O2 M
% B+ F# X1 Q# s6 _
/********************************************************************
) _! z9 o0 o2 f) q1 ]8 d* 名称 : Main()
& M5 i; E& \% }# h, o! m* 功能 : 主函数
" _7 |. V9 \! M# c* 输入 : 无. W- {7 n: g/ X7 T7 `$ ?+ |( }
* 输出 : 无
8 }$ m9 x9 A  `***********************************************************************/3 M) P0 C+ m: b: {2 O& [" w
void    delayms(unsigned int n)            //延时10×n毫秒程序
( `# `& B! G1 H+ }                   {
8 b+ {: {  x4 |7 [, H9 n. s                      unsigned int i,j;) z  M8 c! Z9 y# Y6 A; u
                      for(i=0;i<n;i++)* }+ L) k7 D! f
                         for(j=0;j<2000;j++);* p( L' }# ^9 n7 O1 R
                   }
/ D+ H& Q* @6 S. W1 {) e
1 o4 m$ n& W! i8 V
1 I7 D/ y0 C* V
/********************************************************************
/ \; O2 I5 ]' C; U* 名称 : Main()
0 i- r$ d5 g. D  K* 功能 : 主函数: [3 f  p) J& \0 y3 h
* 输入 : 无/ n+ l& k: a; ?
* 输出 : 无% G% ^9 l- A/ l
***********************************************************************/: Z, }+ j/ J  |# V: d! |4 V" b
void    delay(unsigned int m)            //延时程序
0 R1 @/ _$ Y# O) P+ H2 V5 @9 D                   {
2 ?) L* F: O4 |4 z: G# m% V                      unsigned int i,j;) N6 n; ~$ T" _/ u0 ?  L
                      for(i=0;i<m;i++)4 D( T; c7 n5 S  N/ ?5 V
                         for(j=0;j<10;j++);
  d9 D& N/ T9 y" S4 j7 f+ ^                   }
- t$ v# R* X& o; R) \7 R% v
2 V9 c% M" Z7 B4 V1 J4 b
' K5 m- e( @" `8 L6 c. l- s# W
/********************************************************************
9 B6 e4 X' ?, F* i* 名称 : Main()
+ J  Y; e& k) E$ g5 {* 功能 : 主函数, M% R) g/ H8 r0 L2 Z. }5 |
* 输入 : 无
' u1 J  g, Q" O: p. x$ P6 ~* 输出 : 无
) x- B1 S/ [) q6 _, r0 f***********************************************************************/! Y/ O4 H1 A7 Z+ Q" E8 }" P3 ]
void DisplayGraphic(unsigned char code *adder)
# H6 z! }( v* x1 Y4 r# s7 E& }% S{
* b! A  H- L# P! @* e0 G( E8 Y; t

2 e3 x9 m! i' O5 v$ n4 k   int i,j;% O0 l% M4 [: t. X# l* G
//*******显示上半屏内容设置' m# X& h% t4 j0 w0 m
   for(i=0;i<32;i++)              //& \- X' Z8 {* U: L6 o2 B# K, ?! H
    { ! x8 Z  C9 M9 i7 _1 P
      TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD$ t; G' j& U2 P; j8 v2 `0 _: B' |
      TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD# }/ X( f" ]7 O. }- P* v8 n& C
      for(j=0;j<16;j++)
  c1 O# r# V4 ~  _: T; y, c8 R       {% D( e0 E: I- W  y6 J
         TransferData(*adder,1);
0 O* |! x' Y! Q0 Z         adder++;) {9 Y- z( {( ^" r/ K) z: i
       }
8 a5 [+ |2 t- {8 J+ P% V3 I    }           : F. H& W' O3 N3 i
//*******显示下半屏内容设置
- }, v/ [- |" b: `1 H   for(i=0;i<32;i++)              //
" ~. b0 e: R2 V% b7 Q, v9 b    {
- H4 E2 n" i" X9 Q# I4 x* e( W      TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD% ^/ ?* k1 R% x$ q9 ^. I
      TransferData(0x88,0);       //SET 水平地址 HORIZONTAL ADD
1 ]% j( p! N. p  |* V1 k) @; @" s      for(j=0;j<16;j++)
$ u7 P) S) P4 @$ ^       {5 M: O" g3 L' g0 }. }& y2 J1 m
         TransferData(*adder,1);6 ^) \  d9 |( `
         
8 @& j5 b6 U5 h2 t
8 I. t+ w$ P2 B5 [; b- L

4 K& A( z! m& T+ G8 f8 R. X…………余下代码请下载附件…………' U; p9 H' ]0 Z

+ k6 Y' L$ n. q$ c' \
7 y& a, w3 o5 F  F6 s9 q3 {
下载:
: Q# m! j6 T3 p$ O: M
游客,如果您要查看本帖隐藏内容请回复

# ^# ~8 F7 Y1 R% F: _9 o4 e
+ J$ ^$ b4 J" _/ z1 w

该用户从未签到

3#
发表于 2019-3-11 22:13 | 只看该作者
刚好有用,谢谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-19 23:39 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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