📄 51lcd1602+=
字号:
C51 COMPILER V9.00 LCD1602 12/11/2011 23:03:25 PAGE 1
C51 COMPILER V9.00, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN lcd1602.OBJ
COMPILER INVOKED BY: D:\Program Files\keil4\C51\BIN\C51.EXE lcd1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*********************************************************
2 LCD1602的驱动程序
3 **********************************************************/
4 #include <reg52.h>
5 #include "work.h"
6 #include <math.h>
7
8 //===========================================================
9 //延时约1毫秒
10 //===========================================================
11 void delayms(uint z)
12 {
13 1 uint x,y;
14 1 for(x=z;x>0;x--)
15 1 for(y=120;y>0;y--);
16 1 }
17 //===========================================================
18 //lcd读忙标志
19 //===========================================================
20 uchar lcdbusy()
21 {
22 1 bit result;
23 1 lcd_rs = 0;
24 1 lcd_rw = 1;
25 1 lcd_en = 1;
26 1 delayms(1);
27 1 result = (bit)(P0 &0x80);
28 1 lcd_en = 0;
29 1 return (result);
30 1 }
31
32 //============================================================
33 //"写数据函数"
34 void writedata(uchar wrdata1) //"写数据函数"
35 {
36 1 while(lcdbusy());
37 1 lcd_rs=1; //write data
38 1 lcd_rw=0;
39 1 lcd_en=1;
40 1 DQ=wrdata1;
41 1 delayms(5);
42 1 lcd_en=0;
43 1 }
44 //============================================================
45 //"写命令函数"
46 //============================================================
47 void writecom(uchar comd) //"写命令函数"
48 {
49 1 while(lcdbusy());
50 1 lcd_rs=0;
51 1 lcd_rw=0;
52 1 lcd_en=1;
53 1 DQ=comd;
54 1 delayms(5);
55 1 lcd_en=0;
C51 COMPILER V9.00 LCD1602 12/11/2011 23:03:25 PAGE 2
56 1 }
57
58 /**********************************************************
59 "写字符串函数"
60 **********************************************************
61 void writestr(uchar *p) //"无地址,写之前要先写一个地址"
62 {
63 uchar i;
64 i=0;
65 while (p[i] != '\0')
66 {
67 writedata(p[i]);
68 i++;
69 }
70 } *///---------此函数没有调用过,故注释掉--------------
71 //*******************"初始化函数"********************************
72 void lcdinit(void)
73 { writecom(0x38); //"5*8双行显示"
74 1 delayms(5);
75 1 writecom(0x06);
76 1 delayms(5);
77 1 writecom(0x0c);
78 1 delayms(5);
79 1 writecom(0x01); //"清屏"
80 1 writecom(0x80);
81 1 }
82
83 //================================================================
84 // 显示清除
85 //================================================================
86 void clearplay(uchar x)
87 {
88 1 uchar i;
89 1 if(x==1)
90 1 {
91 2 for(i=0;i<16;i++)
92 2 pbuffer1[i]=0;
93 2 }
94 1 else if(x==2)
95 1 {
96 2 for(i=0;i<16;i++)
97 2 pbuffer2[i]=0;
98 2 }
99 1 else if(x==3)
100 1 {
101 2 for(i=0;i<16;i++)
102 2 {
103 3 pbuffer1[i]=0;
104 3 pbuffer2[i]=0;
105 3 }
106 2 }
107 1 pbuffer2[15]=0x30;
108 1 pflag=1;
109 1 }
110
111 //=================================================================
112 //刷全屏:进行一次全屏的刷写
113 //=================================================================
114 void displayall(void)
115 {
116 1 uchar i;
117 1 if(pflag==1)
C51 COMPILER V9.00 LCD1602 12/11/2011 23:03:25 PAGE 3
118 1 {
119 2 writecom(0x0c);
120 2 writecom(0x80+0x40); //第二行
121 2 for(i=0;i<16;i++)
122 2 writedata(pbuffer2[i]);
123 2
124 2
125 2 writecom(0x80);
126 2 for(i=0;i<16;i++) //第一行
127 2 writedata(pbuffer1[i]);
128 2 writecom(0x80+k);
129 2 writecom(0x0e);
130 2 pflag=0; //清0显示标志位
131 2 }
132 1 }
133 //==========================================================
134 //flag=1,移第一行;flag=2,移第二行。
135 //==========================================================
136 void moveright(uchar flag)
137 {
138 1 uchar i;
139 1 if(flag==1)
140 1 {
141 2 for(i=15;i>0;i--)
142 2 pbuffer1[i]=pbuffer1[i-1];
143 2 pbuffer1[0]=0;
144 2 }
145 1 else if(flag==2)
146 1 {
147 2 for(i=15;i>0;i--)
148 2 pbuffer2[i]=pbuffer2[i-1];
149 2 pbuffer2[0]=0;
150 2 }
151 1 }
152 //=====================================================
153 //功能:结果显示传换
154 //说明:显示的结果小数部分是六位的,显示的只是表像结果,
155 // 当进行连运算时,结果就不对了,显示结果没有更改上一次的计算结果
156 //=====================================================
157 void jchangep(void) //结果显示传换
158 {
159 1 uchar i,p,q; //i循环变量,p整数位数,q小数位数
160 1 uchar n;
161 1 long int j,m,xs; //
162 1 float xsj,jguo1;
163 1 if(jguo<0) jguo1=-jguo;
164 1 else jguo1=jguo;
165 1 j=jguo1; //取整数部分
166 1 xsj=jguo1-j; //取小数部分
167 1 p=0;
168 1 q=0;
169 1 if(j==0)//----------无整数---------------------
170 1 {
171 2 p=1;
172 2 q=9;
173 2 xs=xsj*(long int)pow(10,9);
174 2 while(xs%10==0)
175 2 {
176 3 xs=xs/10;
177 3 q--;
178 3 } //取小数个数
179 2 xs=xsj*(long int)pow(10,q);
C51 COMPILER V9.00 LCD1602 12/11/2011 23:03:25 PAGE 4
180 2 for(i=15;i>15-q;i--)
181 2 {
182 3 pbuffer2[i]=xs%10+0x30;
183 3 xs=xs/10;
184 3 }
185 2 if(jguo<0) pbuffer2[15-q-1-1]='-';
186 2 pbuffer2[15-q-1]=0x30;
187 2 pbuffer2[15-q]='.';
188 2 if(q>6)
189 2 {
190 3 n=q-6;
191 3 for(i=0;i<n;i++)
192 3 moveright(2);
193 3 while(pbuffer2[15]==0x30) //小数点后的0不显示
194 3 {
195 4 moveright(2);
196 4 }
197 3 }
198 2 }
199 1 else if(xsj<0.000000002)//-----------无小数----------------
200 1 {
201 2 q=0;
202 2 for(i=0;i<10;i++)
203 2 {
204 3 m=(long int)pow(10,i); //p整数个数。q小数个数
205 3 if(j/m!=0)
206 3 p=i+1;
207 3 }
208 2
209 2 if(jguo<0) {pbuffer2[15-p]='-';} //显示负号
210 2 for(i=15;i>15-p;i--)
211 2 {
212 3 pbuffer2[i]=j%10+0x30;
213 3 j=j/10;
214 3 }
215 2 }
216 1 else //---------小数和整数部分都有---------------------------
217 1 {
218 2 p=1;
219 2 q=9;
220 2 xs=xsj*(long int)pow(10,9);
221 2 while(xs%10==0)
222 2 {
223 3 xs=xs/10;
224 3 q--;
225 3 } //取小数个数
226 2 p=0;
227 2 for(i=0;i<10;i++)
228 2 {
229 3 m=(long int)pow(10,i); //p整数个数。q小数个数
230 3 if(j/m!=0)
231 3 p=i+1;
232 3 }
233 2 xs=xsj*(long int)pow(10,q);
234 2 for(i=15;i>15-q;i--)
235 2 {
236 3 pbuffer2[i]=xs%10+0x30;
237 3 xs=xs/10;
238 3 }
239 2 pbuffer2[15-q]='.';
240 2 if(jguo<0) pbuffer2[15-q-p-1]='-';
241 2 for(i=15-q-1;i>15-q-p-1;i--)
C51 COMPILER V9.00 LCD1602 12/11/2011 23:03:25 PAGE 5
242 2 {
243 3 pbuffer2[i]=j%10+0x30;
244 3 j=j/10;
245 3 }
246 2 if(q>6)
247 2 {
248 3 n=q-6;
249 3 for(i=0;i<n;i++)
250 3 moveright(2);
251 3 while(pbuffer2[15]==0x30) //小数点后的0不显示
252 3 {
253 4 moveright(2);
254 4 }
255 3 }
256 2 }
257 1 pflag=1; //刷屏标志置1
258 1 }
259 //======================================================
260 //连运算的上下两行显示转换
261 //======================================================
262 void exchangexx(void)
263 {
264 1 uchar i,j;
265 1 j=0;
266 1 while(pbuffer2[j]==0)
267 1 j++;
268 1 for(i=0;i<16;i++)
269 1 {
270 2 if(j<16)
271 2 pbuffer1[i]=pbuffer2[j++];
272 2 else pbuffer1[i]=0;
273 2 }
274 1
275 1 for(i=0;i<16;i++)
276 1 {
277 2 pbuffer2[i]=0;
278 2 }
279 1 pbuffer2[15]=0x30;
280 1 k=0;
281 1 while(pbuffer1[k++]!=0); //取光标位置
282 1 k--;
283 1
284 1 pflag=1; //刷屏标志置1
285 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1544 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 24
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -