📄 t6963c.lst
字号:
236
237 uchar fnST6(void) // 状态位ST6判断(屏读/屏拷贝状态)
C51 COMPILER V6.14 T6963C 07/20/2001 09:36:51 PAGE 5
238 {
239 1 uchar i;
240 1
241 1 for(i=10;i>0;i--)
242 1 {
243 2 if((LCMCW & 0x40) == 0x40)
244 2 break;
245 2 }
246 1 return i; // 若返回零,说明错误
247 1 }
248
249 uchar fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) // 写双参数的指令
250 {
251 1 if(fnST01() == 0)
252 1 return 1;
253 1 LCMDW = uPar1;
254 1 if(fnST01() == 0)
255 1 return 2;
256 1 LCMDW = uPar2;
257 1 if(fnST01() == 0)
258 1 return 3;
259 1 LCMCW = uCmd;
260 1 return 0; // 返回0成功
261 1 }
262
263 uchar fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令
264 {
265 1 if(fnST01() == 0)
266 1 return 1;
267 1 LCMDW = uPar1;
268 1 if(fnST01() == 0)
269 1 return 2;
270 1 LCMCW = uCmd;
271 1 return 0; // 返回0成功
272 1 }
273
274 uchar fnPR12(uchar uCmd) // 写无参数的指令
275 {
276 1 if(fnST01() == 0)
277 1 return 1;
278 1 LCMCW = uCmd;
279 1 return 0; // 返回0成功
280 1 }
281
282 uchar fnPR13(uchar uData) // 写数据
283 {
284 1 if(fnST3() == 0)
285 1 return 1;
286 1 LCMDW = uData;
287 1 return 0; // 返回0成功
288 1 }
289
290 uchar fnPR2(void) // 读数据
291 {
292 1 if(fnST01() == 0)
293 1 return 1;
294 1 return LCMDW;
295 1 }
296
297 // 设置当前地址
298 void fnSetPos(uchar urow, uchar ucol)
299 {
C51 COMPILER V6.14 T6963C 07/20/2001 09:36:51 PAGE 6
300 1 uint iPos;
301 1
302 1 iPos = urow * 30 + ucol;
303 1 fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
304 1 gCurRow = urow;
305 1 gCurCol = ucol;
306 1 }
307
308 // 设置当前显示行、列
309 void cursor(uchar uRow, uchar uCol)
310 {
311 1 fnSetPos(uRow * 16, uCol);
312 1 }
313
314 // 清屏
315 void cls(void)
316 {
317 1 uint i;
318 1
319 1 fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针
320 1 fnPR12(LC_AUT_WR); // 自动写
321 1 for(i=0;i<240*30;i++)
322 1 {
323 2 fnST3();
324 2 fnPR13(0x00); // 写数据
325 2 }
326 1 fnPR12(LC_AUT_OVR); // 自动写结束
327 1 fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
328 1 gCurRow = 0; // 置地址指针存储变量
329 1 gCurCol = 0;
330 1 }
331
332 // LCM 初始化
333 char fnLCMInit(void)
334 {
335 1 if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
336 1 return -1;
337 1 fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
338 1 fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
339 1 fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
340 1 fnPR12(LC_CUR_SHP | 0x01); // 光标形状
341 1 fnPR12(LC_MOD_OR); // 显示方式设置
342 1 fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
343 1
344 1 return 0;
345 1 }
346
347 // ASCII(8*16) 及 汉字(16*16) 显示函数
348 uchar dprintf(char *fmt, ...)
349 {
350 1 va_list arg_ptr;
351 1 char c1,c2,cData;
352 1 char tmpBuf[64]; // LCD显示数据缓冲区
353 1 uchar i=0,j,uLen,uRow,uCol;
354 1 uint k;
355 1
356 1 va_start(arg_ptr, fmt);
357 1 uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr);
358 1 va_end(arg_ptr);
359 1
360 1 while(i<uLen)
361 1 {
C51 COMPILER V6.14 T6963C 07/20/2001 09:36:51 PAGE 7
362 2 c1 = tmpBuf[i];
363 2 c2 = tmpBuf[i+1];
364 2 uRow = fnGetRow();
365 2 uCol = fnGetCol();
366 2 if(c1 >= 0)
367 2 { // ASCII
368 3 if(c1 < 0x20)
369 3 {
370 4 switch(c1)
371 4 {
372 5 case CR:
373 5 case LF: // 回车或换行
374 5 i++;
375 5 if(uRow < 112)
376 5 fnSetPos(uRow+16,0);
377 5 else
378 5 fnSetPos(0,0);
379 5 continue;
380 5 case BS: // 退格
381 5 if(uCol > 0)
382 5 uCol--;
383 5 fnSetPos(uRow,uCol);
384 5 cData = 0x00;
385 5 break;
386 5 default: // 其他
387 5 c1 = 0x1f;
388 5 }
389 4 }
390 3 for(j=0;j<16;j++)
391 3 {
392 4 fnPR12(LC_AUT_WR); // 写数据
393 4 if(c1 >= 0x1f)
394 4 {
395 5 if(j < (16-ASC_CHR_HEIGHT))
396 5 fnPR13(0x00);
397 5 else
398 5 fnPR13(ASC_MSK[(c1-0x1f)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
399 5 }
400 4 else
401 4 fnPR13(cData);
402 4 fnPR12(LC_AUT_OVR);
403 4 fnSetPos(uRow+j+1,uCol);
404 4 }
405 3 if(c1 != BS) // 非退格
406 3 uCol++;
407 3 }
408 2 else
409 2 { // 中文
410 3 for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
411 3 {
412 4 if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
413 4 break;
414 4 }
415 3 for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
416 3 {
417 4 fnSetPos(uRow+k,uCol);
418 4 fnPR12(LC_AUT_WR); // 写数据
419 4 if(j < sizeof(GB_16)/sizeof(GB_16[0]))
420 4 {
421 5 fnPR13(GB_16[j].Msk[k*2]);
422 5 fnPR13(GB_16[j].Msk[k*2+1]);
423 5 }
C51 COMPILER V6.14 T6963C 07/20/2001 09:36:51 PAGE 8
424 4 else // 未找到该字
425 4 {
426 5 if(k < sizeof(GB_16[0].Msk)/4)
427 5 {
428 6 fnPR13(0x00);
429 6 fnPR13(0x00);
430 6 }
431 5 else
432 5 {
433 6 fnPR13(0xff);
434 6 fnPR13(0xff);
435 6 }
436 5 }
437 4 fnPR12(LC_AUT_OVR);
438 4 }
439 3 uCol += 2;
440 3 i++;
441 3 }
442 2 if(uCol >= 30) // 光标后移
443 2 {
444 3 uRow += 16;
445 3 if(uRow < 0x80)
446 3 uCol -= 30;
447 3 else
448 3 {
449 4 uRow = 0;
450 4 uCol = 0;
451 4 }
452 3 }
453 2 fnSetPos(uRow,uCol);
454 2 i++;
455 2 }
456 1 return uLen;
457 1 }
458
459 void main(void) // 测试用
460 {
461 1 fnLCMInit();
462 1 cls();
463 1 cursor(0,0);
464 1 dprintf("%s","This is a test:中文测试");
465 1 }
466
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1118 ----
CONSTANT SIZE = 1187 ----
XDATA SIZE = 138 122
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -