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