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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的ST7920芯片lcd12864液晶显示程序
3 a5 }6 r% t" e4 M5 ^5 w1 Q( z  Y2 H

* }2 t) R9 r. [4 t# c: ~& i有助新人学习12864液晶的资料
/ L- M! {: I. n$ ?; E& E- E3 @# ]( j- R) }) }( {9 O
ST7920驱动程序:

1 M. `, k" G  F9 y/*********************************************************************************
7 [& _0 x; }3 Y0 [5 S* 【编写时间】: 2017年3月19日
) P* [# q) |2 P9 c. b* 【作    者】: 清翔电子:03$ N  r5 g" l; f5 V" T: }3 N& G
* 【版    本】: 1.0
  c% C* |: p: M8 i$ y1 m6 ?( E9 T* 【实验平台】: QX-MCS51 单片机开发板
# J1 D# @0 i/ k( }  O* 【外部晶振】: 11.0592mhz        
+ e" @) r6 ~# Z, D' r* 【主控芯片】: STC89C52RC
! i5 J. E, N( u9 q" P" ]! g* 【编译环境】: Keil μVisio4        
' ~6 {+ k! f; @% d- T/ l6 T* 【程序功能】: 12864液晶显示测试                                                                                          
. @5 B1 @3 m* Y* 【使用说明】: 使用液晶前拔下数码管J6跳帽$ h7 }9 v0 h" i0 \' s+ U. J
12864屏幕向板子外插,插在L1排母上3 B& O. z3 u! b% a" E
**********************************************************************************/
5 X6 K- [5 V0 n8 d. h. C5 x0 t# }, C) Y( W( d2 e/ M
6 A# `. ~: r" P9 C
#include <reg52.h>
3 {+ B( A9 |- h1 ?9 @/ y, A9 S#include <string.h>5 P- r  j1 j% e5 T8 I7 V- j4 g

& j) d; v+ d  t& M5 c9 o$ p
& v; r7 W# [. v
#define uchar unsigned char, @$ P) ]  H; m) E6 p  p
#define uint  unsigned int( e5 p  ^. z5 o: h

7 `8 Y0 N) f9 }! ?, |

; n4 B4 M, r3 R) k( {3 b5 Iuchar code IC_DAT[];
5 |0 {* t0 a$ N  ?  ]; r" K5 Guchar code pic1[];
7 G, E1 ~+ B5 A9 tuchar code pic2[];
( b1 D1 y) f( D% O  y5 a0 }uchar code pic3[]; # l/ a: ?, Z6 I% v! Y
! S2 l" h1 Z7 {' s% K, j9 ^

$ Z+ l- D* w( [9 S4 Q1 P/ D0 Nsbit RS  = P0^7;! a$ s3 N$ h  L2 u
sbit WRD = P0^6;
$ U% ]1 X, e: k- T$ ^sbit E   = P0^5;
+ M; `& ?: {$ Asbit PSB = P0^4;7 v: l5 s# ~) |/ K$ G
sbit RES = P0^3;$ n/ U  ^0 ?# ?" z( W

" t3 Q/ X+ w) S3 M
* F4 R$ S+ }; p# H; |! X
void TransferData(char data1,bit DI);0 x& u2 J. C$ b) C
void display(void);. \3 G' x/ q; I4 Q5 `+ X9 f
void display_grapic(void);' [8 D/ L5 x! \7 I
void delayms(uint n);
2 o" q8 [% V  x3 u4 Jvoid DisplayLine(uchar line1,uchar line2);7 O) D+ U" K7 C$ Z  d
void DisplayGraphic(uchar code *adder);7 t* r5 o$ X9 z
void delay(uint m);5 c: E# r! c4 q9 z0 T4 D
void lcd_mesg(uchar code *adder1);1 z8 t. j- s2 y( p
8 F. B" C  e+ f9 @5 Z

5 j2 A: p0 _7 ^/ u' tuchar code IC_DAT[]={) b, j- t" O8 p" Y1 V3 r
"    智能小车    "  
* b7 i$ j+ J0 Y: L: V"    俱乐部      "% O& X% {4 r7 N& p4 G
"    QQ 群号:     "
" ^; s8 {; A, L0 I$ F' ?"   12933307    "
1 E, O5 }) r3 y( ?; P; r};
8 L+ h- F) J9 G1 P" ~- G3 D9 q% D3 n
# |) h- x$ y. i1 h( _8 x
uchar code IC_DAT2[]={1 C- q# @$ u8 z) E/ o& E
"  床前明月光,  "                        //0x803 O* ?. F( V- @- r, R; h' S3 @1 h
"  疑是地上霜,  "                        //0x900 N. Y: ^/ c5 z* x- ]" H
"  举头望明月。  "                        //0x88/ W+ m4 ~8 W2 {' L& p9 V9 L
"  低头思故乡。  "                        //0x98. |6 ]- K1 H5 o
};. Z6 _& B' |* q
& C, Q$ N1 t4 g. U& d$ n
8 ]5 {% @3 n3 f! u! C% ^$ ^: v
/********************************************************************6 {, h1 W0 A6 W6 l% ]
* 名称 : Convert(uchar In_Date)9 r' ]2 ?& l5 \* Y( [
* 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
9 o/ @8 J0 B/ G: h% |: `3 ~, F* 输入 : 1602资料上的值' K) u! y, X1 c6 ]9 G! e5 E. U$ i
* 输出 : 送到1602的值
- U& A) n  u- [# Z  S, _2 T$ c***********************************************************************/
" b+ G' |1 h! O; ], K2 Funsigned char Convert(unsigned char In_Date)0 Y# f: p; K$ H2 i/ X0 m
{* i& j% A0 E$ W2 I! x: R
    unsigned char i, Out_Date = 0, temp = 0;
) o2 k7 }( k  i2 k: K" {, C    for(i=0; i<8; i++)
  Y6 d! E# D2 z- s  w    {+ r3 w% C! k8 P9 }! ^/ l
        //temp = (In_Date >> i) & 0x01;
) y0 b$ L( C" ~) J  p        //Out_Date |= (temp << (7 - i));
9 t7 b. [( Q- O% V8 E! t% M% V                Out_Date=  In_Date;
* G. K9 J, }$ I4 A* j, f# s1 h3 \% n6 O+ |
  G  J. f0 E# ?7 r3 M9 l! w: s$ K5 H
    }5 Z" ], n& |  L- o7 |' B
    return Out_Date;
6 ?# R1 b' U, ]- P8 s2 S}, K  H/ t3 E1 K0 t3 j' [  b5 T

: N5 U0 `$ m, k: D$ b' h

. X0 O( v4 ]# pvoid initinal(void)           //LCD字库初始化程序4 }/ c+ z) H" r
{) \# l3 `$ C6 I9 l, C
           delay(40);             //大于40MS的延时程序
$ f6 w4 e0 @* C' V& `" p7 t5 I           PSB=1;                 //设置为8BIT并口工作模式- D" I8 T. g+ M4 D; ~
           delay(1);              //延时* r/ ^9 t! c7 g. C% {1 o  q, Y( y
           RES=0;                 //复位( i$ ^8 |4 M5 W
           delay(1);              //延时% U+ ?6 L& f/ P+ T! G$ p$ c
           RES=1;                 //复位置高0 i6 W8 E4 ?1 T5 q! S! \+ {* U' F
           delay(10);  N+ e" O  @2 J% n6 O
           TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
( q* z0 U2 q2 C4 i: ~& G           delay(100);            //大于100uS的延时程序4 {) {2 c! `; U% H6 Q' S3 E
           TransferData(0x30,0);  //Function Set
8 W4 Z1 L4 W# i           delay(37);             ////大于37uS的延时程序+ O% w- z0 P! S4 F# _2 }
           TransferData(0x08,0);  //Display on Control
7 v$ N. W" l& q1 H& i           delay(100);            //大于100uS的延时程序7 V0 q/ b, H3 v7 ~& T# F' d
           TransferData(0x10,0);  //Cursor Display Control光标设置' ~( N% t% m! l# ^1 N' k  J
           delay(100);            //大于100uS的延时程序/ S: e3 [( w3 w% o
           TransferData(0x0C,0);  //Display Control,D=1,显示开
0 U6 q3 w. o% F           delay(100);            //大于100uS的延时程序
& a- C5 }& ]) y2 B1 y0 g+ F           TransferData(0x01,0);  //Display Clear6 o0 n& ~# ^% ~7 I
           delay(10);             //大于10mS的延时程序
( k; U& M2 E; x- }7 k           TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动: d; s. H! E) c  N
           delay(100);            //大于100uS的延时程序0 y8 O' ~: E0 [
          }
- f3 j& U' l, M
6 O& x9 \& ?1 V2 j

4 y$ F3 c6 R% j. D) b! t/********************************************************************+ T0 m  v4 `# ^1 r) R# p
* 名称 : Main()1 W: F- @& E* g" ]  l
* 功能 : 主函数
1 U  U0 ]- T& q* c% \* 输入 : 无
9 k& Q+ Q! @8 L% n7 S: j- C- f4 d* 输出 : 无
: X0 {- J. M7 o7 K$ M2 M***********************************************************************/- B  a6 N2 G( E" }4 B; h3 ^9 v
void     initina2(void)           //LCD显示图片(扩展)初始化程序5 v* p8 K4 q, O9 A, J/ m2 u
          {0 R9 H0 a$ P6 W5 J
           delay(40);             //大于40MS的延时程序
6 w% B5 j+ p" Y, n6 p           PSB=1;                 //设置为8BIT并口工作模式
9 Q% v: X+ |* g* [2 k& f           delay(1);              //延时- x' x  o' _/ v: @' _! y2 ]
           RES=0;                 //复位3 J/ L, s, I  Y# r- r6 G
           delay(1);              //延时
5 `+ Y  N7 J+ h/ |           RES=1;                 //复位置高3 }1 u% g" f1 X! O. b
           delay(10);
$ ^2 S$ \2 W+ O* V, j
5 Q' J5 X. e7 o' [
1 C$ p2 p( Q3 q3 `/ `- k  U
           TransferData(0x36,0);  //Extended Function Set RE=1: extended instruction) \3 {6 ]6 U5 s7 g: o
           delay(100);            //大于100uS的延时程序& a! a, h& u1 Y" W  _, u8 B' i4 p
           TransferData(0x36,0);  //Extended Function Set:RE=1: extended instruction set" `# t# @2 j& ~: U! ]3 x
           delay(37);             ////大于37uS的延时程序6 ]4 r! ]; K8 Z' [
           TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)
* y1 c+ n* s; O  r7 f           delay(100);            //大于100uS的延时程序; m+ Z+ T% ^$ m& z9 X  ]0 W& p! D
           TransferData(0x01,0);  //CLEAR SCREEN: V  f6 g$ v2 ]5 D+ X
           delay(100);            //大于100uS的延时程序3 {% W& z- ?6 M# h( G. {" u
          }4 U9 }) K( R1 ^' v/ T4 _, Q* l3 N
5 `+ p, R  L) I6 v

) x' Q3 y8 H! g* n: {/********************************************************************
6 M* M4 L5 H5 P+ r) _4 \* 名称 : Main()
* j$ S. Y& t& b1 r9 N* 功能 : 主函数2 }  E+ O! ~% [' e
* 输入 : 无
& x  G, X: I& V" n3 b. W4 u- D+ \* 输出 : 无3 E3 _3 Y" S2 R7 n) Z" Z$ g8 B
***********************************************************************/
2 P. q( X4 X2 D  l) ^" K( Ivoid    main(void)7 S1 B7 q4 p' O  G% b7 o8 R
     {6 D, b# h9 B/ E1 q
         while(1): A4 D9 F1 O' w3 p( G* h3 @
            {# d; E# D: o4 p3 n5 s& k* h$ ]( O
                  initina2();            //调用LCD显示图片(扩展)初始化程序* l. W6 o8 q" T
  ) Q+ o& F" q" j1 r. `5 S1 H
          DisplayGraphic(pic2);  //显示图片2, t3 W9 q" x* ~
          delayms(200);                          1 m# Q1 K4 h3 `7 T" b

: j# u" ~3 h. L( L
% a" k9 q! ?5 c2 R4 |# _
          initinal();                    //调用LCD字库初始化程序
& D; ?% m, S+ \+ y          delay(100);            //大于100uS的延时程序
2 w3 W/ z5 z* F* ?0 F7 j          lcd_mesg(IC_DAT);      //显示中文汉字1/ K0 W# e- E, f" @" L( X
          delayms(240);3 c  N8 L, k& b6 l0 k9 ^* p
          delayms(240);3 A/ P6 ~% Z9 I* {8 ^% n2 v: O
           
0 c* ^2 E% q  t& g0 _  [  m          initinal();                    //调用LCD字库初始化程序3 _. A$ x- r) K1 b) m$ K% o4 I
          delay(100);            //大于100uS的延时程序
1 U% k' `7 r+ X. p, ?/ f$ u" t* [          lcd_mesg(IC_DAT2);     //显示中文汉字2
6 V% v. X3 b: f3 d0 v          delayms(240);: G. z- i8 t  K5 z! C: d1 g& C
                  delayms(240);7 k' h+ P: S. n& s) Y) L
                  initinal();  ; B& o9 O: d5 a: t  ?
        }. b$ `$ i* O1 r
      }, @; W  C; ?3 e. }
6 J3 N& j% @4 f5 A. x

  e, v! z* k8 d; i- w/********************************************************************9 `' v  {3 H' \4 ~" w! W! _
* 名称 : Main()
; j; }" k3 T3 n- H$ x9 v* 功能 : 主函数
7 X* S5 S4 a1 @4 l* 输入 : 无8 j- ^3 e$ n- i/ a, H9 W! H
* 输出 : 无! J; ]( Q: t0 a4 w) l9 s
***********************************************************************/( b8 @6 Y) j- X. E2 X" j: `5 w
void   lcd_mesg(unsigned char code *adder1); C' p! S$ m" s: z; K, j5 G" \2 t6 T! p2 `
{9 R6 U5 E2 M2 C( W) l% M9 h2 @* V/ l# u
        unsigned char i;. m% Q3 Y% |9 D0 d
        TransferData(0x80,0);  //Set Graphic Display RAM Address
0 _3 H' l" Q- ]4 G4 R4 W: B        delay(100);& p, `- \1 m9 U9 v8 D+ ^
        for(i=0;i<32;i++)
( E& J( q3 g( K' [: \                {
! @0 G* i4 Q( j* U$ M                          TransferData(*adder1,1);- H- Z, f3 n6 u: [
                           adder1++;
( f% `3 V3 h! R1 i3 q                }) S9 Q+ a% T2 m
+ U0 H2 g% b5 f& i' m% z
* @; x' r9 E4 m4 Y( j4 x* }2 J
        TransferData(0x90,0);  //Set Graphic Display RAM Address( J7 P9 F/ [4 e) J! P: _; D
        delay(100);
! j! |2 i( i/ n! ~; h( r# m7 l        for(i=32;i<64;i++)
6 S5 G  W8 q( ~) }                {
4 s+ }1 Y% a% \: Y# \                          TransferData(*adder1,1);! u& }$ K& ^. \* m3 C" ?7 O; I3 n& j8 @
                           adder1++;
. \- B% v; [$ T                }
# V8 d  z/ m0 h  ]9 j% e8 `7 h}  x) A6 I; A  ^* r9 L

0 K7 J7 `( Z) `* b. r3 H& D! U

- H+ g8 n7 S  p/********************************************************************
% C/ z5 E/ s0 h  Y' Q+ H* 名称 : Main()
! f! J4 `7 r/ o5 e: B: u" y: Z* 功能 : 主函数
7 z3 n* M1 \/ e0 l4 J* 输入 : 无
% v  l2 ~. z5 x/ D& c) ]* 输出 : 无
3 v3 H& c5 B; s1 k2 T$ e  x***********************************************************************/- q/ r1 J7 `8 p6 u" f
void    TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.; P; x4 @& j$ a. Q5 d/ z
          {
+ R5 G' P3 h7 {( F            WRD=0;
, o: @' P4 y/ Y4 P( B( b            RS=DI;' m+ @: K0 F5 R, \8 k% A
            delay(1);
1 M: |8 A! J4 M+ w  G7 o            P2=Convert(data1);
' c" Q% M- H( ~( X            E=1;9 O9 P8 x2 T9 o' H2 T
            delay(1);0 e6 p+ t+ s( P4 |
            E=0;( {, A5 _1 k" n6 O+ X: ]
           }% w* M2 ], w. S4 n) D% @& Z4 Y0 h& w* h

4 X3 x7 b2 G$ ~5 O6 q' D5 V4 A
6 g2 B0 X7 i5 O) \0 e  K
/********************************************************************2 t0 _. R" a& s( w) r1 m  v8 M7 b  H
* 名称 : Main()
) L6 v; }3 e' a* 功能 : 主函数( Z9 F& s9 j$ d0 e4 r+ q
* 输入 : 无4 y) a3 a3 [5 }2 @! o! \  r* b
* 输出 : 无* m& ~  n1 D' b3 G: k
***********************************************************************/  G& G/ o4 j$ d9 @
void    delayms(unsigned int n)            //延时10×n毫秒程序
# b9 O- u! g' C8 |, M6 I$ c, m                   {
& {( |+ U# w1 [                      unsigned int i,j;# k! L( h4 q; t
                      for(i=0;i<n;i++)6 C7 z1 a4 }9 D5 i" }& M
                         for(j=0;j<2000;j++);& L/ u; k3 o7 r8 E+ c- o
                   }1 e! [5 a+ q, o2 Y! r+ t+ w

, H1 Z' ~( ]$ r+ d

, r& A+ }; l5 I& |3 e  K/********************************************************************8 u  U' r. p8 B! Z% k: f# S
* 名称 : Main()' d6 e0 ^- ?# e
* 功能 : 主函数! M2 U) u7 ?3 P! i: \8 w6 {+ A
* 输入 : 无
3 {6 G! @' M6 A2 Q8 Z& v  s2 B* 输出 : 无: U4 A# i# ~$ y% P; e0 p8 T
***********************************************************************/
" S! Q! Z9 ?4 f0 e- X0 Ovoid    delay(unsigned int m)            //延时程序
4 Y& j5 M) C" j' L) R' G) M4 C                   {" V' k+ Q6 \( f7 O7 o. e
                      unsigned int i,j;
# f7 i- G- ~6 G                      for(i=0;i<m;i++)" c4 e& }# \! U9 o( s
                         for(j=0;j<10;j++);8 i  g5 M: A8 ~0 O
                   }
' w" R+ M2 h" H- O( \  {5 W1 q4 w
8 ~& k% g7 m5 _" R# e% B

! [+ R; T( M" N+ P  c3 M' n/********************************************************************( o4 U/ d% Q& o6 Y% b1 L
* 名称 : Main()4 Z" C- c. \! F% H
* 功能 : 主函数
7 i- Z' @. h+ p( O* 输入 : 无
9 i: ~2 G- P. M6 C9 @1 f6 Q8 D* 输出 : 无
( C- k3 O- i  O. l% N***********************************************************************/4 x3 O5 B9 d, P1 M
void DisplayGraphic(unsigned char code *adder)& T" U. c& E6 V; i  N. r
{3 t3 O* I( N* ]9 e7 \
3 v4 Z" B& {$ f/ @- {5 M) c

  J* j% V9 X$ a( S6 Z  _" S8 Y   int i,j;
- ?, |' G* r2 a//*******显示上半屏内容设置
! B+ r4 a' `1 }2 `1 P   for(i=0;i<32;i++)              //2 a8 i6 [* z5 n% u) W# V" N
    {
" P$ X8 D) R" l& l8 K; A4 f  m( ]      TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD8 Q$ _1 }+ Z9 ]9 L5 C; X' ~+ e$ i
      TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD! G. ~  P; z: x* E1 u
      for(j=0;j<16;j++)
& L9 |2 T! a# w+ e* p+ w/ v0 h7 R       {
( U3 ^8 \7 m6 X) Q9 q& z2 d( i         TransferData(*adder,1);
7 L8 Q% {! c: d& u; M4 R         adder++;- i3 u0 B: D! B: j! |5 i
       }/ I6 n- N  s- G8 [+ E" s/ V6 Q! U
    }           7 s9 T, s3 ]+ F9 [2 V
//*******显示下半屏内容设置
9 T0 @* |1 D5 a2 N   for(i=0;i<32;i++)              //
4 @+ K: v) j3 P/ `    {
- c6 }! F* T, F9 Q      TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD2 z+ G+ b$ f/ `: m- l
      TransferData(0x88,0);       //SET 水平地址 HORIZONTAL ADD2 f# a" F) k# Y& [7 p# v
      for(j=0;j<16;j++)$ U* I8 \2 x6 u3 W
       {
, Y3 ^0 o! G/ q) ^' s0 l8 ~! s         TransferData(*adder,1);( u3 B7 v) }5 f0 ~3 ]. {
         - A  J7 w) J! {6 Y
/ L  e0 u8 w6 {- w( ]0 R

2 o. Y3 f* O# h, R0 L) O; C1 x…………余下代码请下载附件…………$ i& Z, @! l( @* [) H8 _

) a7 i; k" \/ B
: z2 a; w( w9 c, N1 Y" P/ ^
下载:: A# W( U( Q0 g7 Y' ~; B
游客,如果您要查看本帖隐藏内容请回复
4 [/ t5 u. M" v
* q& F& [/ e! `; d9 F

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-21 05:27 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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