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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机用LCD1602循环右移显示welcome to china仿真源程序5 S) _+ b' E; [0 R1 o
单片机源程序:
  `0 W3 K* ~) E
//用LCD循环右移显示"Welcome to China"/ j6 y6 K6 w$ O* {' H3 T+ S
#include<reg51.h>    //包含单片机寄存器的头文件
/ ?1 x6 A# k. C* f#include<intrins.h>  //包含_nop_()函数定义的头文件) b+ H& b* Z% |- A: z  m; @
sbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚
. d0 n( R2 y1 h& xsbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚
- }& |& z4 \; a( _4 |$ W7 Csbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚9 T0 v$ f: q1 h
sbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚
! s, ]# U% n6 i7 q; I# junsigned char code string[ ]={"Welcome to China"}; # t- l( a3 T( ]# ~) `; @9 Y! F
/*****************************************************! R. j* {4 O) T# e2 c  {* q6 v
函数功能:延时1ms
9 \# B/ j2 V- i! Y7 P' N, t(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
- p  n9 p' y0 `$ W7 j***************************************************/! L1 g, ^+ @& T3 u; N
void delay1ms()
$ R& c1 c# ]# g. s$ j{' ?& F! l+ E8 d7 M7 A
   unsigned char i,j;        
. n4 C5 ~* ^# B: m! s         for(i=0;i<10;i++)
  Y' H4 U7 U4 C3 c* N          for(j=0;j<33;j++)
, K% ?: n* o8 @$ ?           ;                   E: h/ r% h/ _
}3 |0 v: A; e! l5 T0 Q" o1 y" i
/*****************************************************. l4 i4 s( X0 |2 s0 _
函数功能:延时若干毫秒) V+ K; ]6 r6 u3 G
入口参数:n9 v# I. M8 v" f  w, j, X
***************************************************/+ j& f7 A1 v8 j! I
void delay(unsigned char n)
: n; I; b* R3 a3 {4 k' T& a- m; i {4 ?" a) f, [, d' Q  E6 w
   unsigned char i;8 t, [! z) m: o0 b* r9 B$ [, z
        for(i=0;i<n;i++)- m: c. T- I/ q. F/ ^1 R
           delay1ms();
. a* {/ T: Y) o6 E5 N% h6 | }. H7 Z* j) t3 p4 R
/*****************************************************6 _( t+ W% {4 i1 u' h! _, I6 k
函数功能:判断液晶模块的忙碌状态
/ Z: w, H2 r3 e返回值:result。result=1,忙碌;result=0,不忙2 j& _+ H9 T0 P
***************************************************/
, M! ]0 |3 I. e* B3 w6 m unsigned char BusyTest(void)
; b7 g: e+ s2 @% a2 g- x  {; w/ \5 E& K  f3 w7 W; |) W3 p
    bit result;1 n, L. L+ C* M
        RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态4 H4 S* G9 R) _. e
    RW=1;. T% D% Z2 t9 B% x
    E=1;        //E=1,才允许读写
7 S% K8 x- ?( }    _nop_();   //空操作/ {* q4 m4 s5 \" V3 R2 `5 o/ s1 w) o3 C
    _nop_();
# D* E# n1 i' U    _nop_(); , K  w- y, X8 t+ N! e
    _nop_();   //空操作四个机器周期,给硬件反应时间        
- v- V$ b. ~* X; N) D" ~    result=BF;  //将忙碌标志电平赋给result; {6 p3 r5 G$ g2 D# m3 k1 t- Q
        E=0;
+ S3 c" W* @" Q$ b" M8 X    return result;
. a# h0 a& P7 p: T7 a1 X1 E% K2 ]  }
: T$ o/ b! j. V! {/*****************************************************! m- y5 s' C' L- {' u8 o0 |% `- q
函数功能:将模式设置指令或显示地址写入液晶模块+ j, c7 h7 L1 S* F% K7 A
入口参数:dictate
/ c  X# s* I& ]* G6 E* t***************************************************/
/ i( r) @. w  Y8 ?% r( _void WriteInstruction (unsigned char dictate)
2 j, t; R6 H. @6 N{   
$ ?' D% S8 O* t    while(BusyTest()==1); //如果忙就等待: U& |5 O+ h9 q# D- e
         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
; g$ u1 ^8 O/ K* q8 b         RW=0;   
) v% }  y: j/ d         E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
  g$ U1 T+ S3 Q- t: d. y! x4 d                             // 就是让E从0到1发生正跳变,所以应先置"0", @$ t& V3 {  x) [# }
         _nop_();+ x) ~4 H& ~* s- G+ x/ e3 R$ R
         _nop_();             //空操作两个机器周期,给硬件反应时间5 H6 f5 k/ Y" N3 `$ _
         P0=dictate;            //将数据送入P0口,即写入指令或地址) O; B$ H# B- n- ^
         _nop_();: p" R! e( ^: z4 J* W
         _nop_();9 L. o& W  J- a, {' d: S- a$ J
         _nop_();" z- D  a% @5 s+ R( J4 q* I
         _nop_();               //空操作四个机器周期,给硬件反应时间
* }# ]. h$ B- {5 x& |* }$ Z* U         E=1;                   //E置高电平$ g4 |6 Q5 a1 m! r
         _nop_();2 i# B9 j" c, H6 P, y
         _nop_();9 I  L: n9 F' t( m. ~1 x9 ]7 Y( z4 i
         _nop_();
/ N) ?# T; p( j+ @- c% {$ ]( \( w         _nop_();               //空操作四个机器周期,给硬件反应时间
* `( Q. a8 T+ i, L" r3 A          E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令" v, u  V$ ?8 B
}4 D: A0 R7 g2 U6 f, i  t) i( j
/*****************************************************4 S6 f' m( _2 B
函数功能:指定字符显示的实际地址
8 f- X3 u" Y/ `& E* F6 K: s入口参数:x% C7 F" e# W' ~
***************************************************/+ n8 Q) w/ x. }4 E4 `- i/ T
void WriteAddress(unsigned char x)
$ X* U: g2 E" a2 X2 L2 a. P8 a {  \- d% S3 h4 D$ S: F% t8 c
     WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x". n2 X1 M# ~5 _+ l9 s) B
}
( f0 \7 p$ m! q4 H# e$ r8 }* A/*****************************************************, O9 ]2 v' k. \: d
函数功能:将数据(字符的标准ASCII码)写入液晶模块1 W+ t9 ~' }+ v2 k/ B( t
入口参数:y(为字符常量)
( d9 m* J$ b  j4 e***************************************************/! Z8 b+ g! j9 M1 v
void WriteData(unsigned char y)
" ?/ O  H4 {) d  z" n& ` {
( Z- }' Y1 m; i1 F3 z    while(BusyTest()==1);  
. B" x7 I( F, |* t7 g# v          RS=1;           //RS为高电平,RW为低电平时,可以写入数据
5 ^" ]% S" E- d4 S* l          RW=0;
1 t% g6 `: ^) K" m" J          E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
! w. b; _- l! ~2 [' s* G                       // 就是让E从0到1发生正跳变,所以应先置"0"
1 G5 o8 v* q( j3 O5 \4 T3 [          P0=y;           //将数据送入P0口,即将数据写入液晶模块
( ?! {4 B* `, A0 w- J5 J' @  d          _nop_();# }: Z# b* C  `6 \
          _nop_();
' \* n8 @5 ^" @7 W2 q           _nop_();% h7 N- ^! i7 i
     _nop_();       //空操作四个机器周期,给硬件反应时间+ I0 b8 V; ]; z" c+ G
          E=1;          //E置高电平) `: u3 E( C, W; A; W
          _nop_();8 X# }9 X" E% [$ X5 ?2 g
          _nop_();
3 V9 e* `5 d* W" g; P          _nop_();/ @3 ]& e/ G1 J7 `
         _nop_();        //空操作四个机器周期,给硬件反应时间" }1 G) w" }5 o5 J% S! p! h
         E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令( w& o1 r3 \- {
}
6 o2 o' m- Z6 j/*****************************************************
% V1 v" f) Z# B% k( L函数功能:对LCD的显示模式进行初始化设置
3 n' _* Y7 X5 \4 d- Y2 [* a9 {! @4 c***************************************************/$ |7 d4 d9 t6 F. u
void LcdInitiate(void)
/ l; h3 t2 j) ?! _/ w: k# S& L0 q. I8 d{
5 V# F+ ]9 Z* q   delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
- d# U  z9 M* |+ K   WriteInstruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口4 P  p* o1 X  k1 k0 U! k# h* b
        delay(5);   //延时5ms 
9 W  ^  C8 g5 k% B. g, |% V/ [. c        WriteInstruction(0x38);) S% s! g6 e9 S4 v7 J, U3 ?
        delay(5);, J0 h1 [6 z4 O1 m( _/ K' \
        WriteInstruction(0x38);. _$ A/ n  b& Q* K  X8 w* K$ K
        delay(5);
  \3 U7 |, L. v0 d        WriteInstruction(0x0f);  //显示模式设置:显示开,有光标,光标闪烁3 [* Q, X8 t; X) S  r- a
        delay(5);
/ N% W8 k' K! E/ v' ?  O  {        WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移
" J/ V$ z; i8 `) m0 I        delay(5);
! t4 ?$ k+ e7 x9 U$ v        WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除9 r  Y, u5 J1 ?1 |
        delay(5);
/ c5 m# ?1 w& Z7 Y }8 h  Q7 p  _$ n7 A! B
void main(void)            //主函数' Y  C& P, ~# u; h% A
{+ m6 z- a- L# D
  unsigned char i;
9 k* J9 I: S: @$ _4 g0 ]8 t  LcdInitiate();         //调用LCD初始化函数  : S# \: d3 H/ E7 i1 P
  delay(10);% D1 s6 I2 _* c2 I
  while(1)1 W9 ]/ ~. P! V* s5 L& e, y
     {0 y' e( G/ T& p- u
       WriteInstruction(0x01);//清显示:清屏幕指令
0 n9 f$ v, p, L9 ?8 q) x% Y                 WriteAddress(0x00);  // 设置显示位置为第一行的第1个字
! Z+ @8 g6 C" A! [/ N$ m8 ^$ N                       i = 0;( F4 V% ^( y, `: N4 O) h
                while(string != '\0')//只要没有写到字符串结束标志,就继续写  C! x% P1 N1 O& O0 h
                        {                // 显示字符$ z2 w4 Q1 F7 U
                                        WriteData(string);  T0 e, M; x2 ]2 p" p2 U1 @1 {& A
                                        i++;( L1 k6 _) g0 i/ @, G
                                        delay(150);
, W, a, O4 n: N- g4 S7 ~7 R' D                        }        2 l& _* ?& ?$ u* g! f/ P
        for(i=0;i<4;i++)3 Z5 R+ ]& ^1 x
                    delay(250);. Y8 G6 @# ~& ]$ |5 R! [7 [

5 }/ T6 S7 h, H4 a…………限于本文篇幅 余下代码请从论坛下载附件…………
, W  k* U; e: [* \! y: i+ O/ O# a4 A* y& u: l: P/ f' D, i$ S4 Y

. N# T6 d; G8 ?/ _, |( A
游客,如果您要查看本帖隐藏内容请回复

# H, o  A* R2 w: s9 l

该用户从未签到

3#
发表于 2019-12-11 17:02 | 只看该作者
haoaaaaaaaa0 y8 G; Q7 x4 O5 z, p) s
  • TA的每日心情
    擦汗
    2020-6-22 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2020-6-22 15:19 | 只看该作者
    去哪找附件啊
      W+ \1 U/ ?* n1 g) q) O
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-21 13:02 , Processed in 0.078125 second(s), 26 queries , Gzip On.

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

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

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