📄 lcd_pcd8544.lss
字号:
4c4: 90 93 5d 02 sts 0x025D, r25
4c8: 80 93 5c 02 sts 0x025C, r24
/* Set update flag to be true */
UpdateLcd = TRUE;
4cc: 81 e0 ldi r24, 0x01 ; 1
4ce: 80 93 5e 02 sts 0x025E, r24
}
4d2: 08 95 ret
000004d4 <LcdGotoXYFont>:
* Argument(s) : x, y -> Coordinate for new cursor position. Range: 1,1 .. 14,6
* Return value : see return value in pcd8544.h
* Note : Based on Sylvain Bissonette's code
*/
byte LcdGotoXYFont ( byte x, byte y )
{
4d4: 98 2f mov r25, r24
/* Boundary check, slow down the speed but will guarantee this code wont fail */
/* Version 0.2.5 - Fixed on Dec 25, 2008 (XMAS) */
if( x > 14)
4d6: 8f 30 cpi r24, 0x0F ; 15
4d8: a0 f4 brcc .+40 ; 0x502 <LcdGotoXYFont+0x2e>
return OUT_OF_BORDER;
if( y > 6)
4da: 67 30 cpi r22, 0x07 ; 7
4dc: 90 f4 brcc .+36 ; 0x502 <LcdGotoXYFont+0x2e>
return OUT_OF_BORDER;
/* Calculate index. It is defined as address within 504 bytes memory */
LcdCacheIdx = ( x - 1 ) * 6 + ( y - 1 ) * 84;
4de: 86 e0 ldi r24, 0x06 ; 6
4e0: 98 9f mul r25, r24
4e2: c0 01 movw r24, r0
4e4: 11 24 eor r1, r1
4e6: 8a 55 subi r24, 0x5A ; 90
4e8: 90 40 sbci r25, 0x00 ; 0
4ea: 24 e5 ldi r18, 0x54 ; 84
4ec: 62 9f mul r22, r18
4ee: 90 01 movw r18, r0
4f0: 11 24 eor r1, r1
4f2: 82 0f add r24, r18
4f4: 93 1f adc r25, r19
4f6: 90 93 59 02 sts 0x0259, r25
4fa: 80 93 58 02 sts 0x0258, r24
4fe: 80 e0 ldi r24, 0x00 ; 0
500: 08 95 ret
return OK;
502: 81 e0 ldi r24, 0x01 ; 1
}
504: 08 95 ret
00000506 <LcdChr>:
* Argument(s) : size -> Font size. See enum in pcd8544.h.
* ch -> Character to write.
* Return value : see pcd8544.h about return value
*/
byte LcdChr ( LcdFontSize size, byte ch )
{
506: bf 92 push r11
508: cf 92 push r12
50a: df 92 push r13
50c: ef 92 push r14
50e: ff 92 push r15
510: 0f 93 push r16
512: 1f 93 push r17
514: cf 93 push r28
516: df 93 push r29
518: 28 2f mov r18, r24
byte i, c;
byte b1, b2;
int tmpIdx;
if ( LcdCacheIdx < LoWaterMark )
51a: a0 91 58 02 lds r26, 0x0258
51e: b0 91 59 02 lds r27, 0x0259
522: 80 91 5a 02 lds r24, 0x025A
526: 90 91 5b 02 lds r25, 0x025B
52a: a8 17 cp r26, r24
52c: b9 07 cpc r27, r25
52e: 24 f4 brge .+8 ; 0x538 <LcdChr+0x32>
{
/* Update low marker. */
LoWaterMark = LcdCacheIdx;
530: b0 93 5b 02 sts 0x025B, r27
534: a0 93 5a 02 sts 0x025A, r26
}
if ( (ch < 0x20) || (ch > 0x7b) )
538: 86 2f mov r24, r22
53a: 80 52 subi r24, 0x20 ; 32
53c: 8c 35 cpi r24, 0x5C ; 92
53e: 08 f0 brcs .+2 ; 0x542 <LcdChr+0x3c>
540: 6c e5 ldi r22, 0x5C ; 92
{
/* Convert to a printable character. */
ch = 92;
}
if ( size == FONT_1X )
542: 21 30 cpi r18, 0x01 ; 1
544: b1 f4 brne .+44 ; 0x572 <LcdChr+0x6c>
{
for ( i = 0; i < 5; i++ )
{
/* Copy lookup table from Flash ROM to LcdCache */
LcdCache[LcdCacheIdx++] = pgm_read_byte(&( FontLookup[ ch - 32 ][ i ] ) ) << 1;
546: 85 e0 ldi r24, 0x05 ; 5
548: 68 9f mul r22, r24
54a: c0 01 movw r24, r0
54c: 11 24 eor r1, r1
54e: fc 01 movw r30, r24
550: e3 57 subi r30, 0x73 ; 115
552: fe 4f sbci r31, 0xFE ; 254
554: ed 01 movw r28, r26
556: c0 5a subi r28, 0xA0 ; 160
558: df 4f sbci r29, 0xFF ; 255
ch = 92;
}
if ( size == FONT_1X )
{
for ( i = 0; i < 5; i++ )
55a: bc 01 movw r22, r24
55c: 6e 56 subi r22, 0x6E ; 110
55e: 7e 4f sbci r23, 0xFE ; 254
{
/* Copy lookup table from Flash ROM to LcdCache */
LcdCache[LcdCacheIdx++] = pgm_read_byte(&( FontLookup[ ch - 32 ][ i ] ) ) << 1;
560: 84 91 lpm r24, Z+
562: 88 0f add r24, r24
564: 89 93 st Y+, r24
566: 31 96 adiw r30, 0x01 ; 1
ch = 92;
}
if ( size == FONT_1X )
{
for ( i = 0; i < 5; i++ )
568: e6 17 cp r30, r22
56a: f7 07 cpc r31, r23
56c: c9 f7 brne .-14 ; 0x560 <LcdChr+0x5a>
56e: 15 96 adiw r26, 0x05 ; 5
570: 95 c0 rjmp .+298 ; 0x69c <LcdChr+0x196>
{
/* Copy lookup table from Flash ROM to LcdCache */
LcdCache[LcdCacheIdx++] = pgm_read_byte(&( FontLookup[ ch - 32 ][ i ] ) ) << 1;
}
}
else if ( size == FONT_2X )
572: 22 30 cpi r18, 0x02 ; 2
574: 09 f0 breq .+2 ; 0x578 <LcdChr+0x72>
576: 96 c0 rjmp .+300 ; 0x6a4 <LcdChr+0x19e>
{
tmpIdx = LcdCacheIdx - 84;
578: 9d 01 movw r18, r26
57a: 24 55 subi r18, 0x54 ; 84
57c: 30 40 sbci r19, 0x00 ; 0
if ( tmpIdx < LoWaterMark )
57e: 80 91 5a 02 lds r24, 0x025A
582: 90 91 5b 02 lds r25, 0x025B
586: 28 17 cp r18, r24
588: 39 07 cpc r19, r25
58a: 24 f4 brge .+8 ; 0x594 <LcdChr+0x8e>
{
LoWaterMark = tmpIdx;
58c: 30 93 5b 02 sts 0x025B, r19
590: 20 93 5a 02 sts 0x025A, r18
}
if ( tmpIdx < 0 ) return OUT_OF_BORDER;
594: 37 ff sbrs r19, 7
596: 02 c0 rjmp .+4 ; 0x59c <LcdChr+0x96>
598: 81 e0 ldi r24, 0x01 ; 1
59a: a8 c0 rjmp .+336 ; 0x6ec <LcdChr+0x1e6>
for ( i = 0; i < 5; i++ )
{
/* Copy lookup table from Flash ROM to temporary c */
c = pgm_read_byte(&(FontLookup[ch - 32][i])) << 1;
59c: 85 e0 ldi r24, 0x05 ; 5
59e: 68 9f mul r22, r24
5a0: c0 01 movw r24, r0
5a2: 11 24 eor r1, r1
5a4: 4d e8 ldi r20, 0x8D ; 141
5a6: e4 2e mov r14, r20
5a8: 41 e0 ldi r20, 0x01 ; 1
5aa: f4 2e mov r15, r20
5ac: e8 0e add r14, r24
5ae: f9 1e adc r15, r25
5b0: 89 01 movw r16, r18
5b2: 00 5a subi r16, 0xA0 ; 160
5b4: 1f 4f sbci r17, 0xFF ; 255
5b6: ed 01 movw r28, r26
5b8: c0 5a subi r28, 0xA0 ; 160
5ba: df 4f sbci r29, 0xFF ; 255
LoWaterMark = tmpIdx;
}
if ( tmpIdx < 0 ) return OUT_OF_BORDER;
for ( i = 0; i < 5; i++ )
5bc: 32 e9 ldi r19, 0x92 ; 146
5be: c3 2e mov r12, r19
5c0: 31 e0 ldi r19, 0x01 ; 1
5c2: d3 2e mov r13, r19
5c4: c8 0e add r12, r24
5c6: d9 1e adc r13, r25
{
/* Copy lookup table from Flash ROM to temporary c */
c = pgm_read_byte(&(FontLookup[ch - 32][i])) << 1;
5c8: f7 01 movw r30, r14
5ca: 64 91 lpm r22, Z+
5cc: 66 0f add r22, r22
/* Enlarge image */
/* First part */
b1 = (c & 0x01) * 3;
5ce: 46 2f mov r20, r22
5d0: 50 e0 ldi r21, 0x00 ; 0
b1 |= (c & 0x02) * 6;
b1 |= (c & 0x04) * 12;
b1 |= (c & 0x08) * 24;
5d2: ca 01 movw r24, r20
5d4: 84 70 andi r24, 0x04 ; 4
5d6: 90 70 andi r25, 0x00 ; 0
5d8: fc 01 movw r30, r24
5da: ee 0f add r30, r30
5dc: ff 1f adc r31, r31
5de: e8 0f add r30, r24
5e0: f9 1f adc r31, r25
5e2: ee 0f add r30, r30
5e4: ff 1f adc r31, r31
5e6: ee 0f add r30, r30
5e8: ff 1f adc r31, r31
5ea: 9a 01 movw r18, r20
5ec: 22 70 andi r18, 0x02 ; 2
5ee: 30 70 andi r19, 0x00 ; 0
5f0: c9 01 movw r24, r18
5f2: 88 0f add r24, r24
5f4: 99 1f adc r25, r25
5f6: 82 0f add r24, r18
5f8: 93 1f adc r25, r19
5fa: 88 0f add r24, r24
5fc: 99 1f adc r25, r25
5fe: be 2e mov r11, r30
600: b8 2a or r11, r24
602: 48 70 andi r20, 0x08 ; 8
604: 50 70 andi r21, 0x00 ; 0
606: ca 01 movw r24, r20
608: 88 0f add r24, r24
60a: 99 1f adc r25, r25
60c: 84 0f add r24, r20
60e: 95 1f adc r25, r21
610: 73 e0 ldi r23, 0x03 ; 3
612: 88 0f add r24, r24
614: 99 1f adc r25, r25
616: 7a 95 dec r23
618: e1 f7 brne .-8 ; 0x612 <LcdChr+0x10c>
61a: b8 2a or r11, r24
c >>= 4;
/* Second part */
b2 = (c & 0x01) * 3;
61c: 62 95 swap r22
61e: 6f 70 andi r22, 0x0F ; 15
620: 70 e0 ldi r23, 0x00 ; 0
b2 |= (c & 0x02) * 6;
b2 |= (c & 0x04) * 12;
b2 |= (c & 0x08) * 24;
622: cb 01 movw r24, r22
624: 84 70 andi r24, 0x04 ; 4
626: 90 70 andi r25, 0x00 ; 0
628: 9c 01 movw r18, r24
62a: 22 0f add r18, r18
62c: 33 1f adc r19, r19
62e: 28 0f add r18, r24
630: 39 1f adc r19, r25
632: 22 0f add r18, r18
634: 33 1f adc r19, r19
636: 22 0f add r18, r18
638: 33 1f adc r19, r19
63a: ab 01 movw r20, r22
63c: 42 70 andi r20, 0x02 ; 2
63e: 50 70 andi r21, 0x00 ; 0
640: ca 01 movw r24, r20
642: 88 0f add r24, r24
644: 99 1f adc r25, r25
646: 84 0f add r24, r20
648: 95 1f adc r25, r21
64a: 88 0f add r24, r24
64c: 99 1f adc r25, r25
64e: 28 2b or r18, r24
650: ab 01 movw r20, r22
652: 48 70 andi r20, 0x08 ; 8
654: 50 70 andi r21, 0x00 ; 0
656: ca 01 movw r24, r20
658: 88 0f add r24, r24
65a: 99 1f adc r25, r25
65c: 84 0f add r24, r20
65e: 95 1f adc r25, r21
660: 43 e0 ldi r20, 0x03 ; 3
662: 88 0f add r24, r24
664: 99 1f adc r25, r25
666: 4a 95 dec r20
668: e1 f7 brne .-8 ; 0x662 <LcdChr+0x15c>
66a: 28 2b or r18, r24
66c: 61 70 andi r22, 0x01 ; 1
66e: 70 70 andi r23, 0x00 ; 0
670: cb 01 movw r24, r22
672: 88 0f add r24, r24
674: 99 1f adc r25, r25
676: 86 0f add r24, r22
678: 97 1f adc r25, r23
67a: 28 2b or r18, r24
/* Copy two parts into LcdCache */
LcdCache[tmpIdx++] = b1;
67c: f8 01 movw r30, r16
67e: b0 82 st Z, r11
LcdCache[tmpIdx++] = b1;
680: b1 82 std Z+1, r11 ; 0x01
LcdCache[tmpIdx + 82] = b2;
682: 28 83 st Y, r18
LcdCache[tmpIdx + 83] = b2;
684: 29 83 std Y+1, r18 ; 0x01
686: 08 94 sec
688: e1 1c adc r14, r1
68a: f1 1c adc r15, r1
68c: 0e 5f subi r16, 0xFE ; 254
68e: 1f 4f sbci r17, 0xFF ; 255
690: 22 96 adiw r28, 0x02 ; 2
LoWaterMark = tmpIdx;
}
if ( tmpIdx < 0 ) return OUT_OF_BORDER;
for ( i = 0; i < 5; i++ )
692: ec 14 cp r14, r12
694: fd 04 cpc r15, r13
696: 09 f0 breq .+2 ; 0x69a <LcdChr+0x194>
698: 97 cf rjmp .-210 ; 0x5c8 <LcdChr+0xc2>
LcdCache[tmpIdx + 82] = b2;
LcdCache[tmpIdx + 83] = b2;
}
/* Update x cursor position. */
LcdCacheIdx += 11;
69a: 1b 96 adiw r26, 0x0b ; 11
69c: b0 93 59 02 sts 0x0259, r27
6a0: a0 93 58 02 sts 0x0258, r26
}
if ( LcdCacheIdx > HiWaterMark )
6a4: 20 91 58 02 lds r18, 0x0258
6a8: 30 91 59 02 lds r19, 0x0259
6ac: 80 91 5c 02 lds r24, 0x025C
6b0: 90 91 5d 02 lds r25, 0x025D
6b4: 82 17 cp r24, r18
6b6: 93 07 cpc r25, r19
6b8: 24 f4 brge .+8 ; 0x6c2 <LcdChr+0x1bc>
{
/* Update high marker. */
HiWaterMark = LcdCacheIdx;
6ba: 30 93 5d 02 sts 0x025D, r19
6be: 20 93 5c 02 sts 0x025C, r18
}
/* Horizontal gap between characters. */
/* Version 0.2.5 - Possible bug fix (Dec 25,2008 XMAS): reported by starlino */
LcdCache[LcdCacheIdx] = 0x00;
6c2: f9 01 movw r30, r18
6c4: e0 5a subi r30, 0xA0 ; 160
6c6: ff 4f sbci r31, 0xFF ; 255
6c8: 10 82 st Z, r1
/* At index number LCD_CACHE_SIZE - 1, wrap to 0 */
if(LcdCacheIdx == (LCD_CACHE_SIZE - 1) )
6ca: f1 e0 ldi r31, 0x01 ; 1
6cc: 27 3f cpi r18, 0xF7 ; 247
6ce: 3f 07 cpc r19, r31
6d0: 31 f4 brne .+12 ; 0x6de <LcdChr+0x1d8>
{
LcdCacheIdx = 0;
6d2: 10 92 59 02 sts 0x0259, r1
6d6: 10 92 58 02 sts 0x0258, r1
6da: 82 e0 ldi r24, 0x02 ; 2
6dc: 07 c0 rjmp .+14 ; 0x6ec <LcdChr+0x1e6>
return OK_WITH_WRAP;
}
/* Otherwise just increment the index */
LcdCacheIdx++;
6de: 2f 5f subi r18, 0xFF ; 255
6e0: 3f 4f sbci r19, 0xFF ; 255
6e2: 30 93 59 02 sts 0x0259, r19
6e6: 20 93 58 02 sts 0x0258, r18
6ea: 80 e0 ldi r24, 0x00 ; 0
return OK;
}
6ec: df 91 pop r29
6ee: cf 91 pop r28
6f0: 1f 91 pop r17
6f2: 0f 91 pop r16
6f4: ff 90 pop r15
6f6: ef 90 pop r14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -