📄 demo.lst
字号:
212 1 CCW1_PR(O_X,O_Y,num); // 调中文显示函数(文本方式)
213 1 num=0x02; // 取字模
214 1 O_X=0x14;
215 1 O_Y=0x03;
216 1 CCW1_PR(O_X,O_Y,num); // 调中文显示函数(文本方式)
217 1 num=0x03; // 取字模
218 1 O_X=0x16;
219 1 O_Y=0x03;
220 1 CCW1_PR(O_X,O_Y,num); // 调中文显示函数(文本方式)
221 1 */
222 1
223 1
224 1 while(1);
225 1 }
226
227 ///*****************
228 // 初始化函数
229 ///*****************
230 void initial_lcd(void)
231 {
232 1 uchar idata i;
233 1
234 1 LCD_CMD_ADR=0x40; // SYSTEM SET代码
235 1 for(i=0;i<8;i++)
236 1 LCD_DAT_ADR=SYSTAB[i]; // 写入参数
237 1
238 1 LCD_CMD_ADR=0x44; // SCROLL代码
239 1 for(i=0;i<8;i++)
240 1 LCD_DAT_ADR=SCRTAB[i]; // 写入参数
241 1
C51 COMPILER V7.07 DEMO 01/12/2007 17:28:05 PAGE 5
242 1 LCD_CMD_ADR=0x5a; // HDOT SCR 代码
243 1 LCD_DAT_ADR=0x00; // 设置参数P1
244 1
245 1 LCD_CMD_ADR=0x5b; // OVLAY 代码
246 1 LCD_DAT_ADR=0x01; // 设置参数:显示一,三区为文本属性,合成方式为双重异或
247 1
248 1 clear_lcd(); // 调清屏函数
249 1
250 1 LCD_CMD_ADR=0x59; // 显示状态设置
251 1 LCD_DAT_ADR=0x54; // 设置参数:显示一~四区开显示
252 1 }
253
254
255 ///******************
256 // 清屏函数
257 ///******************
258 void clear_lcd(void)
259 {
260 1 uint idata i;
261 1
262 1 LCD_CMD_ADR=0x4c; // CSRDIR 代码
263 1
264 1 LCD_CMD_ADR=0x46; // CSRW 代码
265 1 LCD_DAT_ADR=0x00; // 设置参数光标指针低8位
266 1 LCD_DAT_ADR=0x00; // 设置参数光标指针高8位
267 1
268 1 LCD_CMD_ADR=0x42; // MWRITE 代码
269 1 for(i=0;i<0x8000;i++)
270 1 LCD_DAT_ADR=0x00; // 写入数据
271 1 }
272
273
274 // CGRAM函数
275 // 功能:在文本层显示汉字时使用,每次调用此函数向CGRAM
276 // 中写入一个汉字的点阵数据.调用代码固定为0x80
277 // num: 要显示字符在code uchar CGTAB[i][32] 中i的数值
278 void CGRAM(uint num)
279 {
280 1 uchar idata i;
281 1
282 1 LCD_CMD_ADR=0x5c; // CGRAMADR 代码
283 1 LCD_DAT_ADR=0x00; // 设置SAG=0x3000
284 1 LCD_DAT_ADR=0x30;
285 1
286 1 LCD_CMD_ADR=0x46; // CSRW 代码
287 1 LCD_DAT_ADR=0x00; // 设置CSR=0x3400(字符代码=80H)
288 1 LCD_DAT_ADR=0x34;
289 1
290 1 LCD_CMD_ADR=0x4c; // CSRDIR 代码
291 1 LCD_CMD_ADR=0x42; // MWRITE 代码
292 1
293 1 for(i=0;i<32;i++)
294 1 LCD_DAT_ADR=CGTAB[num][i]; // 写入字模数据
295 1 }
296
297 // 写汉字函数(文本方式)
298 // 经实践证明在文本层写汉字不好用,一次最多写16个汉字,
299 // 所以写汉字一律采用在图形层写
300 // 输入参数: O_X:水平
301 void CCW1_PR(uchar O_X,uchar O_Y,uint num)
302 {
303 1 uint idata j;
C51 COMPILER V7.07 DEMO 01/12/2007 17:28:05 PAGE 6
304 1
305 1 CGRAM(num);
306 1
307 1 j=PARA*O_Y+O_X;
308 1
309 1 LCD_CMD_ADR=0x4f; // CSRDIR 代码(下移)
310 1
311 1 LCD_CMD_ADR=0x46; // CSRW 代码
312 1 LCD_DAT_ADR=(uchar)j; // 设置光标地址
313 1 LCD_DAT_ADR=(uchar)(j>>8);
314 1
315 1 LCD_CMD_ADR=0x42; // MWRITE代码
316 1 LCD_DAT_ADR=0x80; // 写入汉字代码左上部
317 1 LCD_DAT_ADR=0x81; // 写入汉字代码左下部
318 1
319 1 j++;
320 1 LCD_CMD_ADR=0x46; // CSRW 代码
321 1 LCD_DAT_ADR=(uchar)j; // 设置光标地址
322 1 LCD_DAT_ADR=(uchar)(j>>8);
323 1
324 1 LCD_CMD_ADR=0x42; // MWRITE代码
325 1 LCD_DAT_ADR=0x82; // 写入汉字代码右上部
326 1 LCD_DAT_ADR=0x83; // 写入汉字代码右下部
327 1 }
328
329 // 写汉字函数(图形方式)
330 // 输入坐标都是以 8 点阵为增量单位
331 // O_X: 0~38
332 // O_Y: 0~28
333 // num: 要写入字符对应的 CGTAB[num][count1] 的num 值
334 void CCW2_PR(uchar O_X,uchar O_Y,uint num)
335 {
336 1 uchar idata count1;
337 1 uint idata i,j;
338 1
339 1 j=PARA*8*O_Y+O_X;
340 1 j=j+SAD2; // added by gao.
341 1 LCD_CMD_ADR=0x4f; // CSRDIR 代码(下移)
342 1
343 1 for(i=0;i<2;i++)
344 1 {
345 2 LCD_CMD_ADR=0x46; // CSRW 代码
346 2 LCD_DAT_ADR=(uchar)j; // 设置光标地址CSR
347 2 LCD_DAT_ADR=(uchar)(j>>8);
348 2
349 2 LCD_CMD_ADR=0x42; // MWRITE 代码
350 2 for(count1=i*16;count1<16*(i+1);count1++)
351 2 LCD_DAT_ADR=CGTAB[num][count1]; // 写入数据
352 2
353 2 j=j+1;
354 2 }
355 1 }
356
357
358 // 函数功能:在指定坐标位置写入ASCII码字符,
359 // O_X: 0~39
360 // O_Y: 0~29
361 void w_ASCII(uchar O_X,uchar O_Y,uchar num)
362 {
363 1 uint idata j;
364 1
365 1 j=PARA*O_Y+O_X;
C51 COMPILER V7.07 DEMO 01/12/2007 17:28:05 PAGE 7
366 1
367 1 LCD_CMD_ADR=0x46; // CSRW 代码
368 1 LCD_DAT_ADR=(uchar)j; // 设置光标地址CSR
369 1 LCD_DAT_ADR=(uchar)(j>>8);
370 1
371 1 LCD_CMD_ADR=0x4c; // CSRDIR 代码
372 1 LCD_CMD_ADR=0x42; // MWRITE 代码
373 1
374 1 LCD_DAT_ADR=num; // 写入数据
375 1 }
376
377 // 从指定起始点写入字符串(ASCII码)
378 // O_X: 0~39
379 // O_Y: 0~29
380 void w_string(uchar O_X,uchar O_Y,const uchar *STRING)
381 {
382 1 while(*STRING)
383 1 {
384 2 w_ASCII(O_X,O_Y,*STRING);
385 2 STRING++;
386 2 O_X++;
387 2 if(O_X>319)
388 2 {
389 3 O_X=0;
390 3 O_Y+=1;
391 3 }
392 2 }
393 1 }
394
395 // 功能:绘点函数
396 // 输入范围:O_X:0~319; O_Y:0~239;
397 // 说明:坐标定位 左上角为原点(0,0),水平向右为X轴正方向,垂直向下为Y轴正方向
398 void draw_dot(int O_X,uchar O_Y)
399 {
400 1 uchar idata i,j,dat;
401 1 uint idata k;
402 1
403 1 i=((uchar)O_X)&0x07; // i 为O_X 除以 8 的余数
404 1 O_X=O_X>>3; // O_X 为O_X 除以 8 的整数
405 1 k=PARA*O_Y+O_X+SAD2;
406 1
407 1 LCD_CMD_ADR=0x46; // 设置光标地址
408 1 LCD_DAT_ADR=(uchar)k; // 计算光标地址
409 1 LCD_DAT_ADR=(uchar)(k>>8);
410 1
411 1 j=0x80; // 确定要画的点对应的字节数据的值
412 1 if(i!=0)
413 1 j=j>>i;
414 1
415 1 LCD_CMD_ADR=0x43; // MREAD 代码
416 1 dat=LCD_CMD_ADR; // 读取当前显示数据
417 1
418 1 LCD_CMD_ADR=0x46; // 设置光标地址
419 1 LCD_DAT_ADR=(uchar)k; // 计算光标地址
420 1 LCD_DAT_ADR=(uchar)(k>>8);
421 1
422 1 LCD_CMD_ADR=0x42; // MWRITE 代码
423 1 LCD_DAT_ADR=dat|j; // 写入合成数据
424 1 }
425
426 // 函数功能: 画水平线
427 // 纵坐标: 固定为 y
C51 COMPILER V7.07 DEMO 01/12/2007 17:28:05 PAGE 8
428 // x1: 起始横坐标; x2: 终点横坐标
429 void draw_horizontal(int x1,int x2,uchar y)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -