📄 5.2.3-1.lst
字号:
216 2 Wrdata(cbyte); /*写输出一字节*/
217 2 x++;
218 2 col++;
219 2 if (col==LCMLIMIT){col=0;row++;row++;}; /*下一列,如果列越界换行*/
220 2 if (row>7) row=0; /*如果行越界,返回首行*/
221 2 } /*上半个字符输出结束*/
222 1 col = bakerx; /*列对齐*/
223 1 row = bakery+1; /*指向下半个字符行*/
224 1 /*下半个字符输出,8列*/
225 1 for(i=0;i<8;i++)
226 1 {
227 2 cbyte = Ezk[x]; /*取点阵码*/
228 2 Wrdata(cbyte); /*写输出一字节*/
229 2 x++;
230 2 col++;
231 2 if (col==LCMLIMIT){col=0;row=row+2;}; /*下一列,如果列越界换行*/
232 2 if (row>7) row=1; /*如果行越界,返回首行*/
233 2 } /*下半个字符输出结束*/
234 1 row=bakery;
235 1 } /*整个字符输出结束*/
236
237 /*********************************全角字符点阵码数据输出********************************/
238 void Putcdot(Uchar Order)
239 {
240 1 Uchar i,bakerx,bakery; /*共定义3个局部变量*/
241 1 int x; /*偏移量,字符量少的可以定义为UCHAR */
C51 COMPILER V6.20c 5_2_3_1 09/02/2001 14:49:03 PAGE 5
242 1 bakerx = col; /*暂存x,y坐标,已备下半个字符使用*/
243 1 bakery = row;
244 1 x=Order * 0x20; /*每个字符32字节*/
245 1 /*上半个字符输出,16列*/
246 1 for(i=0;i<16;i++)
247 1 {
248 2 Wrdata(Hzk[x]); /*写输出一字节*/
249 2 x++;
250 2 col++;
251 2 if (col==LCMLIMIT){ col=0;row++;row++;} /*下一列,如果列越界换行*/
252 2 if (row>6) row=0; /*如果行越界,返回首行*/
253 2 } /*上半个字符输出结束*/
254 1 /*下半个字符输出,16列 */
255 1 col = bakerx;
256 1 row = bakery+1;
257 1 for(i=0;i<16;i++) /*下半部分*/
258 1 {
259 2 Wrdata(Hzk[x]);
260 2 x++;
261 2 col++;
262 2 if (col==LCMLIMIT){col=0;row++;row++;} /*下一列,如果列越界换行*/
263 2 if (row>7) row=1; /*如果行越界,返回首行*/
264 2 } /*下半个字符输出结束*/
265 1 row = bakery;
266 1 } /*整个字符输出结束*/
267
268 /************************************清屏,全屏幕清零***********************************/
269 void Lcmcls( void )
270 {
271 1 for(row=0;row<8;row++)
272 1 for(col=0;col<LCMLIMIT;col++) Wrdata(0);
273 1 }
274
275 /***************************从液晶片上读数据,保留在全局变量中***************************/
276 void Rddata(void)
277 {
278 1 Locatexy(); /*坐标定位,返回时保留分区状态不变*/
279 1 Datalcm=0xFF;
280 1 Dilcm = 1; /*数据*/
281 1 Rwlcm = 1; /*读数据*/
282 1 Elcm = 1; /*读入到LCM*/
283 1 _nop_();
284 1 cbyte = Datalcm; /*虚读一次*/
285 1 Elcm = 0;
286 1 Locatexy(); /*坐标定位,返回时保留分区状态不变*/
287 1 Datalcm=0xFF;
288 1 _nop_();
289 1 Dilcm = 1; /*数据*/
290 1 Rwlcm = 1; /*读数据*/
291 1 Elcm = 1; /*读入到LCM*/
292 1 _nop_();
293 1 cbyte = Datalcm; /*从数据口读数据,真读*/
294 1 Elcm = 0;
295 1 }
296
297 /*************************************数据写输出/**************************************/
298 void Wrdata(Uchar X)
299 {
300 1 Locatexy(); /*坐标定位,返回时保留分区状态不变*/
301 1 Dilcm = 1; /*数据输出*/
302 1 Rwlcm = 0; /*写输出*/
303 1 Datalcm = X; /*数据输出到数据口*/
C51 COMPILER V6.20c 5_2_3_1 09/02/2001 14:49:03 PAGE 6
304 1 Elcm = 1; /*读入到LCM*/
305 1 _nop_();
306 1 Elcm = 0;
307 1 }
308
309 /*********************************命令输出到左区控制口*********************************/
310 void WrcmdL(Uchar X)
311 {
312 1 lcdbusyL(); /*确定分区,返回时保留分区状态不变*/
313 1 Dilcm = 0; /*命令操作*/
314 1 Rwlcm = 0; /*写输出*/
315 1 Datalcm = X; /*数据输出到数据口*/
316 1 Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
317 1 }
318
319 /********************************命令输出到中区控制口********************************/
320 void WrcmdM(Uchar X)
321 {
322 1 lcdbusyM(); /*确定分区,返回时保留分区状态不变*/
323 1 Dilcm = 0; /*命令操作*/
324 1 Rwlcm = 0; /*写输出*/
325 1 Datalcm = X; /*命令输出到数据口*/
326 1 Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
327 1 }
328
329 /*********************************命令输出到右区控制口********************************/
330 void WrcmdR(Uchar X)
331 {
332 1 lcdbusyR(); /*确定分区,返回时保留分区状态不变*/
333 1 Dilcm = 0; /*命令操作*/
334 1 Rwlcm = 0; /*写输出*/
335 1 Datalcm = X; /*命令输出到数据口*/
336 1 Elcm = 1;_nop_();Elcm = 0; /*读入到LCM*/
337 1 }
338
339 /************************分区操作允许等待,返回时保留分区选择状态*************************/
340 void lcdbusyL(void)
341 {
342 1 CSALCM = 0; CSBLCM = 0; /*清零CSA,CSB,选择左区*/
343 1 wtcom(); /*等待使能*/
344 1 }
345 void lcdbusyM(void)
346 {
347 1 CSALCM = 0; CSBLCM =1; /*置CSA为0,CSB为1,选择中区*/
348 1 wtcom(); /*等待使能*/
349 1 }
350 void lcdbusyR(void)
351 {
352 1 CSALCM = 1; CSBLCM = 0; /*置CSA为1,CSB为0,选择右区*/
353 1 wtcom(); /*等待使能*/
354 1 }
355 void wtcom(void)
356 {
357 1 Dilcm = 0; /*清零DI*/
358 1 Rwlcm = 1; /*置RW为1*/
359 1 Datalcm = 0xFF;
360 1 Elcm = 1;_nop_();
361 1 while(Datalcm & Lcdbusy);
362 1 Elcm = 0;
363 1 }
364
365 /******************根据设定的坐标数据,定位LCM上的下一个操作单元位置******************/
C51 COMPILER V6.20c 5_2_3_1 09/02/2001 14:49:03 PAGE 7
366 void Locatexy(void)
367 {
368 1 unsigned char x,y;
369 1 switch (col&0xc0) /* col与0xC0*/
370 1 { /*条件分支执行 */
371 2 case 0: {lcdbusyL();break;} /*左区*/
372 2 case 0x40: {lcdbusyM();break;} /*中区*/
373 2 case 0x80: {lcdbusyR();break;} /*右区*/
374 2 }
375 1 x = col&0x3F|SETX; /*col.and.0x3f.or.setx*/
376 1 y = row&0x07|SETY; /*row.and.0x07.or.sety*/
377 1 wtcom(); /*等待使能*/
378 1 Dilcm = 0; /*清零DI */
379 1 Rwlcm = 0; /*清零RW*/
380 1 Datalcm = y; /*MOV P0,Y */
381 1 Elcm = 1;_nop_();Elcm = 0;
382 1 wtcom(); /*等待使能*/
383 1 Dilcm = 0; /*清零DI*/
384 1 Rwlcm = 0; /*清零RW*/
385 1 Datalcm = x; /*MOV P0,X*/
386 1 Elcm = 1;_nop_();Elcm = 0;
387 1 }
388
389 /*************************************液晶屏初始化**************************************/
390 void Lcminit(void)
391 {
392 1 cbyte = DISPOFF; /*关闭显示屏*/
393 1 WrcmdL(cbyte);
394 1 WrcmdM(cbyte);
395 1 WrcmdR(cbyte);
396 1 cbyte = DISPON; /*打开显示屏*/
397 1 WrcmdL(cbyte);
398 1 WrcmdM(cbyte);
399 1 WrcmdR(cbyte);
400 1 cbyte = DISPFIRST; /*定义显示起始行为零*/
401 1 WrcmdL(cbyte);
402 1 WrcmdM(cbyte);
403 1 WrcmdR(cbyte);
404 1 Lcmcls();
405 1 col=0; /*清屏*/
406 1 row=0;
407 1 Locatexy();
408 1 }
409 /****************************************延时*******************************************/
410 void Delay(Uchar MS)
411 {
412 1 Uchar us,usn;
413 1 while(MS!=0)
414 1 { usn = 4;
415 2 while(usn!=0)
416 2 {
417 3 us=0xf0;
418 3 while (us!=0){us--;};
419 3 usn--;
420 3 }
421 2 MS--;
422 2 }
423 1 }
424
425 /************************************定义字符串数组*************************************/
426 Uchar code STR1[]="China Mobile";
427 Uchar code STR2[]="Communications";
C51 COMPILER V6.20c 5_2_3_1 09/02/2001 14:49:03 PAGE 8
428 Uchar code STR3[]="Corporation";
429 Uchar code STR4[]="Welcome you!";
430
431 /************************************定义中文字库***************************************/
432 Uchar code Hzk[]={
433 0x00,0xF8,0x08,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0x08,0xFC,0x08,0x00, /*中*/
434 0x00, 0x03,0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00,
435 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0xCA,0x8E,0x0A,0x02,0xFF,0x02,0x00,/*国*/
436 0x00,0xFF,0x40,0x50,0x50,0x50,0x50,0x5F,0x50,0x52,0x54,0x50,0x40,0xFF,0x00,0x00,
437 0x24,0x24,0xA4,0xFE,0xA3,0x22,0x10,0x88,0x8C,0x57,0xE4,0x24,0x14,0x0C,0x00,0x00, /*移*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -