|
|
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 |
|