⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_pcd8544.lss

📁 Nokia 6110 LCD 驱动 Atmega8
💻 LSS
📖 第 1 页 / 共 5 页
字号:
 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 + -