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

📄 3310lcd_main.lss

📁 本程序简单的示范了如何使用3310液晶。 显示静止的英文显示静止的中文 显示移动的中文显示静止的图片 使用PWM控制3310的背光亮度
💻 LSS
📖 第 1 页 / 共 2 页
字号:
00000628 <.do_copy_data_start>:
 628:	a0 37       	cpi	r26, 0x70	; 112
 62a:	b1 07       	cpc	r27, r17
 62c:	d9 f7       	brne	.-10     	; 0x624

0000062e <__do_clear_bss>:
 62e:	10 e0       	ldi	r17, 0x00	; 0
 630:	a0 e7       	ldi	r26, 0x70	; 112
 632:	b0 e0       	ldi	r27, 0x00	; 0
 634:	01 c0       	rjmp	.+2      	; 0x638

00000636 <.do_clear_bss_loop>:
 636:	1d 92       	st	X+, r1

00000638 <.do_clear_bss_start>:
 638:	a0 37       	cpi	r26, 0x70	; 112
 63a:	b1 07       	cpc	r27, r17
 63c:	e1 f7       	brne	.-8      	; 0x636
 63e:	0c 94 5d 03 	jmp	0x6ba

00000642 <__bad_interrupt>:
 642:	0c 94 00 00 	jmp	0x0

00000646 <__vector_5>:

volatile unsigned char PWMSET=0x7F; //50%亮度

SIGNAL(SIG_INPUT_CAPTURE1)//定时器1的输入捕捉中断
{
 646:	1f 92       	push	r1
 648:	0f 92       	push	r0
 64a:	0f b6       	in	r0, 0x3f	; 63
 64c:	0f 92       	push	r0
 64e:	11 24       	eor	r1, r1
 650:	2f 93       	push	r18
 652:	8f 93       	push	r24
 654:	9f 93       	push	r25
 unsigned char key1,key2;
 key1 =~PIND;
 656:	20 b3       	in	r18, 0x10	; 16
 658:	20 95       	com	r18
 key1&=(1<<KEYUP)|(1<<KEYDOWN);
 65a:	2c 70       	andi	r18, 0x0C	; 12
 if (key1)
 65c:	31 f1       	breq	.+76     	; 0x6aa
		__ticks = 1;
	else if (__tmp > 65535)
		__ticks = 0;	/* i.e. 65536 */
	else
		__ticks = (uint16_t)__tmp;
 65e:	82 ee       	ldi	r24, 0xE2	; 226
 660:	94 e0       	ldi	r25, 0x04	; 4
 662:	01 97       	sbiw	r24, 0x01	; 1
 664:	f1 f7       	brne	.-4      	; 0x662
 {
	_delay_ms(5); //软件防抖动
	key2=~PIND;
 666:	80 b3       	in	r24, 0x10	; 16
 668:	80 95       	com	r24
	key2&=(1<<KEYUP)|(1<<KEYDOWN);
 66a:	8c 70       	andi	r24, 0x0C	; 12
	if (key1==key2)
 66c:	28 17       	cp	r18, r24
 66e:	d1 f4       	brne	.+52     	; 0x6a4
		{
			if (key1==(1<<KEYUP))//加亮度
 670:	24 30       	cpi	r18, 0x04	; 4
 672:	61 f4       	brne	.+24     	; 0x68c
			{
				if (PWMSET<=0xEF) 	PWMSET+=0x10;
 674:	80 91 60 00 	lds	r24, 0x0060
 678:	80 3f       	cpi	r24, 0xF0	; 240
 67a:	20 f4       	brcc	.+8      	; 0x684
 67c:	80 91 60 00 	lds	r24, 0x0060
 680:	80 5f       	subi	r24, 0xF0	; 240
 682:	01 c0       	rjmp	.+2      	; 0x686
				else   				PWMSET=0xFF;
 684:	8f ef       	ldi	r24, 0xFF	; 255
 686:	80 93 60 00 	sts	0x0060, r24
 68a:	0c c0       	rjmp	.+24     	; 0x6a4
			}
			if (key1==(1<<KEYDOWN))//减亮度
 68c:	28 30       	cpi	r18, 0x08	; 8
 68e:	51 f4       	brne	.+20     	; 0x6a4
			{
				if (PWMSET>=0x10) 	PWMSET-=0x10;
 690:	80 91 60 00 	lds	r24, 0x0060
 694:	80 31       	cpi	r24, 0x10	; 16
 696:	20 f0       	brcs	.+8      	; 0x6a0
 698:	80 91 60 00 	lds	r24, 0x0060
 69c:	80 51       	subi	r24, 0x10	; 16
 69e:	f3 cf       	rjmp	.-26     	; 0x686
				else 				PWMSET=0;
 6a0:	10 92 60 00 	sts	0x0060, r1
			}
		}
		OCR0=PWMSET;
 6a4:	80 91 60 00 	lds	r24, 0x0060
 6a8:	8c bf       	out	0x3c, r24	; 60
 6aa:	9f 91       	pop	r25
 6ac:	8f 91       	pop	r24
 6ae:	2f 91       	pop	r18
 6b0:	0f 90       	pop	r0
 6b2:	0f be       	out	0x3f, r0	; 63
 6b4:	0f 90       	pop	r0
 6b6:	1f 90       	pop	r1
 6b8:	18 95       	reti

000006ba <main>:
	}
}

/******************************************************************************/
int main(void)
{
 6ba:	cf e5       	ldi	r28, 0x5F	; 95
 6bc:	d4 e0       	ldi	r29, 0x04	; 4
 6be:	de bf       	out	0x3e, r29	; 62
 6c0:	cd bf       	out	0x3d, r28	; 61
    OSCCAL=0x9d;                        // 8M系统内部时钟校准,用下载软件读出然后修改这里的数值
 6c2:	8d e9       	ldi	r24, 0x9D	; 157
 6c4:	81 bf       	out	0x31, r24	; 49
    //设置MCU的I/O口 上电/复位 DDRx=0x00,PORTx=0x00;
	PORTA=0xFF;
 6c6:	8f ef       	ldi	r24, 0xFF	; 255
 6c8:	8b bb       	out	0x1b, r24	; 27
	PORTB=0xFF;
 6ca:	88 bb       	out	0x18, r24	; 24
	PORTC=0xFF;
 6cc:	85 bb       	out	0x15, r24	; 21
	PORTD=0xFF;							//全部使能内部上拉电阻,减少耗电
 6ce:	82 bb       	out	0x12, r24	; 18
	//PORTD= (1<<KEYUP)|(1<<KEYDOWN);	//使能内部上拉电阻
    DDRB = (1<<LCD_nRST) | (1<<LCD_DnC) | (1<<LCD_nCE) | (1<<SPI_MOSI) | (1<<SPI_CLK)|(1<<PWMOUT);
 6d0:	8b eb       	ldi	r24, 0xBB	; 187
 6d2:	87 bb       	out	0x17, r24	; 23
	
    SPSR = (1<<SPI2X);                 // 设置SPI时钟倍速
 6d4:	81 e0       	ldi	r24, 0x01	; 1
 6d6:	8e b9       	out	0x0e, r24	; 14
    SPCR = (1<<SPE)|(1<<MSTR);			// 使能SPI接口,主机模式,4M时钟
 6d8:	80 e5       	ldi	r24, 0x50	; 80
 6da:	8d b9       	out	0x0d, r24	; 13

 
//Timer0 WGM=PWM Phase correct,Prescale=8.PWM=1.961KHz,OC0输出
	TCNT0 = 0x00;
 6dc:	12 be       	out	0x32, r1	; 50
	OCR0  = PWMSET;
 6de:	80 91 60 00 	lds	r24, 0x0060
 6e2:	8c bf       	out	0x3c, r24	; 60
	TCCR0 = 0x72;
 6e4:	82 e7       	ldi	r24, 0x72	; 114
 6e6:	83 bf       	out	0x33, r24	; 51
 
//TIMER1 WGM= 12 CTC, TOP=ICRn Prescale=64 50mSec
	ICR1   = 0x1869;
 6e8:	89 e6       	ldi	r24, 0x69	; 105
 6ea:	98 e1       	ldi	r25, 0x18	; 24
 6ec:	97 bd       	out	0x27, r25	; 39
 6ee:	86 bd       	out	0x26, r24	; 38
	TCCR1A = 0x00;
 6f0:	1f bc       	out	0x2f, r1	; 47
	TCCR1B = 0x1B;
 6f2:	8b e1       	ldi	r24, 0x1B	; 27
 6f4:	8e bd       	out	0x2e, r24	; 46
	TIMSK = (1<<TICIE1); //WGM=12 需使能定时器1的输入捕捉中断
 6f6:	80 e2       	ldi	r24, 0x20	; 32
 6f8:	89 bf       	out	0x39, r24	; 57
	
	asm volatile("sei"::);//开全局中断
 6fa:	78 94       	sei

	LCD_init(); //初始化液晶
 6fc:	0e 94 d5 03 	call	0x7aa

    while(1)
    {
        LCD_clear();
 700:	0e 94 bf 03 	call	0x77e
        LCD_write_chinese_string(0,3,&chinese_string[0][0],3); //显示“我们的”,在x=0,y=2位置,显示write_chinese_string的12点阵汉字,显示3个,从第0个开始显示,行距为0,
 704:	23 e0       	ldi	r18, 0x03	; 3
 706:	44 e1       	ldi	r20, 0x14	; 20
 708:	51 e0       	ldi	r21, 0x01	; 1
 70a:	62 2f       	mov	r22, r18
 70c:	80 e0       	ldi	r24, 0x00	; 0
 70e:	0e 94 32 04 	call	0x864
        delay_nms(300);
 712:	8c e2       	ldi	r24, 0x2C	; 44
 714:	91 e0       	ldi	r25, 0x01	; 1
 716:	0e 94 68 04 	call	0x8d0
        LCD_draw_bmp_pixel(36,2,AVR_bmp,48,24);  //显示AVR大图
 71a:	08 e1       	ldi	r16, 0x18	; 24
 71c:	20 e3       	ldi	r18, 0x30	; 48
 71e:	44 e5       	ldi	r20, 0x54	; 84
 720:	53 e0       	ldi	r21, 0x03	; 3
 722:	62 e0       	ldi	r22, 0x02	; 2
 724:	84 e2       	ldi	r24, 0x24	; 36
 726:	0e 94 31 05 	call	0xa62
        delay_nms(1000);
 72a:	88 ee       	ldi	r24, 0xE8	; 232
 72c:	93 e0       	ldi	r25, 0x03	; 3
 72e:	0e 94 68 04 	call	0x8d0
        LCD_write_english_string(0,5,"www.OurAVR.com");
 732:	41 e6       	ldi	r20, 0x61	; 97
 734:	50 e0       	ldi	r21, 0x00	; 0
 736:	65 e0       	ldi	r22, 0x05	; 5
 738:	80 e0       	ldi	r24, 0x00	; 0
 73a:	0e 94 21 04 	call	0x842
        LCD_move_chinese_string(0, 0, &move_chinese_string[0][0],75);  //在屏幕最上面一行显示:欢迎光临本网站!显示速度为100,数值越大,速度越慢。
 73e:	2b e4       	ldi	r18, 0x4B	; 75
 740:	44 e5       	ldi	r20, 0x54	; 84
 742:	50 e0       	ldi	r21, 0x00	; 0
 744:	60 e0       	ldi	r22, 0x00	; 0
 746:	86 2f       	mov	r24, r22
 748:	0e 94 81 04 	call	0x902
        delay_nms(1000);
 74c:	88 ee       	ldi	r24, 0xE8	; 232
 74e:	93 e0       	ldi	r25, 0x03	; 3
 750:	0e 94 68 04 	call	0x8d0
        LCD_Draw_Screen(GCCAVR_bmp); //显示全屏图像
 754:	8c e5       	ldi	r24, 0x5C	; 92
 756:	91 e0       	ldi	r25, 0x01	; 1
 758:	0e 94 64 05 	call	0xac8
        delay_nms(2000);
 75c:	80 ed       	ldi	r24, 0xD0	; 208
 75e:	97 e0       	ldi	r25, 0x07	; 7
 760:	0e 94 68 04 	call	0x8d0
 764:	cd cf       	rjmp	.-102    	; 0x700

00000766 <LCD_write_byte>:
输入参数:	data    :写入的数据;
			command :写数据/命令选择;
-----------------------------------------------------------------------*/
void LCD_write_byte(unsigned char data, unsigned char command)
{
 766:	98 2f       	mov	r25, r24
    PORTB &= ~(1 << LCD_nCE) ;			// 使能LCD
 768:	c4 98       	cbi	0x18, 4	; 24
    if (command == 0)
 76a:	66 23       	and	r22, r22
 76c:	11 f4       	brne	.+4      	; 0x772
        PORTB &= ~(1 << LCD_DnC);		// 传送命令
 76e:	c1 98       	cbi	0x18, 1	; 24
 770:	01 c0       	rjmp	.+2      	; 0x774
    else
        PORTB |= (1 << LCD_DnC);		// 传送数据
 772:	c1 9a       	sbi	0x18, 1	; 24
    SPDR = data;			 			// 传送数据到SPI寄存器
 774:	9f b9       	out	0x0f, r25	; 15
    while ((SPSR & (1 << SPIF)) == 0);	// 等待数据传送完

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -