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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机用LCD1602循环右移显示welcome to china仿真源程序
* c. Z% ^/ N# V& R( @
单片机源程序:
0 F1 |2 d. l# k3 y
//用LCD循环右移显示"Welcome to China"5 k8 X7 p) D' ~6 k
#include<reg51.h>    //包含单片机寄存器的头文件
9 n9 B) g1 W! X( e6 u! R7 n#include<intrins.h>  //包含_nop_()函数定义的头文件
- c: n4 L9 p6 O4 esbit RS=P2^0;    //寄存器选择位,将RS位定义为P2.0引脚7 q. b% k$ p- L2 Z8 s; J
sbit RW=P2^1;    //读写选择位,将RW位定义为P2.1引脚6 o6 n/ ~& U& b9 _$ f; L# Z
sbit E=P2^2;     //使能信号位,将E位定义为P2.2引脚
" q  U( X! o* t6 o) L2 qsbit BF=P0^7;    //忙碌标志位,,将BF位定义为P0.7引脚
% J; d3 h5 o7 `: }# xunsigned char code string[ ]={"Welcome to China"}; $ M4 o+ Q6 U2 J) \5 h( B; I* V0 Q
/*****************************************************$ ]/ w( N1 e, L2 u9 z
函数功能:延时1ms! l" w/ r3 |3 k& _( j) u
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
: ~( g8 |8 f" U5 N9 t***************************************************/! t* ^9 {& A1 G% H" }$ \% f: c2 q6 }
void delay1ms(): m/ k) x/ W! ]' v7 k8 {  W: a
{# k" ^7 E" p* A5 }+ K7 X) S
   unsigned char i,j;          x: |' H9 V  p. e/ X% {) Z0 W  Z
         for(i=0;i<10;i++)
( r, {: R! n: {6 b8 j          for(j=0;j<33;j++)
1 y6 {' ?8 J7 `; V5 w/ \           ;                 
2 J$ ?7 ~1 Z$ f: u }+ o$ W: e/ |7 U$ @$ R
/*****************************************************8 l( r, c/ e9 s
函数功能:延时若干毫秒- x7 Z1 K; P6 O0 L
入口参数:n
# c# Q+ Z# S; B. i% I: ?***************************************************/2 w( W( R1 J$ h, L# z# E
void delay(unsigned char n)
$ x0 ]+ u7 g4 U( y {3 w  Y8 T0 N" N6 Y) O- M3 H
   unsigned char i;
* d3 P$ F/ m4 d) u- n' p3 W        for(i=0;i<n;i++)  F4 R/ l2 Q: X! s, X/ j' b5 S
           delay1ms();
/ T6 Y- r- s, Z" M }& q% e6 t; I) x$ G! F$ ]
/*****************************************************; b! k8 [- |  C* Y3 q1 V3 \$ Y
函数功能:判断液晶模块的忙碌状态9 a5 v" w; W; s  j
返回值:result。result=1,忙碌;result=0,不忙
+ {" t* g) _( A6 ~7 [' a***************************************************/: v2 ?8 y1 ~" G; h( i- R5 v) D
unsigned char BusyTest(void)
1 M( P' }& k5 M% c1 G7 k  {( H. h! d. W8 Y  S
    bit result;% U2 D8 n* L2 H( T
        RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
' \: u( [3 j  x0 o. d  H- X    RW=1;4 A) K/ W: A* r
    E=1;        //E=1,才允许读写. Z& C7 U( I8 G8 E
    _nop_();   //空操作5 Q) o; p8 p4 q' x# \
    _nop_();
  C6 o0 E* d, P7 X  _    _nop_(); ) b" c. `6 h( e5 l5 i' w+ v+ H
    _nop_();   //空操作四个机器周期,给硬件反应时间        
# C3 J9 F1 A) v( Z/ w: p4 V    result=BF;  //将忙碌标志电平赋给result
& t6 {4 S, c9 x' K2 [" _        E=0;
7 k, {9 i( L4 d1 B    return result;
% f7 X% E# g$ w  w  }
$ Q: Z* s, W% u  l; j) ~: D+ t9 }/*****************************************************$ }3 a, I5 F# q3 q1 O1 P2 \
函数功能:将模式设置指令或显示地址写入液晶模块$ O, _/ c' g3 h: U: ?9 }; l
入口参数:dictate2 [* ~( p. x3 R# b+ \
***************************************************/# @) m- C) s& |( T
void WriteInstruction (unsigned char dictate)
4 R8 J+ r4 q: R- a5 g{   $ t, g. E0 {( H9 _; C3 x
    while(BusyTest()==1); //如果忙就等待
; [, ?  w2 [/ `1 ?7 s5 n( U. ]$ E         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
7 m. q( z0 k' z% A         RW=0;   
; V  C9 C4 Z: A& E' j/ c$ @% a         E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,9 P3 S+ M# w! j. N. q4 w" F
                             // 就是让E从0到1发生正跳变,所以应先置"0"2 q8 Y$ W, D, E0 q$ p  y' U
         _nop_();
/ {1 g" h" O- P- Q         _nop_();             //空操作两个机器周期,给硬件反应时间
. S8 H2 y( \  h         P0=dictate;            //将数据送入P0口,即写入指令或地址; R/ E/ A6 H2 a) f! D$ q( _
         _nop_();9 L( B, D2 p9 J# H$ g, l  N
         _nop_();
' f' W  w2 E) Q/ n) l$ }! F0 `0 {+ s         _nop_();+ x' ~" \  M( ?; f& ~4 y4 k* B
         _nop_();               //空操作四个机器周期,给硬件反应时间
0 Q2 D+ m7 r: x% D         E=1;                   //E置高电平1 R: ^: b+ {1 `0 d3 G/ z( Q4 n
         _nop_();/ n7 X8 ^( b( a# F( Z+ U# `
         _nop_();
' I3 o; T6 U$ K0 g& k9 s4 a         _nop_();6 v% w2 x6 q. X3 X
         _nop_();               //空操作四个机器周期,给硬件反应时间
( ~3 N3 {$ ~- ^. P& u          E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
; \1 Z) ?) U% a }- v' Y  m  m; ]( }4 k& y* h5 v
/*****************************************************4 l% U: E$ Z  S& n, S9 ~# d* _
函数功能:指定字符显示的实际地址
0 n9 m( t& b/ l3 {入口参数:x
9 `! Y+ ~% k! n) b7 s/ `7 w& z3 K***************************************************/; L5 K4 `2 E# ^1 ~
void WriteAddress(unsigned char x)
7 a  S. J3 A. p* o1 ~4 @ {. T: R, ^. @! W: a
     WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"3 B. s3 q) R! R8 D6 u$ X0 }, C0 v
}* q. A6 ^; R! v( }0 Q
/*****************************************************# w; d* o0 e( u$ V  ^
函数功能:将数据(字符的标准ASCII码)写入液晶模块8 Q$ T% A2 r+ H( u9 _8 V
入口参数:y(为字符常量)
* g; O! k/ Z" f5 ^& O9 M***************************************************/; R0 G- P) g& Q9 k* _
void WriteData(unsigned char y)
% {, e/ z+ y: n& p9 V( P {  X$ U$ n# {$ ?2 i! L; O  b$ H
    while(BusyTest()==1);  9 j' B/ H1 F& }4 l2 C" L% j
          RS=1;           //RS为高电平,RW为低电平时,可以写入数据
# e0 d1 }, Q0 x          RW=0;5 H9 i+ I2 U- y; Y$ E
          E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,4 I1 _7 i- i' r; Y9 k1 p
                       // 就是让E从0到1发生正跳变,所以应先置"0"
) }! A& |: K! x, p9 o0 Q  [4 t% k          P0=y;           //将数据送入P0口,即将数据写入液晶模块
7 i& A0 _" q- G) j* i2 V% B8 @          _nop_();, w, P8 l% i! N+ ?# b% \; w
          _nop_();. ?1 b1 Y( T: U/ S
           _nop_();
/ }; ?4 d+ t. b     _nop_();       //空操作四个机器周期,给硬件反应时间
' {& `+ I; r4 |5 m- _& f          E=1;          //E置高电平$ O( |9 {3 I; J
          _nop_();
: a2 ?$ y7 |" o& ]( B/ V0 r          _nop_();
' q6 D1 X) x$ t& G, `5 p          _nop_();
$ O% M/ m, O. }: w7 l         _nop_();        //空操作四个机器周期,给硬件反应时间$ u5 V4 z4 j0 m& I' w
         E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令5 F  u$ V/ l7 \7 X7 e& f
}& x( ]+ g# F- D- N
/*****************************************************
# Y% N6 H5 Y$ n. j- ?函数功能:对LCD的显示模式进行初始化设置
2 z3 L( v9 M1 J& Y7 l! [6 V***************************************************/
9 v0 ^; I! q* Q5 D( Qvoid LcdInitiate(void)
4 Y# H+ E: g3 {% H$ \- f{
9 g" X: C. \- o* }: J: f% J   delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间% m: g% I5 \" Z1 b6 i" f
   WriteInstruction(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口' R9 }1 e1 ~  s5 N: _
        delay(5);   //延时5ms 4 E; j  }" `$ m. a( g6 b. w
        WriteInstruction(0x38);! G5 E+ b! C7 t& {: g! D/ G
        delay(5);
7 d( o- |" w/ s' D        WriteInstruction(0x38);
% O6 a; j% B7 t        delay(5);+ N& R! c4 q+ @
        WriteInstruction(0x0f);  //显示模式设置:显示开,有光标,光标闪烁% O) K& {) H4 S1 ~
        delay(5);
' ~- X# \: ?0 u6 I3 s. Y9 O        WriteInstruction(0x06);  //显示模式设置:光标右移,字符不移
' f# E1 T* d. Z4 F5 _1 j0 ^        delay(5);
) k, q3 _$ e* d+ p  d        WriteInstruction(0x01);  //清屏幕指令,将以前的显示内容清除
; W4 b# w) E; `) M2 u6 S        delay(5);
- b6 J, L, M# U& x; G+ k }
7 T2 x( z2 s& wvoid main(void)            //主函数6 k6 I, y" p% S- B5 N
{
* `3 d& Y( \  L& a  unsigned char i;
: `; q8 h  Z! @. H: n  LcdInitiate();         //调用LCD初始化函数  7 P2 w, f1 I) ]% q' F9 p0 i8 S
  delay(10);
3 Q& C# r$ ]& M5 {  while(1); M/ ]( E" [3 `# F
     {4 W& O8 J5 m+ q5 {5 B1 L
       WriteInstruction(0x01);//清显示:清屏幕指令7 q& _  k' X2 U: ?" l& v1 ?' T; V1 t
                 WriteAddress(0x00);  // 设置显示位置为第一行的第1个字
) H; b3 \) N7 p& K/ t$ [' c                       i = 0;2 j: M# P0 o$ J5 P7 V* s
                while(string != '\0')//只要没有写到字符串结束标志,就继续写6 N4 |. @  U3 s2 j/ R: J: O( l& q
                        {                // 显示字符
' f, T7 E2 \( e9 X& [, _                                        WriteData(string);
4 @# p/ m' y8 y# {                                        i++;# ~. u) @; x+ A% w, H  ^5 a4 ?
                                        delay(150);+ s, O7 D0 q) M/ D8 [' O
                        }        
5 d4 g- h- ^+ v6 r7 o- r; N        for(i=0;i<4;i++)
, N8 p0 v2 k& `9 M                    delay(250);
+ U" F6 E: c% p. D
+ }: }0 X% Q9 u& u0 P3 d…………限于本文篇幅 余下代码请从论坛下载附件…………
3 b( ~9 w# E, p9 E. z) J* Q2 k3 @' M- X. u; u6 B: s9 d8 A% ]1 X
. |; W+ E2 q+ {. m& o" \+ u: R
游客,如果您要查看本帖隐藏内容请回复

( M! T, I0 t- R6 @% u

该用户从未签到

3#
发表于 2019-12-11 17:02 | 只看该作者
haoaaaaaaaa# n5 l9 D/ h  ?5 N# u% ^/ j3 P
  • TA的每日心情
    擦汗
    2020-6-22 15:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2020-6-22 15:19 | 只看该作者
    去哪找附件啊/ u' `# @8 x7 [: E. ^! j# Y+ m. z
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-5 14:27 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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