📄 pg160128a.lst
字号:
220
221 /******************************* 清屏函数 ********************************/
222 void cls(void) {
223 1 uint i;
224 1 fnPR1(LC_ADD_POS,0x00,0x00); /* 置地址指针 */
225 1 fnPR12(LC_AUT_WR); /* 自动写 */
226 1 for(i=0;i<320*30;i++) {
227 2 fnST3();
228 2 fnPR13(0x00); /* 写数据 */
229 2 }
230 1 fnPR12(LC_AUT_OVR); /* 自动写结束 */
231 1 fnPR1(LC_ADD_POS,0x00,0x00); /* 重置地址指针 */
232 1 gCurRow = 0; /* 置地址指针存储变量 */
233 1 gCurCol = 0;
234 1 }
235
236 /************************** 液晶模块初始化函数 ***************************/
237 char fnLCMInit(void) {
238 1 if(fnPR1(LC_TXT_STP,0x7f,0x1d) != 0) /* 文本显示区首地址 */
239 1 return -1;
240 1 fnPR1(LC_TXT_WID,20,0x00); /* 文本显示区宽度 */
241 1 fnPR1(LC_GRH_STP,0x00,0x00); /* 图形显示区首地址 */
C51 COMPILER V7.06 PG160128A 05/16/2009 11:06:12 PAGE 5
242 1 fnPR1(LC_GRH_WID,20,0x00); /* 图形显示区宽度 */
243 1 fnPR1(LC_CGR_POS,3,0x00); //设置偏置地址0x1c00为字符0x80的地址
244 1 fnPR12(LC_CUR_SHP | 0x01); /* 光标形状 */
245 1 fnPR12(LC_MOD_XOR); /* 显示方式设置 */
246 1 fnPR12(LC_DIS_SW | 0x0c); /* 显示开关设置 */
247 1 return 0;
248 1 }
249
250 /**************** ASCII码(8×16)及汉字(16×16)显示函数 第一页 ******************/
251 uchar dprintf(char *fmt, ...) {
252 1 va_list arg_ptr;
253 1 char c1,c2,cData;
254 1 char tmpBuf[64]; /* LCD显示数据缓冲区 */
255 1 uchar i=0,j,uLen,uRow,uCol;
256 1 uint k;
257 1 va_start(arg_ptr, fmt);
258 1 uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr);
259 1 va_end(arg_ptr);
260 1 while(i<uLen) {
261 2 c1 = tmpBuf[i];
262 2 c2 = tmpBuf[i+1];
263 2 uRow = fnGetRow();
264 2 uCol = fnGetCol();
265 2 if(c1 >= 0) { //* ASCII码
266 3
267 3 if(c1 < 0x20) {
268 4 switch(c1) {
269 5 case CR:
270 5 case LF: i++; // 回车或换行
271 5 if(uRow < 112)
272 5 fnSetPos(uRow+16,0);
273 5 else
274 5 fnSetPos(0,0);
275 5 continue;
276 5 case BS: // 退格
277 5 if(uCol > 0) uCol--;
278 5 fnSetPos(uRow,uCol);
279 5 cData = 0x00;
280 5 break;
281 5 default: // 其他
282 5 c1 = 0x1f;
283 5 }
284 4 }
285 3 for(j=0;j<16;j++) {
286 4 fnPR12(LC_AUT_WR); // 写数据
287 4 if(c1 >= 0x1f) {
288 5
289 5 fnPR13(ASC_MSK[(c1-0x1f-1)*ASC_CHR_HEIGHT+j]);
290 5
291 5 }
292 4 else
293 4 fnPR13(cData);
294 4 fnPR12(LC_AUT_OVR);
295 4 fnSetPos(uRow+j+1,uCol);
296 4 }
297 3 if(c1 != BS) uCol++; /* 非退格 */
298 3 }
299 2 else { /* 中文 */
300 3 for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) {
301 4 if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
302 4 break;
303 4 }
C51 COMPILER V7.06 PG160128A 05/16/2009 11:06:12 PAGE 6
304 3 for(k=0;k<sizeof(GB_16[0].Msk)/2;k++) {
305 4 fnSetPos(uRow+k,uCol);
306 4 fnPR12(LC_AUT_WR); /* 写数据 */
307 4 if(j < sizeof(GB_16)/sizeof(GB_16[0])) {
308 5 fnPR13(GB_16[j].Msk[k*2]);
309 5 fnPR13(GB_16[j].Msk[k*2+1]);
310 5 }
311 4 else { /* 未找到该字 */
312 5 if(k < sizeof(GB_16[0].Msk)/4) {
313 6 fnPR13(0x00);
314 6 fnPR13(0x00);
315 6 }
316 5 else {
317 6 fnPR13(0xff);
318 6 fnPR13(0xff);
319 6 }
320 5 }
321 4 fnPR12(LC_AUT_OVR);
322 4 }
323 3 uCol += 2;
324 3 i++;
325 3 }
326 2 if(uCol >= 30) { /* 光标后移 */
327 3 uRow += 16;
328 3 if(uRow < 0x80) uCol -= 30;
329 3 else {
330 4 uRow = 0;
331 4 uCol = 0;
332 4 }
333 3 }
334 2 fnSetPos(uRow,uCol);
335 2 i++;
336 2 }
337 1 return uLen;
338 1 }
339
340 /**************** ASCII码(8×16)及汉字(16×16)显示函 第二页 ******************/
341 uchar dprintf1(char *fmt, ...) {
342 1 va_list arg_ptr;
343 1 char c1,c2,cData;
344 1 char tmpBuf[64]; /* LCD显示数据缓冲区 */
345 1 uchar i=0,j,uLen,uRow,uCol;
346 1 uint k;
347 1 va_start(arg_ptr, fmt);
348 1 uLen = (uchar)vsprintf(tmpBuf, fmt, arg_ptr);
349 1 va_end(arg_ptr);
350 1 while(i<uLen) {
351 2 c1 = tmpBuf[i];
352 2 c2 = tmpBuf[i+1];
353 2 uRow = fnGetRow();
354 2 uCol = fnGetCol();
355 2 if(c1 >= 0) { //* ASCII码
356 3
357 3 if(c1 < 0x20) {
358 4 switch(c1) {
359 5 case CR:
360 5 case LF: i++; // 回车或换行
361 5 if(uRow < 112)
362 5 fnSetPos1(uRow+16,0);
363 5 else
364 5 fnSetPos1(0,0);
365 5 continue;
C51 COMPILER V7.06 PG160128A 05/16/2009 11:06:12 PAGE 7
366 5 case BS: // 退格
367 5 if(uCol > 0) uCol--;
368 5 fnSetPos1(uRow,uCol);
369 5 cData = 0x00;
370 5 break;
371 5 default: // 其他
372 5 c1 = 0x1f;
373 5 }
374 4 }
375 3 for(j=0;j<16;j++) {
376 4 fnPR12(LC_AUT_WR); // 写数据
377 4 if(c1 >= 0x1f) {
378 5
379 5 fnPR13(ASC_MSK[(c1-0x1f-1)*ASC_CHR_HEIGHT+j]);
380 5
381 5 }
382 4 else
383 4 fnPR13(cData);
384 4 fnPR12(LC_AUT_OVR);
385 4 fnSetPos1(uRow+j+1,uCol);
386 4 }
387 3 if(c1 != BS) uCol++; /* 非退格 */
388 3 }
389 2 else { /* 中文 */
390 3 for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) {
391 4 if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
392 4 break;
393 4 }
394 3 for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
395 3 {
396 4 fnSetPos1(uRow+k,uCol);
397 4 fnPR12(LC_AUT_WR); /* 写数据 */
398 4 if(j < sizeof(GB_16)/sizeof(GB_16[0])) {
399 5 fnPR13(GB_16[j].Msk[k*2]);
400 5 fnPR13(GB_16[j].Msk[k*2+1]);
401 5 }
402 4 else { /* 未找到该字 */
403 5 if(k < sizeof(GB_16[0].Msk)/4) {
404 6 fnPR13(0x00);
405 6 fnPR13(0x00);
406 6 }
407 5 else {
408 6 fnPR13(0xff);
409 6 fnPR13(0xff);
410 6 }
411 5 }
412 4 fnPR12(LC_AUT_OVR);
413 4 }
414 3 uCol += 2;
415 3 i++;
416 3 }
417 2 if(uCol >= 30) { /* 光标后移 */
418 3 uRow += 16;
419 3 if(uRow < 0x80) uCol -= 30;
420 3 else {
421 4 uRow = 0;
422 4 uCol = 0;
423 4 }
424 3 }
425 2 fnSetPos1(uRow,uCol);
426 2 i++;
427 2 }
C51 COMPILER V7.06 PG160128A 05/16/2009 11:06:12 PAGE 8
428 1 return uLen;
429 1 }
430
431 /********************************文本方式下,用指定数据填充字符***********/
432 void cgram80(uchar myc)
433 {
434 1 unsigned int i;
435 1 fnPR1(LC_ADD_POS,0x00,0x1c); /* 置地址指针 */
436 1 fnPR12(LC_AUT_WR); /* 自动写 */
437 1 for(i=0;i<8;i++)
438 1 {
439 2 fnST3();
440 2 fnPR13(myc); /* 写数据 */
441 2 }
442 1 fnPR12(LC_AUT_OVR); /* 自动写结束 */
443 1 fnPR1(LC_ADD_POS,0x00,0x00); /* 重置地址指针 */
444 1 gCurRow = 0; /* 置地址指针存储变量 */
445 1 gCurCol = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -