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

📄 lcd_pcd8544.lss

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