📄 3310lcd_main.lss
字号:
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 + -