📄 yejing.lst
字号:
C51 COMPILER V8.05a YEJING 12/05/2008 16:15:22 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE YEJING
OBJECT MODULE PLACED IN yejing.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE yejing.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*-------------------------------------------------------------------
2 LCD1602.c 1602用的函数
3
4 作者:liunian
5
6 邮箱:liunian_leon@sohu.com
7
8 日期:2008.7.13
9
10 版本:V1.0 适合初学者使用
11 -------------------------------------------------------------------*/
12
13 #include<reg51.h>
14 #include<absacc.h>
15 #include<intrins.h>
16
17
18 #define uint unsigned int
19 #define uchar unsigned char
20
21 sbit EN=P1^7; //使能信号
22 sbit RW=P1^6; //读写控制信号
23 sbit RS=P1^5; //数据命令选择端口
24 #define D_port P0 //传送数据的端口设为P0,以上端口根据实际硬件电路图可做修改
25
26
27
28
29 /****************延时函数******************************/
30
31 delay(uint k)
32 {
33 1 uint i,j;
34 1 for(i=0;i<k;i++)
35 1 {
36 2 for(j=0;j<60;j++){;}
37 2 }
38 1 }
39
40
41
42
43 /****************查询液晶是否忙*************************/
44
45 Checkbusy()
46 {
47 1
48 1 D_port=0xff; //P0全部置1,可以查询判断P0口状态,读取液晶的命令
49 1 RS=0;
50 1 RW=1;
51 1 EN=1;
52 1 _nop_(); //读液晶命令时各控制位的状态几时序
53 1 while(D_port&0x80) //判断最高位状态,最高位是液晶忙的状态位
54 1 {
55 2 EN=0;
C51 COMPILER V8.05a YEJING 12/05/2008 16:15:22 PAGE 2
56 2 _nop_();
57 2 _nop_();
58 2 EN=1;
59 2 _nop_();
60 2 _nop_();
61 2 } //如果液晶忙,则循环查询
62 1 EN=0;
63 1
64 1 }
65
66 /****************写数据到液晶***************************/
67
68 D_write(uchar a)
69 {
70 1 Checkbusy(); //检查忙标志位
71 1 D_port=a;
72 1 RS=1;
73 1 RW=0;
74 1 EN=1; //写数据各控制位的值既对应的时序
75 1 _nop_();
76 1 _nop_();
77 1 _nop_(); //发送数据,此处是发送到P0口,程序前已经定义
78 1 EN=0;
79 1 }
80
81 /****************写指令到液晶***************************/
82
83 C_write(uchar a)
84 {
85 1 Checkbusy(); //检查忙标志位
86 1 D_port=a;
87 1 RS=0;
88 1 RW=0;
89 1 EN=1; //写指令各控制位的值既对应的时序
90 1
91 1 _nop_();
92 1 _nop_();
93 1 _nop_(); //发送指令,此处是发送到P0口,程序前已经定义
94 1 EN=0;
95 1 }
96
97 /***************液晶初始化******************************/
98
99 Initial()
100 {
101 1 D_port=0;
102 1 delay(20);
103 1 C_write(0x38);
104 1 delay(10);
105 1 C_write(0x38);
106 1 delay(10);
107 1 C_write(0x38);
108 1 delay(10);
109 1 Checkbusy();
110 1 C_write(0x38);
111 1 Checkbusy();
112 1 C_write(0x08); //关闭显示
113 1 Checkbusy();
114 1 C_write(0x01); //清屏
115 1 Checkbusy();
116 1 C_write(0x06); //显示光标右移设置
117 1 Checkbusy();
C51 COMPILER V8.05a YEJING 12/05/2008 16:15:22 PAGE 3
118 1 C_write(0x0c); //显示开,光标不显示,不闪烁
119 1 delay(5);
120 1 } //根据1602初始化的指令顺序来初始化LCD,相关初始化步骤可查阅相关资料
121
122 /***************设定显示位置函数************************/
123
124 setpos(uchar posx,uchar posy)
125 {
126 1 posx=posx&0xf; //将显示在第几位置转为二十六进制,每行总共16个位置
127 1 posy=posy&0x1; //设置显示在第几行
128 1 C_write(posx|posy*0x40+0x80); //设置位置命令最高位必须为一,所以要加0x80
129 1 }
130
131
132 /***************显示一个字符子程序**********************/
133
134 displaychar(uchar x,uchar y,uchar a)
135 {
136 1 Checkbusy(); //检查忙标志位
137 1 setpos(x,y); //设置显示位置
138 1 D_write(a); //将要显示的数据写到液晶
139 1 }
140
141 /***************显示一串字符串**************************/
142
143 displaystring(uchar x,uchar y,unsigned char code *string)
144 {
145 1 uchar length=0; //定义一个字符串长度
146 1 Checkbusy();
147 1 while(string[length]!='\0') //字符串是以'\0'结束的,因此只要每结束就显示下一字符
148 1 {
149 2 displaychar(x,y,string[length++]); //显示一个字符子程序
150 2 x++; //液晶显示的位置+1
151 2 }
152 1 }
153
154 /*********************主程序 ***************************************/
155 main()
156 {
157 1 Initial();
158 1
159 1 displaychar(5, 0, 0x31);
160 1 while(1);
161 1
162 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 266 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -