📄 gps.lst
字号:
059C 9508 RET
_lcd_wr2_data:
lcd_wr_temp --> R20
lcd_wr_buffer --> R16
059D 940E0726 CALL push_gset1
(0457) }
(0458)
(0459) //向lcd_cs2写数据函数
(0460) void lcd_wr2_data (unsigned char lcd_wr_buffer)
(0461) {
(0462) unsigned char lcd_wr_temp;
(0463) e_off; //读lcd状态
059F 9897 CBI 0x12,7
(0464) rw_on;
05A0 9A93 SBI 0x12,3
(0465) di_off;
05A1 9894 CBI 0x12,4
(0466) cs2_on;
05A2 98AF CBI 0x15,7
(0467) DDRA&=0x03;
05A3 B38A IN R24,0x1A
05A4 7083 ANDI R24,3
05A5 BB8A OUT 0x1A,R24
(0468) PORTA&=0x03;
05A6 B38B IN R24,0x1B
05A7 7083 ANDI R24,3
05A8 BB8B OUT 0x1B,R24
(0469) DDRC&=0xFC;
05A9 B384 IN R24,0x14
05AA 7F8C ANDI R24,0xFC
05AB BB84 OUT 0x14,R24
(0470) PORTC&=0xFC;
05AC B385 IN R24,0x15
05AD 7F8C ANDI R24,0xFC
05AE BB85 OUT 0x15,R24
(0471) e_on;
05AF 9A97 SBI 0x12,7
(0472) NOP();
05B0 0000 NOP
(0473) NOP();
05B1 0000 NOP
(0474) NOP();
05B2 0000 NOP
(0475) lcd_wr_temp=(PINA&0XFC);
05B3 B349 IN R20,0x19
05B4 7F4C ANDI R20,0xFC
(0476) lcd_wr_temp|=(PINC&0x03);
05B5 B383 IN R24,0x13
05B6 7083 ANDI R24,3
05B7 2B48 OR R20,R24
(0477) e_off;
05B8 9897 CBI 0x12,7
(0478) cs2_off;
05B9 9AAF SBI 0x15,7
05BA C01B RJMP 0x05D6
(0479) while(lcd_wr_temp&0x90)
(0480) {
(0481) e_off; //读lcd状态
05BB 9897 CBI 0x12,7
(0482) rw_on;
05BC 9A93 SBI 0x12,3
(0483) di_off;
05BD 9894 CBI 0x12,4
(0484) cs2_on;
05BE 98AF CBI 0x15,7
(0485) DDRA&=0x03;
05BF B38A IN R24,0x1A
05C0 7083 ANDI R24,3
05C1 BB8A OUT 0x1A,R24
(0486) PORTA&=0x03;
05C2 B38B IN R24,0x1B
05C3 7083 ANDI R24,3
05C4 BB8B OUT 0x1B,R24
(0487) DDRC&=0xFC;
05C5 B384 IN R24,0x14
05C6 7F8C ANDI R24,0xFC
05C7 BB84 OUT 0x14,R24
(0488) PORTC&=0xFC;
05C8 B385 IN R24,0x15
05C9 7F8C ANDI R24,0xFC
05CA BB85 OUT 0x15,R24
(0489) e_on;
05CB 9A97 SBI 0x12,7
(0490) NOP();
05CC 0000 NOP
(0491) NOP();
05CD 0000 NOP
(0492) NOP();
05CE 0000 NOP
(0493) lcd_wr_temp=(PINA&0XFC);
05CF B349 IN R20,0x19
05D0 7F4C ANDI R20,0xFC
(0494) lcd_wr_temp|=(PINC&0x03);
05D1 B383 IN R24,0x13
05D2 7083 ANDI R24,3
05D3 2B48 OR R20,R24
(0495) e_off;
05D4 9897 CBI 0x12,7
(0496) cs2_off;
05D5 9AAF SBI 0x15,7
05D6 2F84 MOV R24,R20
05D7 7980 ANDI R24,0x90
05D8 F711 BNE 0x05BB
(0497) }
(0498) e_off; //向lcd写数据
05D9 9897 CBI 0x12,7
(0499) rw_off;
05DA 9893 CBI 0x12,3
(0500) di_on;
05DB 9A94 SBI 0x12,4
(0501) cs2_on;
05DC 98AF CBI 0x15,7
(0502) PORTA&=0x03;
05DD B38B IN R24,0x1B
05DE 7083 ANDI R24,3
05DF BB8B OUT 0x1B,R24
(0503) PORTA|=(lcd_wr_buffer&0xFC);
05E0 2F80 MOV R24,R16
05E1 7F8C ANDI R24,0xFC
05E2 B22B IN R2,0x1B
05E3 2A28 OR R2,R24
05E4 BA2B OUT 0x1B,R2
(0504) PORTC&=0xFC;
05E5 B385 IN R24,0x15
05E6 7F8C ANDI R24,0xFC
05E7 BB85 OUT 0x15,R24
(0505) PORTC|=(lcd_wr_buffer&0x03);
05E8 2F80 MOV R24,R16
05E9 7083 ANDI R24,3
05EA B225 IN R2,0x15
05EB 2A28 OR R2,R24
05EC BA25 OUT 0x15,R2
(0506) DDRA|=0xFC;
05ED B38A IN R24,0x1A
05EE 6F8C ORI R24,0xFC
05EF BB8A OUT 0x1A,R24
(0507) DDRC|=0X03;
05F0 B384 IN R24,0x14
05F1 6083 ORI R24,3
05F2 BB84 OUT 0x14,R24
(0508) e_on;
05F3 9A97 SBI 0x12,7
(0509) NOP();
05F4 0000 NOP
(0510) NOP();
05F5 0000 NOP
(0511) NOP();
05F6 0000 NOP
(0512) NOP();
05F7 0000 NOP
(0513) e_off;
05F8 9897 CBI 0x12,7
(0514) cs2_off;
05F9 9AAF SBI 0x15,7
(0515) NOP();
05FA 0000 NOP
(0516) NOP();
05FB 0000 NOP
(0517) DDRA&=0x03;
05FC B38A IN R24,0x1A
05FD 7083 ANDI R24,3
05FE BB8A OUT 0x1A,R24
(0518) DDRC&=0XFC;
05FF B384 IN R24,0x14
0600 7F8C ANDI R24,0xFC
0601 BB84 OUT 0x14,R24
0602 940E0729 CALL pop_gset1
0604 9508 RET
_lcd_display2:
lcd_row_counter --> Y+1
lcd_column_counter --> Y+0
lcd_invter --> R10
lcd_asc --> R12
asc_rdp --> R20
lcd_buffer1 --> R22
lcd_asc_column --> R14
0605 940E071E CALL push_gset5
0607 9722 SBIW R28,2
(0519) }
(0520)
(0521) //LCD显示刷屏函数,起始地址放在lcd_display2_buffer[0][0]中
(0522) //使用的全局变量:*lcd_display_rdp;
(0523) //API function
(0524) void lcd_display2(void)
(0525) {
(0526) const unsigned char *asc_rdp;
(0527) unsigned char lcd_row_counter;
(0528) unsigned char lcd_column_counter;
(0529) unsigned char lcd_asc;
(0530) unsigned char lcd_asc_column;
(0531) unsigned char lcd_buffer1;
(0532) unsigned char lcd_invter;
(0533) lcd_wr1_ins(0xc0); //显示起始行为0
0608 EC00 LDI R16,0xC0
0609 DE5C RCALL _lcd_wr1_ins
(0534) lcd_wr2_ins(0xc0); //显示起始行为0
060A EC00 LDI R16,0xC0
060B DF2A RCALL _lcd_wr2_ins
(0535) *lcd_display_rdp=lcd_display2_buffer[0][0];
060C 90200491 LDS R2,lcd_display2_buffer
060E 91E0048D LDS R30,lcd_display_rdp
0610 91F0048E LDS R31,lcd_display_rdp+1
0612 8220 STD Z+0,R2
(0536) for (lcd_row_counter=0;lcd_row_counter<=7;lcd_row_counter++) //显示的0~7行循环计数
0613 2400 CLR R0
0614 8209 STD Y+1,R0
0615 C0F5 RJMP 0x070B
(0537) {
(0538) lcd_wr1_ins(lcd_row_counter+0xb8); //设置x页地址
0616 8109 LDD R16,Y+1
0617 5408 SUBI R16,0x48
0618 DE4D RCALL _lcd_wr1_ins
(0539) lcd_wr2_ins(lcd_row_counter+0xb8); //设置x页地址
0619 8109 LDD R16,Y+1
061A 5408 SUBI R16,0x48
061B DF1A RCALL _lcd_wr2_ins
(0540) lcd_wr1_ins(0x40); //y地址清零
061C E400 LDI R16,0x40
061D DE48 RCALL _lcd_wr1_ins
(0541) lcd_wr2_ins(0x40); //y地址清零
061E E400 LDI R16,0x40
061F DF16 RCALL _lcd_wr2_ins
(0542) for (lcd_column_counter=0;lcd_column_counter<=9;lcd_column_counter++) //显示的0~20列循环计数(cs1为0~9列)
0620 2400 CLR R0
0621 8208 STD Y+0,R0
0622 C042 RJMP 0x0665
(0543) {
(0544) lcd_asc=*lcd_display_rdp; //要显示的字符ASC码放在lcd_asc中
0623 91E0048D LDS R30,lcd_display_rdp
0625 91F0048E LDS R31,lcd_display_rdp+1
0627 80C0 LDD R12,Z+0
(0545) lcd_display_rdp++;
0628 01CF MOVW R24,R30
0629 9601 ADIW R24,1
062A 9390048E STS lcd_display_rdp+1,R25
062C 9380048D STS lcd_display_rdp,R24
(0546) if (lcd_asc&BIT(7))
062E FEC7 SBRS R12,7
062F C007 RJMP 0x0637
(0547) {
(0548) lcd_invter|=BIT(0);
0630 2D8A MOV R24,R10
0631 6081 ORI R24,1
0632 2EA8 MOV R10,R24
(0549) lcd_asc&=(~BIT(7));
0633 2D8C MOV R24,R12
0634 778F ANDI R24,0x7F
0635 2EC8 MOV R12,R24
(0550) }
0636 C003 RJMP 0x063A
(0551) else
(0552) {
(0553) lcd_invter&=(~BIT(0));
0637 2D8A MOV R24,R10
0638 7F8E ANDI R24,0xFE
0639 2EA8 MOV R10,R24
(0554) }
(0555) if ((lcd_asc<0x20)||(lcd_asc>=0x80))
063A 2D8C MOV R24,R12
063B 3280 CPI R24,0x20
063C F010 BCS 0x063F
063D 3880 CPI R24,0x80
063E F010 BCS 0x0641
(0556) {
(0557) lcd_asc=0x20;
063F E280 LDI R24,0x20
0640 2EC8 MOV R12,R24
(0558) }
(0559) lcd_asc=lcd_asc-0x20;
0641 2D8C MOV R24,R12
0642 5280 SUBI R24,0x20
0643 2EC8 MOV R12,R24
(0560) for (lcd_asc_column=0;lcd_asc_column<=0x04;lcd_asc_column++) //显示的5列的循环
0644 24EE CLR R14
0645 C012 RJMP 0x0658
(0561) {
(0562) asc_rdp=&asc[lcd_asc][lcd_asc_column]; //取出当前字符的每列内容
0646 E085 LDI R24,5
0647 9D8C MUL R24,R12
0648 0110 MOVW R2,R0
0649 E584 LDI R24,0x54
064A E090 LDI R25,0
064B 0E28 ADD R2,R24
064C 1E39 ADC R3,R25
064D 2D4E MOV R20,R14
064E 2755 CLR R21
064F 0D42 ADD R20,R2
0650 1D53 ADC R21,R3
(0563) lcd_buffer1=*asc_rdp; //要写入lcd的数据放入lcd_buffer1中
0651 01FA MOVW R30,R20
0652 9164 LPM R22,0(Z)
(0564) if(lcd_invter&BIT(0))
0653 FCA0 SBRC R10,0
(0565) {
(0566) lcd_buffer1=~lcd_buffer1;
0654 9560 COM R22
(0567) }
(0568) lcd_wr1_data(lcd_buffer1);
0655 2F06 MOV R16,R22
0656 DE77 RCALL _lcd_wr1_data
0657 94E3 INC R14
0658 E084 LDI R24,4
0659 158E CP R24,R14
065A F758 BCC 0x0646
(0569) }
(0570) if(lcd_invter&BIT(0))
065B FEA0 SBRS R10,0
065C C003 RJMP 0x0660
(0571) {
(0572) lcd_wr1_data(0xff);
065D EF0F LDI R16,0xFF
065E DE6F RCALL _lcd_wr1_data
(0573) }
065F C002 RJMP 0x0662
(0574) else
(0575) {
(0576) lcd_wr1_data(0x00);
0660 2700 CLR R16
0661 DE6C RCALL _lcd_wr1_data
0662 8008 LDD R0,Y+0
0663 9403 INC R0
0664 8208 STD Y+0,R0
0665 E089 LDI R24,0x9
0666 8008 LDD R0,Y+0
0667 1580 CP R24,R0
0668 F008 BCS 0x066A
0669 CFB9 RJMP 0x0623
(0577) }
(0578) }
(0579) lcd_asc=*lcd_display_rdp; //要显示的字符ASC码放在lcd_asc中
066A 91E0048D LDS R30,lcd_display_rdp
066C 91F0048E LDS R31,lcd_display_rdp+1
066E 80C0 LDD R12,Z+0
(0580) lcd_display_rdp++;
066F 01CF MOVW R24,R30
0670 9601 ADIW R24,1
0671 9390048E STS lcd_display_rdp+1,R25
0673 9380048D STS lcd_display_rdp,R24
(0581) if (lcd_asc&BIT(7))
0675 FEC7 SBRS R12,7
0676 C007 RJMP 0x067E
(0582) {
(0583) lcd_invter|=BIT(0);
0677 2D8A MOV R24,R10
0678 6081 ORI R24,1
0679 2EA8 MOV R10,R24
(0584) lcd_asc&=(~BIT(7));
067A 2D8C MOV R24,R12
067B 778F ANDI R24,0x7F
067C 2EC8 MOV R12,R24
(0585) }
067D C003 RJMP 0x0681
(0586) else
(0587) {
(0588) lcd_invter&=(~BIT(0));
067E 2D8A MOV R24,R10
067F 7F8E ANDI R24,0xFE
0680 2EA8 MOV R10,R24
(0589) }
(0590) if ((lcd_asc<0x20)||(lcd_asc>=0x80))
0681 2D8C MOV R24,R12
0682 3280 CPI R24,0x20
0683 F010 BCS 0x0686
0684 3880 CPI R24,0x80
0685 F010 BCS 0x0688
(0591) {
(0592) lcd_asc=0x20;
0686 E280 LDI R24,0x20
0687 2EC8 MOV R12,R24
(0593) }
(0594) lcd_asc=lcd_asc-0x20;
0688 2D8C MOV R24,R12
0689 5280 SUBI R24,0x20
068A 2EC8 MOV R12,R24
(0595) for (lcd_asc_column=0;lcd_asc_column<=0x03;lcd_asc_column++) //显示的5列的循环
068B 24EE CLR R14
068C C012 RJMP 0x069F
(0596) {
(0597) asc_rdp=&asc[lcd_asc][lcd_asc_column]; //取出当前字符的每列内容
068D E085 LDI R24,5
068E 9D8C MUL R24,R12
068F 0110 MOVW R2,R0
0690 E584 LDI R24,0x54
0691 E090 LDI R25,0
0692 0E28 ADD R2,R24
0693 1E39 ADC R3,R25
0694 2D4E MOV R20,R14
0695 2755 CLR R21
0696 0D42 ADD R20,R2
0697 1D53 ADC R21,R3
(0598) lcd_buffer1=*asc_rdp; //要写入lcd的数据放入lcd_buffer1中
0698 01FA MOVW R30,R20
0699 9164 LPM R22,0(Z)
(0599) if(lcd_invter&BIT(0))
069A FCA0 SBRC R10,0
(0600) {
(0601) lcd_buffer1=~lcd_buffer1;
069B 9560 COM R22
(0602) }
(0603) lcd_wr1_data(lcd_buffer1);
069C 2F06 MOV R16,R22
069D DE30 RCALL _lcd_wr1_data
069E 94E3 INC R14
069F E083 LDI R24,3
06A0 158E
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -