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