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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的ST7920芯片lcd12864液晶显示程序1 ?+ V; l9 ~6 g5 |8 H
- t" \6 K" p% O8 L% q" l) T

1 h* B' K' k  z; ^. V有助新人学习12864液晶的资料
3 ^0 \8 I/ z9 @$ [, e8 n, N
, G- j" O- |, n2 \6 m5 e4 gST7920驱动程序:
+ V/ Z" U3 t2 l" |1 H
/*********************************************************************************
: B( |/ h, E: p! V/ S1 W4 r* 【编写时间】: 2017年3月19日
! d0 i* ~7 |/ i* ?1 V* 【作    者】: 清翔电子:03
/ Z% R% Y$ B2 F4 z+ l* 【版    本】: 1.0- p! F4 M. z) q( s, \1 M1 d
* 【实验平台】: QX-MCS51 单片机开发板) u0 k5 ~( |8 |7 S2 T
* 【外部晶振】: 11.0592mhz        
' a# D( K0 o; w" ~) j$ ^) \* 【主控芯片】: STC89C52RC
# u" L# I- T5 v* 【编译环境】: Keil μVisio4        . T/ q. @3 Q. S" y, v
* 【程序功能】: 12864液晶显示测试                                                                                          
; Y) v: Q, c3 x* 【使用说明】: 使用液晶前拔下数码管J6跳帽
- m# H& ?8 n5 G3 K  k. E( H: B12864屏幕向板子外插,插在L1排母上6 b5 |) M1 G: Q" L  Y, M2 m
**********************************************************************************/
6 E4 @& k! U/ |$ g* e4 T2 q5 K8 I( v. B/ m( M3 Z" ]$ \

  `9 D$ k2 u2 O& ^#include <reg52.h>
; E/ B9 o: c7 x/ ?7 [: X% ?#include <string.h>
9 ]! e1 ^! V7 G. p+ M- B
4 d! _/ v! S6 C6 i6 Z8 Z2 l( D

: X4 m+ y  r" h4 {& J7 q3 X#define uchar unsigned char
, x- P  u' y3 S0 r6 \' n#define uint  unsigned int5 x1 Q; q  H' C

" C' Z5 `+ J4 F) W: h

! y' n/ J  ~; F* l- \4 ^) puchar code IC_DAT[];5 D, p" K5 @% X) {
uchar code pic1[];9 k' g2 w5 V+ I5 C1 U# ]; l  h6 Y
uchar code pic2[];2 U) K% e* h: g# l  i! x8 }3 e; \
uchar code pic3[];
/ i* U5 ]1 S) Q* C) P9 m4 w; x% n  l5 |/ h2 j$ d- W

1 t) B- b1 |' t: ~sbit RS  = P0^7;
* g" @$ K5 }9 X0 Z  psbit WRD = P0^6;, B1 }8 L8 N$ y9 F
sbit E   = P0^5;
& Z: R& S3 C( w& J, V4 osbit PSB = P0^4;
0 a2 N* n0 a/ s8 L& Z2 J+ rsbit RES = P0^3;
5 G" S$ ^/ W: h: o5 Y6 {
. {9 K" ?' k1 A. P( f
! h! I0 G% o/ n& W# P! O- Z
void TransferData(char data1,bit DI);+ _% H1 X( c  w( m
void display(void);
" m  ^% I# k9 W9 o2 ?0 P" Ivoid display_grapic(void);$ W( n: J% `( D
void delayms(uint n);" K: a9 G" a" j5 k% B) E& k
void DisplayLine(uchar line1,uchar line2);0 }& p; D# S" Z1 G# F* _9 O& r
void DisplayGraphic(uchar code *adder);
) F4 {% e1 k" f9 bvoid delay(uint m);
- f2 e3 ~' d4 t% X8 S0 vvoid lcd_mesg(uchar code *adder1);
# ^9 D9 T* H" `0 X6 a( g
9 \* O# |" A; `5 W( [) _# a- ?
  a5 W3 z5 f8 F( j# W/ l
uchar code IC_DAT[]={9 S& |) s' F) G1 E# `0 i
"    智能小车    "  
: H2 c9 }, M% V9 {! E"    俱乐部      "
& \3 k) c9 e' I. y6 `"    QQ 群号:     "* k# X3 C1 v; [- @6 W8 ]
"   12933307    "/ Z: l! S7 e1 {& J0 d9 y
};4 y  l2 _& v; a1 r3 V

; Q9 }# o. p; p4 v" I- j( d* g

. ]( @# u+ D+ o0 E. M2 X: Yuchar code IC_DAT2[]={
6 J2 W/ S, m' G; f7 ^( B  q8 a$ c' z"  床前明月光,  "                        //0x80
$ X7 ^! I4 U* l" P- |& O8 Z% T"  疑是地上霜,  "                        //0x90% J3 [) @( c+ @, Z$ K" M+ y+ m1 p& v
"  举头望明月。  "                        //0x88" W1 ~" \# U5 n# e0 @  I- C' l
"  低头思故乡。  "                        //0x98
8 B; |" h& O$ _6 m};
! e8 t3 G# u# O7 d. ]* d7 }) Z$ R1 E9 I- V; S* X

! e. I6 K7 s5 N" S6 p8 A/********************************************************************
2 K+ P# {$ c/ c- B% R" b' Z* 名称 : Convert(uchar In_Date)$ L; ]  |% r7 j
* 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。2 F0 N; O# j% {$ j5 w6 Q
* 输入 : 1602资料上的值
3 k& X7 L( A3 x. Y( J+ B* 输出 : 送到1602的值
% Y1 E% F# W1 t5 R***********************************************************************/
) c3 v/ p5 x! X) S& G1 Dunsigned char Convert(unsigned char In_Date): x* ]( U! r* n# {! D
{5 Z7 K2 i% v6 G8 G
    unsigned char i, Out_Date = 0, temp = 0;: s+ o1 X# |2 \) l/ U4 H2 ~: Y  m
    for(i=0; i<8; i++)
4 M6 o. s4 [9 d5 S+ P) \# W. X  K    {$ e$ I/ A, _% F- x, ^$ F
        //temp = (In_Date >> i) & 0x01;( f, k0 h6 b1 m0 b5 U- ^- \
        //Out_Date |= (temp << (7 - i));# f3 A) |3 Y6 w
                Out_Date=  In_Date;) m+ o1 a, m. w3 a) H& I( k

9 E# a1 Q) V. A2 `0 y$ r

' i9 C0 D/ M$ z. {& y: H& e    }& \; L% J  D+ S
    return Out_Date;  U' c# z5 e- \$ A& a& l
}1 d: N: t! q1 L! }

. l# I) j. X. \' r5 W7 Z
! Y/ Z# V4 O& E6 O6 b: {
void initinal(void)           //LCD字库初始化程序
! [$ D# `6 x$ t9 m* P9 Q7 _4 D  V{0 _" p8 r, _2 t$ n
           delay(40);             //大于40MS的延时程序
0 \; _" z' Y4 X7 S2 a           PSB=1;                 //设置为8BIT并口工作模式
, G5 C- @6 S& Q. x           delay(1);              //延时
" I4 {$ Y5 A3 N6 j           RES=0;                 //复位
; \4 n; n9 a! |2 |, P           delay(1);              //延时
  ]4 z& S5 g' ^' S) l) _4 d           RES=1;                 //复位置高1 G+ J/ c' F; n7 P
           delay(10);
, g3 y$ @9 W( x' f           TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF  p; S8 M6 c0 J8 b. |/ _# ]
           delay(100);            //大于100uS的延时程序3 n3 v2 j+ W- H8 G+ Z* n* [
           TransferData(0x30,0);  //Function Set- l$ g/ g/ z& ^, F* n5 K
           delay(37);             ////大于37uS的延时程序
* E" t* N: I1 @           TransferData(0x08,0);  //Display on Control- ]. F- y) s5 g; u9 }- x- e+ _
           delay(100);            //大于100uS的延时程序% X" ?5 _7 N, L, P; O: ^9 v6 Y
           TransferData(0x10,0);  //Cursor Display Control光标设置* y5 {6 F& L; b0 d' o6 C: X
           delay(100);            //大于100uS的延时程序  b- L+ @" E( a1 a7 w0 R+ S* |" F
           TransferData(0x0C,0);  //Display Control,D=1,显示开
; o  a1 `: Q: ^+ M% I$ v# s           delay(100);            //大于100uS的延时程序& z' n5 a: n7 y1 D1 p( H( _
           TransferData(0x01,0);  //Display Clear
8 }0 D3 O+ V; j0 X& b: `           delay(10);             //大于10mS的延时程序* H9 S0 a$ M" _3 j, z) c6 U
           TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动5 I: E, N! e! G5 _- I" I
           delay(100);            //大于100uS的延时程序
$ A4 {& x" L# |. f          }
% n" ?) P3 ?; h' S6 V3 I1 Y: D& a
, O5 }$ Y; M5 M$ x* X

1 a( s; n5 f/ T/********************************************************************
4 x" q. y: u! G, Z! i' j+ X* 名称 : Main()
! `, b8 |' n3 o" \* 功能 : 主函数
. I3 ]- H3 Z6 W  Y" G( x* 输入 : 无6 ~* c0 \6 x5 G
* 输出 : 无
8 @& n# C( [& {" u. {% P***********************************************************************/0 e% b5 h' Z8 a
void     initina2(void)           //LCD显示图片(扩展)初始化程序
- _0 Y7 u5 q4 _) s! `* U! y          {
* q( ~, Z! |; @' ^, l           delay(40);             //大于40MS的延时程序- X- S  ^7 o, P; ~4 g- ]
           PSB=1;                 //设置为8BIT并口工作模式
* l6 z! @4 u& o$ a9 e$ g9 u           delay(1);              //延时" W- I) T2 e; W- o1 p  _9 D: n0 ^. D! b
           RES=0;                 //复位2 Y2 i" d2 A6 B( N. t
           delay(1);              //延时- E, H  E( T* b  j' h; @
           RES=1;                 //复位置高! T1 k* D/ q, l- n, F& K, E
           delay(10);
+ K; p( S$ ?3 a' x3 r" J  v4 F, |- G8 O9 X% ?, S$ m$ ]
( P4 r- x" J* e- [
           TransferData(0x36,0);  //Extended Function Set RE=1: extended instruction6 r0 Z4 `' M0 A$ z% A
           delay(100);            //大于100uS的延时程序# I* `8 _. ^5 ]8 _
           TransferData(0x36,0);  //Extended Function Set:RE=1: extended instruction set
: k4 v  g1 T' @5 w! P0 _8 d           delay(37);             ////大于37uS的延时程序
9 f6 _7 |4 E4 o% y4 L0 A3 l           TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)
7 H% d$ ?0 h1 \, L- i           delay(100);            //大于100uS的延时程序0 t: x+ m2 D  L# g5 V1 q# f
           TransferData(0x01,0);  //CLEAR SCREEN
( }6 ?& S  S/ p1 h. C           delay(100);            //大于100uS的延时程序
, x: L% }+ N# p; E; R          }- l+ V- g; r; Y

" P2 X! o. H$ Y' o) L! ?' j
2 c. h: |$ K  w: a3 q8 m
/********************************************************************
0 \- U, h2 {$ F- g# w2 Y* 名称 : Main()
6 `) w* \: c  W( I6 f* 功能 : 主函数9 A# Z# y4 D% \9 O
* 输入 : 无( t/ D5 T, f7 J3 D$ C* a% u" d6 g1 |
* 输出 : 无
0 q# I! \2 c, ]3 y* k2 V8 O***********************************************************************/# i3 y' u6 u; M  I2 n. U# M+ C: V
void    main(void)1 Q& }/ R$ q5 y$ b, Y: s
     {! L' H) c3 G/ e5 N8 _) h' J
         while(1)
2 k4 j! S2 n9 [) p. y  g$ K            {
3 O+ \1 R) Y9 N. l. S& _                  initina2();            //调用LCD显示图片(扩展)初始化程序
% k0 }; ]% m7 r& I' e! V  
' d; k8 d) J4 V/ E4 F' `, h          DisplayGraphic(pic2);  //显示图片2- p" V/ p! p8 o7 H) N9 o. a
          delayms(200);                          
) }  L# Q8 m1 Q5 g0 C. H" \  Y+ ^6 v4 @* i; [  S: b2 X4 R  c+ e
1 ^. h) D" ~( z' N% m
          initinal();                    //调用LCD字库初始化程序* P9 R; Z  K* n! ~3 A: v
          delay(100);            //大于100uS的延时程序
* z5 t6 e0 O/ U# V8 p          lcd_mesg(IC_DAT);      //显示中文汉字1; b: O9 L; U' F7 `
          delayms(240);
4 o3 a6 k1 |0 v" L          delayms(240);0 l! g! w& H5 `) j$ S* \7 X
           , n# \7 M1 i5 f9 I( t% ?  J- ~
          initinal();                    //调用LCD字库初始化程序
& x  {7 w$ ~  ^! z% V) b          delay(100);            //大于100uS的延时程序
6 Q- H' d0 ?' W/ `          lcd_mesg(IC_DAT2);     //显示中文汉字2
) O4 s7 U2 v5 |# H! f4 F$ {          delayms(240);1 [. S* f: Z( y  `- W
                  delayms(240);4 K  V8 F/ G" X5 Y1 N  ?% H- S
                  initinal();  
6 ]: ^/ O/ I6 B% b: x; q        }* w7 j+ T. F+ _7 c9 c+ Z! @
      }& [2 s3 h0 H* m7 O2 D* m7 i) {

+ p: s$ O2 G; _+ G0 y4 `6 Y' d7 m

# ]2 f/ f; `* I/********************************************************************
" E3 \# Q6 o4 U; b3 M* 名称 : Main()* J# u1 r* Q/ @, Q; @7 i' S' o% Z% j
* 功能 : 主函数+ }7 ]! L8 Y/ ^% ?2 ~; c6 U9 ~7 g, c
* 输入 : 无6 S8 P  s# P4 `) |
* 输出 : 无
9 r4 G! k7 v- _7 u3 P***********************************************************************/
4 U* U) `5 c. q% m2 s* A0 Zvoid   lcd_mesg(unsigned char code *adder1)
* R% U7 x/ D& e- Y  u{' L, E  N5 m2 A3 Y1 _* I
        unsigned char i;
" ?3 m$ ~/ v* v2 M  }1 A& E" X        TransferData(0x80,0);  //Set Graphic Display RAM Address' R% I+ D$ Q0 K6 J( N# R
        delay(100);  s* O& ^2 V, M, ~: [/ C; i: Q
        for(i=0;i<32;i++)
  q7 S: w+ P' s9 Z  h                {+ v6 B0 I; U2 z2 s' o4 p
                          TransferData(*adder1,1);
% \1 h! @) |5 W6 z5 L                           adder1++;
7 R# I$ {. A' q# u1 ]( ~                }# C0 Y: {5 ?0 o3 @

4 V2 {' T2 b/ }& t6 T8 Y+ `- P

5 m$ b2 n* z/ d5 R1 r: k        TransferData(0x90,0);  //Set Graphic Display RAM Address
: t( _! C& e+ {( ^6 O. w        delay(100);
& P! {: G$ c* T* L* b1 A7 ]% X1 F4 K        for(i=32;i<64;i++)! M5 P; t$ E+ v
                {
) W) l: O; I7 z" D; p                          TransferData(*adder1,1);
! N, x9 \( C$ ]; r: }; X                           adder1++;
5 [, d+ O6 q* @. ?3 I% H; Q                }
6 t0 L8 f7 t. K/ S/ t: {# ^2 X}# P! i& x2 ~' R" q7 j0 P7 M
% }" V( R! P0 k' C# n. k

# B! h  }0 ^/ C  K& g* a5 M/********************************************************************  i# [2 y' [: z4 g! n; H7 v& [
* 名称 : Main()
9 t3 {- s- B: z$ x) n* 功能 : 主函数( G! q( q3 r- f0 K- B/ H
* 输入 : 无
4 F  p$ m. h& {$ E" w* 输出 : 无0 t2 j2 y2 \' O' r, Q/ s
***********************************************************************/. r! L9 m8 E0 y! y. P+ C, L  V
void    TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.
* F0 R) u. L2 J+ t6 q! n          {3 d  y8 ^1 ?+ P
            WRD=0;# [' a. ~8 h( ~' \( p& ]9 J
            RS=DI;
2 m$ a+ `: [8 C6 ?9 ~5 s            delay(1);
  C; E7 p$ ]: Z  Y! t! U            P2=Convert(data1);
! C. ]1 v1 f* Q2 Q            E=1;
  y: f9 O1 |, X7 d6 ^            delay(1);
2 c! D: B, J4 z. K  x            E=0;
7 k  d, S: X  N" Z" a" B           }
9 P' ~( |: j8 t" O% B7 ~. M9 J5 P) M+ [. k/ _* N, M1 d
9 E3 j1 |0 j4 Z: k( L
/********************************************************************
- ~' {0 Q1 q; H- ?+ g- z; _) m* 名称 : Main()1 N2 ~* R& }5 W% c+ E4 ~
* 功能 : 主函数+ l1 ~) O* U3 r! R( r
* 输入 : 无* Y% I6 c: O  A2 D% M' q
* 输出 : 无1 ^* `6 I. ]* j" _3 @" J
***********************************************************************/
. H! h4 J9 f8 R8 d  a0 Z  B# Yvoid    delayms(unsigned int n)            //延时10×n毫秒程序
7 ?; Q' ^" e8 h$ S, B7 C) j. j                   {5 z* \+ v  y9 C  s0 j" F
                      unsigned int i,j;
5 I4 w" F+ l3 ^" K* ^                      for(i=0;i<n;i++)+ D. ?9 n! C* h3 T
                         for(j=0;j<2000;j++);
$ n8 X" k: J6 K4 r2 q. R                   }
+ s! _) Z7 ^( c0 {/ ]6 u' V9 a$ T( I
1 a; G: y; u% ?" \8 S, `% v" x2 y" b
/********************************************************************3 d2 u# E$ O0 E2 N
* 名称 : Main()
5 f  q6 A3 [8 T: }* 功能 : 主函数! m6 T2 }* v3 k, m. T4 ?& s
* 输入 : 无( c- w1 G9 {1 T2 B) U1 E, w& o9 l
* 输出 : 无
* m) l: P  K8 N7 |2 d***********************************************************************/
! ~1 K; v3 Y% r* o0 v' s. tvoid    delay(unsigned int m)            //延时程序  Q, I0 ~8 J% X$ n1 [
                   {5 T0 n) @$ |& u9 Y8 t+ k
                      unsigned int i,j;8 Y3 i" o5 u, H( A/ g9 B" G
                      for(i=0;i<m;i++)
& B' q7 p/ ^, z& s) J/ @+ V1 p                         for(j=0;j<10;j++);
1 M7 y- [7 I* v3 n* g  _! s$ g$ E                   }
1 S" V% A; H; C: D/ G6 ^
, n, m7 ?- m2 t
% h* N& _# M. E& M8 q9 m4 P
/********************************************************************1 l3 P; Q* p2 i$ Q$ }8 y# h' k
* 名称 : Main()
0 l# W* ]% Y2 O/ I8 [* 功能 : 主函数
+ @% E' Z! t/ }, p- c- p9 i( T$ I* 输入 : 无
: J4 B! g& D# {$ e' m* 输出 : 无4 Y6 |. X, Q( P
***********************************************************************/# |, _/ i! j0 t/ w+ t- c2 e' [
void DisplayGraphic(unsigned char code *adder)1 [8 Q. \# d! Y1 Y' h; \
{# i5 [' U1 o" z3 M

4 i% E% S5 V: a: {0 o
* P9 a3 l1 T  s! J5 _& h- M
   int i,j;6 J/ o. e7 i, G6 P
//*******显示上半屏内容设置2 c$ O, o7 ]: u: R- f
   for(i=0;i<32;i++)              //- Z+ f4 y$ t$ i7 D* S
    { 7 l4 {! F! I/ k. G
      TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD& \1 q3 {# |" E# U% Z
      TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD+ i" ]3 E/ _6 }& s( T* P
      for(j=0;j<16;j++): Z+ D7 ]9 G$ t6 [/ V1 O5 i: r9 J' ^
       {
# }- V$ b* R- A1 d0 }% q         TransferData(*adder,1);4 ^% i' L7 k- |. t6 T0 m# M
         adder++;1 O$ V) e6 o% C1 m/ o& r0 P
       }3 \4 Y* |7 p* S
    }           0 `) s! s8 Y( m8 N/ E% ]
//*******显示下半屏内容设置
2 ~6 @1 Z! J6 N7 O& i5 V, Z' U% Z   for(i=0;i<32;i++)              //- L2 I# \7 N& ?, }" ~' O' W- K- n
    {
1 Y8 E0 J# a8 g: z& i      TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD
% m- n7 _; S: r8 R3 j. @, J1 T& Z7 H      TransferData(0x88,0);       //SET 水平地址 HORIZONTAL ADD  V( M9 T; j$ q
      for(j=0;j<16;j++)
( _: P0 J$ J# A# N       {) c& D, o, H2 z6 O+ Y7 @6 L
         TransferData(*adder,1);. w5 h% P3 |# V6 w
         
4 n. _5 a4 \! f8 V& B* h' f- b+ z! U" _  J

1 [3 z5 W% z9 R3 ?…………余下代码请下载附件…………( D. l& Y$ N" G' I
7 S- O" s: A# n; _' C

! G& X; J/ ~$ J5 }下载:
! K! ]6 L3 r. E1 p: T& B) Q
游客,如果您要查看本帖隐藏内容请回复
' x+ g# E) j$ F) z9 Z- R

: X+ z" o+ p4 p5 E& i

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-20 17:42 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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