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