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

单片机用LCD1602循环右移显示welcome to china仿真源程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机用LCD1602循环右移显示welcome to china仿真源程序/ T, y( m* n$ P. h( R
单片机源程序:

  M2 r' `& x% k+ d! J: h3 [//用LCD循环右移显示"Welcome to China"/ |: h1 t5 O" I. y2 B
#include<reg51.h>    //包含单片机寄存器的头文件1 V9 Z* D6 R" A) S
#include<intrins.h>  //包含_nop_()函数定义的头文件
+ W( T* S8 G$ T/ o) Zsbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚
- {; \0 A( o6 M3 ]3 fsbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚- J0 E2 W3 c; O" r; m
sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚. X4 F' \6 }" l
sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚
4 N, o. j  g" _) L9 g; M  r1 ~unsigned char code string[ ]={"Welcome to China"};
' m# H# Y9 D8 _) b' q/ L/*****************************************************
' v+ P+ w  i. a: ~函数功能:延时1ms
; k  ~3 S7 m1 V2 _  W7 s3 y1 T: ^(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
: M! s) _8 {/ y***************************************************/
8 W" g  l) Q: a4 Svoid delay1ms()
9 u- c' R: O" v% _6 q{
, ^. E9 h6 T9 `0 Y/ ~# Z1 z8 q   unsigned char i,j;        - F* z% n& l, h
         for(i=0;i<10;i++)
9 W9 l5 y2 M) ~* w; J          for(j=0;j<33;j++)
! q( p, |( O0 \  M2 A% w           ;                 , b7 m; Q5 o% l& h1 s
}
9 m& X. k9 H: M1 M/ v- k6 L& X /*****************************************************
1 Q2 g' x+ _" F7 g/ C$ W函数功能:延时若干毫秒
: C# G2 v2 H5 ~4 P4 F+ P6 i入口参数:n
: i2 r- _$ D: j5 a# X9 t***************************************************/# S* o9 m6 C; F: b% w
void delay(unsigned char n)
" \' v( H; L( P8 m+ x {- }9 s. d7 o9 R& o
   unsigned char i;
1 g  r  X9 R5 ^* ^# M        for(i=0;i<n;i++)
$ C' [  d) v: N3 C3 [1 @$ t           delay1ms();( L% Y& e7 h( u* q# l  K! T. E
}; `2 u! ?8 g& Q- V6 c$ c  l
/*****************************************************
8 ]7 v5 Y8 ~; _+ R+ V函数功能:判断液晶模块的忙碌状态
) X: z- P& I" s  T) a返回值:result。result=1,忙碌;result=0,不忙' t& i4 H- _: Y2 N, \; [# `% l% e
***************************************************/
* T1 V9 c0 T. V7 b9 c unsigned char BusyTest(void)  U9 H7 W4 a& Z# e# p6 s! X
  {: {5 y3 C3 y1 f( y% E
    bit result;4 q' V, s+ N, `
        RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态. f5 J2 B+ Z- _4 Q" M# G* q
    RW=1;4 D: |/ b6 x. v# N
    E=1;        //E=1,才允许读写
9 X' r7 m( k" Y: z/ U    _nop_();   //空操作
$ U. ?( @- V4 O4 h8 g# F5 o    _nop_();/ a* f! j; C1 G+ @8 _& G  f
    _nop_(); 9 U; p6 {, Z8 X6 D- m
    _nop_();   //空操作四个机器周期,给硬件反应时间        
9 b8 T  p  D  F/ c8 w$ @; [% T    result=BF;  //将忙碌标志电平赋给result+ `( u; A+ F1 Z7 l4 s
        E=0;) u# f! ~- g& N9 `( C* C5 @
    return result;
1 B4 s$ Q6 j; [$ C1 ^  }
4 S( B/ D5 L) j; O( O/*****************************************************  n: F+ `1 h2 Y, i) m3 ]
函数功能:将模式设置指令或显示地址写入液晶模块8 @9 s4 p- l# n4 a
入口参数:dictate
6 q4 J$ v) s9 \+ c* i- @6 V***************************************************/
& c( O, C% |* [void WriteInstruction (unsigned char dictate)
: t( K7 s! \* O* b" d9 o1 ~{   1 H' U  S- v! ^; _
    while(BusyTest()==1); //如果忙就等待
# S6 P4 i& G5 |0 Z         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
; M+ @5 I. c  b  z* e, @6 i; G         RW=0;   
' o& y8 {) [. g1 ~         E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,: i% y. _" q  e3 S! J$ ]
                             // 就是让E从0到1发生正跳变,所以应先置"0"
- t9 |1 ?1 H. u' K1 w2 h( z  \" }         _nop_();& n" a$ S- O( a! h5 E  h; H4 r1 N
         _nop_();             //空操作两个机器周期,给硬件反应时间
9 {# s' U% N3 g/ n/ K! M         P0=dictate;            //将数据送入P0口,即写入指令或地址
3 [8 g1 v7 k( ~9 E; S& I         _nop_();
2 L) q' k) J. s1 x  Q2 X( ^  Z3 Z3 S! j% ]         _nop_();# b$ Z- A+ t; x
         _nop_();; I& s& l4 S; p1 r: n# a
         _nop_();               //空操作四个机器周期,给硬件反应时间
; ^4 P. Q; J# H         E=1;                   //E置高电平* w& x! D. x* \- p( ~# |# V
         _nop_();* L# h! t1 H) S, [- a1 I
         _nop_();! B! z. o" [" o( [' X4 D
         _nop_();
: A/ A  r, V7 O% H         _nop_();               //空操作四个机器周期,给硬件反应时间
/ k+ x0 Z4 m6 I1 M% j0 I. b3 Y          E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令0 [6 B4 o. E# M) {4 k& O0 R
}1 }" J' u1 S, d1 Z; v' O7 q: Z
/*****************************************************9 C8 V& M4 s1 Q3 \# Z6 d6 K$ T
函数功能:指定字符显示的实际地址
5 p+ {& B2 q) T( I! ]入口参数:x
$ Y9 z. c2 b( c) q***************************************************/
& @" s, j" \5 c void WriteAddress(unsigned char x)
" W. c- [) G+ j/ O( g4 B {
; j8 W. Z  ?+ I/ W9 @     WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"
, x5 [& C  Q) r+ v1 J/ G3 B$ Y }% Y: d, @1 A  G1 @/ X; D, h% c
/*****************************************************
* B- T6 {! d/ w! b3 c函数功能:将数据(字符的标准ASCII码)写入液晶模块% I* e% r* S3 L1 \4 o- _/ p
入口参数:y(为字符常量)
, P+ e* G8 S, ~2 j. x4 Q$ [***************************************************/
4 \( @- ?1 b9 j3 ?( R; U- O void WriteData(unsigned char y); E2 j4 X& g% i
{! Y9 W. m$ ^' u5 b2 a4 l! `0 N
    while(BusyTest()==1);  " V" I8 c/ x" @/ }1 p
          RS=1;           //RS为高电平,RW为低电平时,可以写入数据
& I1 x, O+ _3 ?7 ~, w          RW=0;
* e* b! Y0 t9 c          E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
2 t  E' O- u1 ]% t: ^                       // 就是让E从0到1发生正跳变,所以应先置"0"
5 y& v- W+ b3 j3 }          P0=y;           //将数据送入P0口,即将数据写入液晶模块
( C6 e1 j+ p4 G" R- Q; g          _nop_();' j9 \) `7 Z9 m% b' E, G
          _nop_();
& u, d3 v- Y- d7 d           _nop_();6 w$ d. E/ ^; S2 W3 n
     _nop_();       //空操作四个机器周期,给硬件反应时间& V) C! s1 a. s) d( ], ~0 m/ r
          E=1;          //E置高电平
+ K! D8 W) ~  w6 k          _nop_();
+ e/ p/ O: A% F3 D  G          _nop_();
$ i9 L* L7 a' ]+ k          _nop_();
+ l" H+ h& @1 x7 Q         _nop_();        //空操作四个机器周期,给硬件反应时间
6 M& c8 g* n# x, e& E( N         E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令. k* a% B( F& |) I2 V: y6 d# w1 y4 u
}
% |6 o. I% ^! A, H5 x: Z/*****************************************************
$ P. S- m$ k, U; r( A5 C7 [% N函数功能:对LCD的显示模式进行初始化设置: ]" D' o8 l0 q0 v  d
***************************************************/& K- r1 u0 _# x& j# U$ s
void LcdInitiate(void)* K. l. l" {* R- K/ X3 \. g) v
{
, D6 i# `6 b( X. f   delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间% I1 G5 u+ L' W8 `3 B( Q: Y+ n
   WriteInstruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
# R- R4 Z9 j1 p8 Q, u1 S  Z* ]        delay(5);   //延时5ms 1 V# ]1 W; A' G
        WriteInstruction(0x38);
) J' j" H& y# M3 b        delay(5);
4 Y3 i# K- U: ^5 d' Q        WriteInstruction(0x38);
: `) Q# t: L- b9 |7 p        delay(5);0 x" F3 p! p# `2 g) @8 w
        WriteInstruction(0x0f);  //显示模式设置:显示开,有光标,光标闪烁2 z: p  c# D7 r2 c- I, M$ s! _1 W
        delay(5);% H+ n) p1 X6 [% n7 f* w
        WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移
0 [9 o' T5 s8 I- l) x; ?        delay(5);: C6 w9 C1 o+ X0 s& N/ k, R: j
        WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除: v& j4 j4 P9 f  |" `
        delay(5);
, |4 [8 T: _6 i: ^$ g- @4 T) ]2 z$ U" | }/ j" Q3 E- U9 N& @! x
void main(void)            //主函数* T6 |" ]. |" O/ p$ F/ ^
{
) J' @" \3 O. \4 P% M4 o  unsigned char i;8 N, m# l& K, x9 C; J
  LcdInitiate();         //调用LCD初始化函数  
9 K  z  D# Z8 @1 b$ t  delay(10);9 I8 }* N( ^# N6 u( \
  while(1)8 u% w8 b' |$ @1 a  q
     {
# r0 E5 ~* l- O. m; |       WriteInstruction(0x01);//清显示:清屏幕指令: J1 u! @) K* G* }; V
                 WriteAddress(0x00);  // 设置显示位置为第一行的第1个字5 s/ J( a: ~' t8 A
                       i = 0;
5 M) A  t' K; y+ z$ {- n7 J( Y. }7 h                while(string != '\0')//只要没有写到字符串结束标志,就继续写) K# ]5 c; ]0 `/ \/ a2 C
                        {                // 显示字符
+ V. [; N8 \! k0 z2 Q                                        WriteData(string);' d0 M; X1 t9 D3 c
                                        i++;: D2 a  Z  i* Z. L( x$ R. F
                                        delay(150);; [% n. |; W; @1 i8 C4 X$ l0 I4 @
                        }        
, P: j0 w: \( Q  h9 G$ g# i        for(i=0;i<4;i++): s6 T1 q9 z" g# E; E) a5 D' Z" [
                    delay(250);
; Q# W8 H( m: G- W8 Z# u2 o. V) F/ }' I
…………限于本文篇幅 余下代码请从论坛下载附件…………
6 {3 C6 S6 A! C; `& @. ^& w" x5 I4 [& @& `# }5 P' R) N' U
$ j! G% b  J/ X) N  ]
游客,如果您要查看本帖隐藏内容请回复

1 j8 d1 Q# [. L) Y

该用户从未签到

3#
发表于 2019-12-11 17:02 | 只看该作者
haoaaaaaaaa
' O+ l2 @1 E/ U! O6 z% i
  • TA的每日心情
    擦汗
    2020-6-22 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2020-6-22 15:19 | 只看该作者
    去哪找附件啊
    - n, d; r7 E( X( y4 o: ?
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-6 19:13 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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