📄 lcd_pcd8544.lss
字号:
6f8: df 90 pop r13
6fa: cf 90 pop r12
6fc: bf 90 pop r11
6fe: 08 95 ret
00000700 <LcdStr>:
* dataArray -> Array contained string of char to be written
* into cache.
* Return value : see return value on pcd8544.h
*/
byte LcdStr ( LcdFontSize size, byte dataArray[] )
{
700: 0f 93 push r16
702: 1f 93 push r17
704: cf 93 push r28
706: df 93 push r29
708: 08 2f mov r16, r24
70a: eb 01 movw r28, r22
70c: 10 e0 ldi r17, 0x00 ; 0
70e: 05 c0 rjmp .+10 ; 0x71a <LcdStr+0x1a>
byte tmpIdx=0;
byte response;
while( dataArray[ tmpIdx ] != '\0' )
{
/* Send char */
response = LcdChr( size, dataArray[ tmpIdx ] );
710: 80 2f mov r24, r16
712: f9 de rcall .-526 ; 0x506 <LcdChr>
if( response == OUT_OF_BORDER)
714: 81 30 cpi r24, 0x01 ; 1
716: 41 f0 breq .+16 ; 0x728 <LcdStr+0x28>
return OUT_OF_BORDER;
/* Increase index */
tmpIdx++;
718: 1f 5f subi r17, 0xFF ; 255
*/
byte LcdStr ( LcdFontSize size, byte dataArray[] )
{
byte tmpIdx=0;
byte response;
while( dataArray[ tmpIdx ] != '\0' )
71a: fe 01 movw r30, r28
71c: e1 0f add r30, r17
71e: f1 1d adc r31, r1
720: 60 81 ld r22, Z
722: 66 23 and r22, r22
724: a9 f7 brne .-22 ; 0x710 <LcdStr+0x10>
726: 80 e0 ldi r24, 0x00 ; 0
return OUT_OF_BORDER;
/* Increase index */
tmpIdx++;
}
return OK;
}
728: df 91 pop r29
72a: cf 91 pop r28
72c: 1f 91 pop r17
72e: 0f 91 pop r16
730: 08 95 ret
00000732 <LcdFStr>:
* Return value : see return value on pcd8544.h
* Example : LcdFStr(FONT_1X, PSTR("Hello World"));
* LcdFStr(FONT_1X, &name_of_string_as_array);
*/
byte LcdFStr ( LcdFontSize size, const byte *dataPtr )
{
732: 1f 93 push r17
734: cf 93 push r28
736: df 93 push r29
738: 18 2f mov r17, r24
73a: eb 01 movw r28, r22
byte c;
byte response;
for ( c = pgm_read_byte( dataPtr ); c; ++dataPtr, c = pgm_read_byte( dataPtr ) )
73c: fb 01 movw r30, r22
73e: 64 91 lpm r22, Z+
740: 07 c0 rjmp .+14 ; 0x750 <LcdFStr+0x1e>
{
/* Put char */
response = LcdChr( size, c );
742: 81 2f mov r24, r17
744: e0 de rcall .-576 ; 0x506 <LcdChr>
if(response == OUT_OF_BORDER)
746: 81 30 cpi r24, 0x01 ; 1
748: 29 f0 breq .+10 ; 0x754 <LcdFStr+0x22>
*/
byte LcdFStr ( LcdFontSize size, const byte *dataPtr )
{
byte c;
byte response;
for ( c = pgm_read_byte( dataPtr ); c; ++dataPtr, c = pgm_read_byte( dataPtr ) )
74a: 21 96 adiw r28, 0x01 ; 1
74c: fe 01 movw r30, r28
74e: 64 91 lpm r22, Z+
750: 66 23 and r22, r22
752: b9 f7 brne .-18 ; 0x742 <LcdFStr+0x10>
response = LcdChr( size, c );
if(response == OUT_OF_BORDER)
return OUT_OF_BORDER;
}
}
754: df 91 pop r29
756: cf 91 pop r28
758: 1f 91 pop r17
75a: 08 95 ret
0000075c <LcdPixel>:
* mode -> Off, On or Xor. See enum in pcd8544.h.
* Return value : see return value on pcd8544.h
* Note : Based on Sylvain Bissonette's code
*/
byte LcdPixel ( byte x, byte y, LcdPixelMode mode )
{
75c: 58 2f mov r21, r24
word index;
byte offset;
byte data;
/* Prevent from getting out of border */
if ( x > LCD_X_RES ) return OUT_OF_BORDER;
75e: 85 35 cpi r24, 0x55 ; 85
760: 08 f0 brcs .+2 ; 0x764 <LcdPixel+0x8>
762: 5a c0 rjmp .+180 ; 0x818 <LcdPixel+0xbc>
if ( y > LCD_Y_RES ) return OUT_OF_BORDER;
764: 61 33 cpi r22, 0x31 ; 49
766: 08 f0 brcs .+2 ; 0x76a <LcdPixel+0xe>
768: 57 c0 rjmp .+174 ; 0x818 <LcdPixel+0xbc>
/* Recalculating index and offset */
index = ( ( y / 8 ) * 84 ) + x;
76a: 86 2f mov r24, r22
76c: 86 95 lsr r24
76e: 86 95 lsr r24
770: 86 95 lsr r24
772: 90 e0 ldi r25, 0x00 ; 0
774: 24 e5 ldi r18, 0x54 ; 84
776: 30 e0 ldi r19, 0x00 ; 0
778: 82 9f mul r24, r18
77a: d0 01 movw r26, r0
77c: 83 9f mul r24, r19
77e: b0 0d add r27, r0
780: 92 9f mul r25, r18
782: b0 0d add r27, r0
784: 11 24 eor r1, r1
786: a5 0f add r26, r21
788: b1 1d adc r27, r1
offset = y - ( ( y / 8 ) * 8 );
78a: 53 e0 ldi r21, 0x03 ; 3
78c: 88 0f add r24, r24
78e: 99 1f adc r25, r25
790: 5a 95 dec r21
792: e1 f7 brne .-8 ; 0x78c <LcdPixel+0x30>
794: 68 1b sub r22, r24
data = LcdCache[ index ];
796: fd 01 movw r30, r26
798: e0 5a subi r30, 0xA0 ; 160
79a: ff 4f sbci r31, 0xFF ; 255
79c: 20 81 ld r18, Z
/* Bit processing */
/* Clear mode */
if ( mode == PIXEL_OFF )
79e: 44 23 and r20, r20
7a0: 51 f4 brne .+20 ; 0x7b6 <LcdPixel+0x5a>
{
data &= ( ~( 0x01 << offset ) );
7a2: 81 e0 ldi r24, 0x01 ; 1
7a4: 90 e0 ldi r25, 0x00 ; 0
7a6: 02 c0 rjmp .+4 ; 0x7ac <LcdPixel+0x50>
7a8: 88 0f add r24, r24
7aa: 99 1f adc r25, r25
7ac: 6a 95 dec r22
7ae: e2 f7 brpl .-8 ; 0x7a8 <LcdPixel+0x4c>
7b0: 80 95 com r24
7b2: 28 23 and r18, r24
7b4: 15 c0 rjmp .+42 ; 0x7e0 <LcdPixel+0x84>
}
/* On mode */
else if ( mode == PIXEL_ON )
7b6: 41 30 cpi r20, 0x01 ; 1
7b8: 49 f4 brne .+18 ; 0x7cc <LcdPixel+0x70>
{
data |= ( 0x01 << offset );
7ba: 81 e0 ldi r24, 0x01 ; 1
7bc: 90 e0 ldi r25, 0x00 ; 0
7be: 02 c0 rjmp .+4 ; 0x7c4 <LcdPixel+0x68>
7c0: 88 0f add r24, r24
7c2: 99 1f adc r25, r25
7c4: 6a 95 dec r22
7c6: e2 f7 brpl .-8 ; 0x7c0 <LcdPixel+0x64>
7c8: 28 2b or r18, r24
7ca: 0a c0 rjmp .+20 ; 0x7e0 <LcdPixel+0x84>
}
/* Xor mode */
else if ( mode == PIXEL_XOR )
7cc: 42 30 cpi r20, 0x02 ; 2
7ce: 41 f4 brne .+16 ; 0x7e0 <LcdPixel+0x84>
{
data ^= ( 0x01 << offset );
7d0: 81 e0 ldi r24, 0x01 ; 1
7d2: 90 e0 ldi r25, 0x00 ; 0
7d4: 02 c0 rjmp .+4 ; 0x7da <LcdPixel+0x7e>
7d6: 88 0f add r24, r24
7d8: 99 1f adc r25, r25
7da: 6a 95 dec r22
7dc: e2 f7 brpl .-8 ; 0x7d6 <LcdPixel+0x7a>
7de: 28 27 eor r18, r24
}
/* Final result copied to cache */
LcdCache[ index ] = data;
7e0: fd 01 movw r30, r26
7e2: e0 5a subi r30, 0xA0 ; 160
7e4: ff 4f sbci r31, 0xFF ; 255
7e6: 20 83 st Z, r18
if ( index < LoWaterMark )
7e8: 80 91 5a 02 lds r24, 0x025A
7ec: 90 91 5b 02 lds r25, 0x025B
7f0: a8 17 cp r26, r24
7f2: b9 07 cpc r27, r25
7f4: 20 f4 brcc .+8 ; 0x7fe <LcdPixel+0xa2>
{
/* Update low marker. */
LoWaterMark = index;
7f6: b0 93 5b 02 sts 0x025B, r27
7fa: a0 93 5a 02 sts 0x025A, r26
}
if ( index > HiWaterMark )
7fe: 80 91 5c 02 lds r24, 0x025C
802: 90 91 5d 02 lds r25, 0x025D
806: 8a 17 cp r24, r26
808: 9b 07 cpc r25, r27
80a: 20 f4 brcc .+8 ; 0x814 <LcdPixel+0xb8>
{
/* Update high marker. */
HiWaterMark = index;
80c: b0 93 5d 02 sts 0x025D, r27
810: a0 93 5c 02 sts 0x025C, r26
814: 80 e0 ldi r24, 0x00 ; 0
816: 08 95 ret
818: 81 e0 ldi r24, 0x01 ; 1
}
return OK;
}
81a: 08 95 ret
0000081c <LcdLine>:
* x2, y2 -> Absolute pixel coordinates for line end.
* mode -> Off, On or Xor. See enum in pcd8544.h.
* Return value : see return value on pcd8544.h
*/
byte LcdLine ( byte x1, byte x2, byte y1, byte y2, LcdPixelMode mode )
{
81c: 5f 92 push r5
81e: 6f 92 push r6
820: 7f 92 push r7
822: 8f 92 push r8
824: 9f 92 push r9
826: af 92 push r10
828: bf 92 push r11
82a: cf 92 push r12
82c: df 92 push r13
82e: ef 92 push r14
830: ff 92 push r15
832: 0f 93 push r16
834: 1f 93 push r17
836: cf 93 push r28
838: df 93 push r29
83a: c8 2e mov r12, r24
83c: 56 2e mov r5, r22
83e: d4 2e mov r13, r20
840: 62 2e mov r6, r18
842: 70 2e mov r7, r16
/* dy y2 - y1 */
/* -- = ------- */
/* dx x2 - x1 */
/* Take differences */
dy = y2 - y1;
844: 02 2f mov r16, r18
846: 10 e0 ldi r17, 0x00 ; 0
848: 04 1b sub r16, r20
84a: 11 09 sbc r17, r1
dx = x2 - x1;
84c: c6 2f mov r28, r22
84e: d0 e0 ldi r29, 0x00 ; 0
850: c8 1b sub r28, r24
852: d1 09 sbc r29, r1
/* dy is negative */
if ( dy < 0 )
854: 17 fd sbrc r17, 7
856: 04 c0 rjmp .+8 ; 0x860 <LcdLine+0x44>
858: b1 e0 ldi r27, 0x01 ; 1
85a: 8b 2e mov r8, r27
85c: 91 2c mov r9, r1
85e: 06 c0 rjmp .+12 ; 0x86c <LcdLine+0x50>
{
dy = -dy;
860: 10 95 com r17
862: 01 95 neg r16
864: 1f 4f sbci r17, 0xFF ; 255
866: 88 24 eor r8, r8
868: 8a 94 dec r8
86a: 98 2c mov r9, r8
{
stepy = 1;
}
/* dx is negative */
if ( dx < 0 )
86c: d7 fd sbrc r29, 7
86e: 04 c0 rjmp .+8 ; 0x878 <LcdLine+0x5c>
870: a1 e0 ldi r26, 0x01 ; 1
872: aa 2e mov r10, r26
874: b1 2c mov r11, r1
876: 06 c0 rjmp .+12 ; 0x884 <LcdLine+0x68>
{
dx = -dx;
878: d0 95 com r29
87a: c1 95 neg r28
87c: df 4f sbci r29, 0xFF ; 255
87e: aa 24 eor r10, r10
880: aa 94 dec r10
882: ba 2c mov r11, r10
dx <<= 1;
dy <<= 1;
/* Draw initial position */
response = LcdPixel( x1, y1, mode );
884: 47 2d mov r20, r7
886: 6d 2d mov r22, r13
888: 8c 2d mov r24, r12
88a: 68 df rcall .-304 ; 0x75c <LcdPixel>
if(response)
88c: 88 23 and r24, r24
88e: d9 f5 brne .+118 ; 0x906 <LcdLine+0xea>
else
{
stepx = 1;
}
dx <<= 1;
890: 7e 01 movw r14, r28
892: ee 0c add r14, r14
894: ff 1c adc r15, r15
dy <<= 1;
896: 00 0f add r16, r16
898: 11 1f adc r17, r17
response = LcdPixel( x1, y1, mode );
if(response)
return response;
/* Draw next positions until end */
if ( dx > dy )
89a: 0e 15 cp r16, r14
89c: 1f 05 cpc r17, r15
89e: c4 f4 brge .+48 ; 0x8d0 <LcdLine+0xb4>
{
/* Take fraction */
fraction = dy - ( dx >> 1);
8a0: c7 01 movw r24, r14
8a2: 95 95 asr r25
8a4: 87 95 ror r24
8a6: e8 01 movw r28, r16
8a8: c8 1b sub r28, r24
8aa: d9 0b sbc r29, r25
8ac: 0e c0 rjmp .+28 ; 0x8ca <LcdLine+0xae>
while ( x1 != x2 )
{
if ( fraction >= 0 )
8ae: d7 fd sbrc r29, 7
8b0: 03 c0 rjmp .+6 ; 0x8b8 <LcdLine+0x9c>
{
y1 += stepy;
8b2: d8 0c add r13, r8
fraction -= dx;
8b4: ce 19 sub r28, r14
8b6: df 09 sbc r29, r15
8b8: ca 0c add r12, r10
}
x1 += stepx;
fraction += dy;
/* Draw calculated point */
response = LcdPixel( x1, y1, mode );
8ba: 47 2d mov r20, r7
8bc: 6d 2d mov r22, r13
8be: 8c 2d mov r24, r12
8c0: 4d df rcall .-358 ; 0x75c <LcdPixel>
if(response)
8c2: 88 23 and r24, r24
8c4: 01 f5 brne .+64 ; 0x906 <LcdLine+0xea>
{
y1 += stepy;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -