📄 ks0108_12864lcd.lis
字号:
03F0 ;
03F0 ; Char_Length : The Chinese character's length (in pixel)
03F0 ; Char_Amount : The amount of Chinese characters
03F0 ; Start_Char : Which Chinese character should be display first in the array
03F0 ; Char_Gap : The space between on characters to another (in pixel)
03F0 ;
03F0 ; Video_Mode : If Video_Mode == INVERSE(1), inverse video mode
03F0 ; If Video_Mode == NORMAL(0), normal video mode
03F0 ;
03F0 ; -*----------------------------------------------------------------------------*/
03F0 ; static void LCD_Disp_Chinese_String (uInt8 X, uInt8 Y,
03F0 ; uInt8 Char_Length, uInt8 Char_Amount,
03F0 ; uInt8 Start_Char, uInt8 Char_Gap,
03F0 ; flash uInt8 (* pCN_String)[32],
03F0 ; uInt8 Video_Mode)
03F0 ; {
03F0 .dbline 416
03F0 ; uInt8 cl, nm;
03F0 ;
03F0 ; for (nm = 0; nm < Char_Amount; )
03F0 AA24 clr R10
03F2 2FC0 xjmp L77
03F4 L74:
03F4 .dbline 417
03F4 ; {
03F4 .dbline 418
03F4 ; for (cl = 0; cl < Char_Length * 2; cl++) // Send a Chinese character
03F4 6627 clr R22
03F6 23C0 xjmp L81
03F8 L78:
03F8 .dbline 419
03F8 ; {
03F8 .dbline 420
03F8 ; if (cl >= Char_Length)
03F8 6C15 cp R22,R12
03FA 38F0 brlo L82
03FC X20:
03FC .dbline 421
03FC ; {
03FC .dbline 423
03FC ; // Send below part of a Chinese character
03FC ; LCD_Set_XY(X + 1, Y + cl - Char_Length);
03FC 2E2D mov R18,R14
03FE 260F add R18,R22
0400 2C19 sub R18,R12
0402 042F mov R16,R20
0404 0F5F subi R16,255 ; addi 1
0406 88DF xcall _LCD_Set_XY
0408 .dbline 424
0408 ; }
0408 04C0 xjmp L83
040A L82:
040A .dbline 426
040A ; else
040A ; {
040A .dbline 428
040A ; // Set coordinates
040A ; LCD_Set_XY(X, Y + cl);
040A 2E2D mov R18,R14
040C 260F add R18,R22
040E 042F mov R16,R20
0410 83DF xcall _LCD_Set_XY
0412 .dbline 429
0412 ; }
0412 L83:
0412 .dbline 431
0412 ;
0412 ; LCD_Send_Byte(* (* (pCN_String + Start_Char + nm)+ cl),
0412 0D88 ldd R0,y+21
0414 0882 std y+0,R0
0416 21E0 ldi R18,1
0418 80E2 ldi R24,32
041A 0F84 ldd R0,y+15
041C 809D mul R24,R0
041E 1001 movw R2,R0
0420 0B88 ldd R0,y+19
0422 1C88 ldd R1,y+20
0424 200C add R2,R0
0426 311C adc R3,R1
0428 8A9D mul R24,R10
042A 2001 movw R4,R0
042C 420C add R4,R2
042E 531C adc R5,R3
0430 E62F mov R30,R22
0432 FF27 clr R31
0434 E40D add R30,R4
0436 F51D adc R31,R5
0438 0491 lpm R16,Z
043A 4CDF xcall _LCD_Send_Byte
043C .dbline 433
043C ; D_DATA, Video_Mode);
043C ; }
043C L79:
043C .dbline 418
043C 6395 inc R22
043E L81:
043E .dbline 418
043E 2C2C mov R2,R12
0440 220C lsl R2
0442 6215 cp R22,R2
0444 C8F2 brlo L78
0446 X21:
0446 .dbline 434
0446 ; Y = Y + Char_Length + Char_Gap;
0446 2E2C mov R2,R14
0448 2C0C add R2,R12
044A 0988 ldd R0,y+17
044C 200C add R2,R0
044E E22C mov R14,R2
0450 .dbline 435
0450 ; nm++;
0450 A394 inc R10
0452 .dbline 436
0452 ; }
0452 L75:
0452 .dbline 416
0452 L77:
0452 .dbline 416
0452 0D84 ldd R0,y+13
0454 A014 cp R10,R0
0456 70F2 brlo L74
0458 X22:
0458 .dbline -2
0458 L73:
0458 .dbline 0 ; func end
0458 2196 adiw R28,1
045A 0C940000 xjmp pop_xgsetF0FC
045E .dbsym r nm 10 c
045E .dbsym r cl 22 c
045E .dbsym l Video_Mode 21 c
045E .dbsym l pCN_String 19 pA[32:32]kc
045E .dbsym l Char_Gap 17 c
045E .dbsym l Start_Char 15 c
045E .dbsym l Char_Amount 13 c
045E .dbsym r Char_Length 12 c
045E .dbsym r Y 14 c
045E .dbsym r X 20 c
045E .dbend
045E .dbfunc s LCD_Disp_an_Image _LCD_Disp_an_Image fV
045E ; Page -> R20
045E ; pg -> R10
045E ; cl -> R14
045E ; Video_Mode -> y+21
045E ; Pixel_Y -> R12
045E ; Pixel_X -> R10
045E ; pImage -> y+15
045E ; Y -> R22
045E ; X -> y+11
.even
045E _LCD_Disp_an_Image:
045E 0E940000 xcall push_arg4
0462 0E940000 xcall push_xgsetF0FC
0466 622F mov R22,R18
0468 2197 sbiw R28,1
046A A988 ldd R10,y+17
046C CB88 ldd R12,y+19
046E .dbline -1
046E .dbline 462
046E ; }
046E ;
046E ; /*----------------------------------------------------------------------------*-
046E ;
046E ; LCD_Disp_an_Image()
046E ;
046E ; Display an Image on the LCD panel.
046E ;
046E ; Parameters:
046E ; ---------------------------------------------------------------------------
046E ; X, Y : The Image start coordinates on the LCD panel
046E ;
046E ; pImage : Image data pointer (Image stored in Flash area)
046E ;
046E ; pixel_X, pixel_Y : The Image's size
046E ;
046E ; Pixel_X, the height of the Image (in pixel)
046E ; Pixel_Y, the length of the Image (in pixel)
046E ;
046E ; Video_Mode : If Video_Mode == INVERSE(1), inverse video mode
046E ; If Video_Mode == NORMAL(0), normal video mode
046E ;
046E ; -*----------------------------------------------------------------------------*/
046E ; static void LCD_Disp_an_Image(uInt8 X, uInt8 Y, flash uInt8 * pImage,
046E ; uInt8 Pixel_X, uInt8 Pixel_Y, uInt8 Video_Mode)
046E ; {
046E .dbline 468
046E ; uInt8 cl, pg;
046E ; uInt8 Page;
046E ;
046E ; // Figure out needs how many Pages
046E ; // to display the Image
046E ; if (Pixel_X % 8 == 0)
046E 18E0 ldi R17,8
0470 0A2D mov R16,R10
0472 0E940000 xcall mod8u
0476 0023 tst R16
0478 29F4 brne L85
047A X23:
047A .dbline 469
047A ; Page = Pixel_X / 8;
047A 4A2D mov R20,R10
047C 4695 lsr R20
047E 4695 lsr R20
0480 4695 lsr R20
0482 05C0 xjmp L86
0484 L85:
0484 .dbline 471
0484 ; else
0484 ; Page = Pixel_X / 8 + 1;
0484 4A2D mov R20,R10
0486 4695 lsr R20
0488 4695 lsr R20
048A 4695 lsr R20
048C 4F5F subi R20,255 ; addi 1
048E L86:
048E .dbline 474
048E ;
048E ; // Now send the Image
048E ; for (pg = 0; pg < Page; pg++)
048E AA24 clr R10
0490 19C0 xjmp L90
0492 L87:
0492 .dbline 475
0492 ; {
0492 .dbline 477
0492 ; // Send Image data
0492 ; for(cl = 0; cl < Pixel_Y; cl++)
0492 EE24 clr R14
0494 14C0 xjmp L94
0496 L91:
0496 .dbline 478
0496 ; {
0496 .dbline 480
0496 ; // Set coordinates
0496 ; LCD_Set_XY(X + pg, Y + cl);
0496 262F mov R18,R22
0498 2E0D add R18,R14
049A 0B85 ldd R16,y+11
049C 0A0D add R16,R10
049E 3CDF xcall _LCD_Set_XY
04A0 .dbline 482
04A0 ;
04A0 ; LCD_Send_Byte(pImage[cl + Pixel_Y * pg], D_DATA, Video_Mode);
04A0 0D88 ldd R0,y+21
04A2 0882 std y+0,R0
04A4 21E0 ldi R18,1
04A6 CA9C mul R12,R10
04A8 EE2D mov R30,R14
04AA FF27 clr R31
04AC E00D add R30,R0
04AE F11D adc R31,R1
04B0 0F84 ldd R0,y+15
04B2 1888 ldd R1,y+16
04B4 E00D add R30,R0
04B6 F11D adc R31,R1
04B8 0491 lpm R16,Z
04BA 0CDF xcall _LCD_Send_Byte
04BC .dbline 483
04BC ; }
04BC L92:
04BC .dbline 477
04BC E394 inc R14
04BE L94:
04BE .dbline 477
04BE EC14 cp R14,R12
04C0 50F3 brlo L91
04C2 X24:
04C2 .dbline 484
04C2 ; }
04C2 L88:
04C2 .dbline 474
04C2 A394 inc R10
04C4 L90:
04C4 .dbline 474
04C4 A416 cp R10,R20
04C6 28F3 brlo L87
04C8 X25:
04C8 .dbline -2
04C8 L84:
04C8 .dbline 0 ; func end
04C8 2196 adiw R28,1
04CA 0E940000 xcall pop_xgsetF0FC
04CE 2496 adiw R28,4
04D0 0895 ret
04D2 .dbsym r Page 20 c
04D2 .dbsym r pg 10 c
04D2 .dbsym r cl 14 c
04D2 .dbsym l Video_Mode 21 c
04D2 .dbsym r Pixel_Y 12 c
04D2 .dbsym r Pixel_X 10 c
04D2 .dbsym l pImage 15 pkc
04D2 .dbsym r Y 22 c
04D2 .dbsym l X 11 c
04D2 .dbend
04D2 .dbfunc s LCD_Draw_a_Dot _LCD_Draw_a_Dot fV
04D2 ; Page -> R12
04D2 ; Which_Bit_Should_be_Lit -> R10
04D2 ; Video_Mode -> y+7
04D2 ; Y -> R14
04D2 ; X -> R10
.even
04D2 _LCD_Draw_a_Dot:
04D2 0E940000 xcall push_xgset00FC
04D6 E22E mov R14,R18
04D8 A02E mov R10,R16
04DA 2197 sbiw R28,1
04DC .dbline -1
04DC .dbline 501
04DC ; }
04DC ;
04DC ; /*----------------------------------------------------------------------------*-
04DC ;
04DC ; LCD_Draw_a_Dot()
04DC ;
04DC ; Draw a dot (one pixel) on specific location of the LCD panel.
04DC ;
04DC ; Para
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -