📄 m16_vs1003_test.lst
字号:
0674 9624 ADIW R28,4
0675 9508 RET
_LCD_move_chinese_string:
i --> R20
j --> R22
buffer_l --> Y+84
buffer_h --> Y+0
n --> R10
T --> R12
Y --> R14
X --> Y+178
0676 940E132C CALL push_arg4
0678 940E1422 CALL push_gset5
067A 2EE2 MOV R14,R18
067B 97EF SBIW R28,0x3F
067C 97EF SBIW R28,0x3F
067D 97AA SBIW R28,0x2A
067E 01FE MOVW R30,R28
067F 54EA SUBI R30,0x4A
0680 4FFF SBCI R31,0xFF
0681 80C0 LDD R12,Z+0
(0138) }
(0139) }
(0140)
(0141) /*-----------------------------------------------------------------------
(0142) LCD_move_chinese_string: 汉字移动
(0143)
(0144) 输入参数:X、Y :显示汉字的起始X、Y坐标;
(0145) T :移动速度;
(0146)
(0147) 编写日期 :2004-8-13
(0148) 最后修改日期 :2004-8-13
(0149) -----------------------------------------------------------------------*/
(0150) void LCD_move_chinese_string (unsigned char X, unsigned char Y, unsigned char T)
(0151) {
(0152) unsigned char i,n,j=0;
0682 2766 CLR R22
(0153) unsigned char buffer_h[84]={0};
0683 E18C LDI R24,0x1C
0684 E094 LDI R25,4
0685 01FE MOVW R30,R28
0686 E504 LDI R16,0x54
0687 E010 LDI R17,0
0688 93FA ST R31,-Y
0689 93EA ST R30,-Y
068A 939A ST R25,-Y
068B 938A ST R24,-Y
068C 940E1485 CALL asgncblk
(0154) unsigned char buffer_l[84]={0};
068E E780 LDI R24,0x70
068F E094 LDI R25,4
0690 01FE MOVW R30,R28
0691 5AEC SUBI R30,0xAC
0692 4FFF SBCI R31,0xFF
0693 E504 LDI R16,0x54
0694 E010 LDI R17,0
0695 93FA ST R31,-Y
0696 93EA ST R30,-Y
0697 939A ST R25,-Y
0698 938A ST R24,-Y
0699 940E1485 CALL asgncblk
(0155)
(0156) for (i=0; i<156; i++)
069B 2744 CLR R20
069C C080 RJMP 0x071D
(0157) {
(0158) buffer_h[83] = move_chinese_string[i/12][j];
069D E01C LDI R17,0xC
069E 2F04 MOV R16,R20
069F 940E13C0 CALL div8u
06A1 E188 LDI R24,0x18
06A2 9F80 MUL R24,R16
06A3 0110 MOVW R2,R0
06A4 E58C LDI R24,0x5C
06A5 E093 LDI R25,3
06A6 0E28 ADD R2,R24
06A7 1E39 ADC R3,R25
06A8 2FE6 MOV R30,R22
06A9 27FF CLR R31
06AA 0DE2 ADD R30,R2
06AB 1DF3 ADC R31,R3
06AC 91E4 LPM R30,0(Z)
06AD 01DE MOVW R26,R28
06AE 5AAD SUBI R26,0xAD
06AF 4FBF SBCI R27,0xFF
06B0 93EC ST R30,0(X)
(0159) buffer_l[83] = move_chinese_string[i/12][j+12];
06B1 E01C LDI R17,0xC
06B2 2F04 MOV R16,R20
06B3 940E13C0 CALL div8u
06B5 E188 LDI R24,0x18
06B6 9F80 MUL R24,R16
06B7 0110 MOVW R2,R0
06B8 E58C LDI R24,0x5C
06B9 E093 LDI R25,3
06BA 0E28 ADD R2,R24
06BB 1E39 ADC R3,R25
06BC 2FE6 MOV R30,R22
06BD 27FF CLR R31
06BE 963C ADIW R30,0xC
06BF 0DE2 ADD R30,R2
06C0 1DF3 ADC R31,R3
06C1 91E4 LPM R30,0(Z)
06C2 01DE MOVW R26,R28
06C3 55A9 SUBI R26,0x59
06C4 4FBF SBCI R27,0xFF
06C5 93EC ST R30,0(X)
(0160) j++;
06C6 9563 INC R22
(0161) if (j==12) j=0;
06C7 306C CPI R22,0xC
06C8 F409 BNE 0x06CA
06C9 2766 CLR R22
(0162)
(0163) for (n=0; n<83; n++)
06CA 24AA CLR R10
06CB C01E RJMP 0x06EA
(0164) {
(0165) buffer_h[n]=buffer_h[n+1];
06CC 01CE MOVW R24,R28
06CD 9601 ADIW R24,1
06CE 2DEA MOV R30,R10
06CF 27FF CLR R31
06D0 0FE8 ADD R30,R24
06D1 1FF9 ADC R31,R25
06D2 8020 LDD R2,Z+0
06D3 01CE MOVW R24,R28
06D4 2DEA MOV R30,R10
06D5 27FF CLR R31
06D6 0FE8 ADD R30,R24
06D7 1FF9 ADC R31,R25
06D8 8220 STD Z+0,R2
(0166) buffer_l[n]=buffer_l[n+1];
06D9 01CE MOVW R24,R28
06DA 5A8B SUBI R24,0xAB
06DB 4F9F SBCI R25,0xFF
06DC 2DEA MOV R30,R10
06DD 27FF CLR R31
06DE 0FE8 ADD R30,R24
06DF 1FF9 ADC R31,R25
06E0 8020 LDD R2,Z+0
06E1 01CE MOVW R24,R28
06E2 5A8C SUBI R24,0xAC
06E3 4F9F SBCI R25,0xFF
06E4 2DEA MOV R30,R10
06E5 27FF CLR R31
06E6 0FE8 ADD R30,R24
06E7 1FF9 ADC R31,R25
06E8 8220 STD Z+0,R2
06E9 94A3 INC R10
06EA 2D8A MOV R24,R10
06EB 3583 CPI R24,0x53
06EC F2F8 BCS 0x06CC
(0167) }
(0168)
(0169) LCD_set_XY(X,Y);
06ED 2D2E MOV R18,R14
06EE 01FE MOVW R30,R28
06EF 54EE SUBI R30,0x4E
06F0 4FFF SBCI R31,0xFF
06F1 8100 LDD R16,Z+0
06F2 DEFF RCALL _LCD_set_XY
(0170) for (n=0; n<83; n++)
06F3 24AA CLR R10
06F4 C009 RJMP 0x06FE
(0171) {
(0172) LCD_write_byte(buffer_h[n],1);
06F5 E021 LDI R18,1
06F6 01CE MOVW R24,R28
06F7 2DEA MOV R30,R10
06F8 27FF CLR R31
06F9 0FE8 ADD R30,R24
06FA 1FF9 ADC R31,R25
06FB 8100 LDD R16,Z+0
06FC D072 RCALL _LCD_write_byte
06FD 94A3 INC R10
06FE 2D8A MOV R24,R10
06FF 3583 CPI R24,0x53
0700 F3A0 BCS 0x06F5
(0173) }
(0174)
(0175) LCD_set_XY(X,Y+1);
0701 2D2E MOV R18,R14
0702 5F2F SUBI R18,0xFF
0703 01FE MOVW R30,R28
0704 54EE SUBI R30,0x4E
0705 4FFF SBCI R31,0xFF
0706 8100 LDD R16,Z+0
0707 DEEA RCALL _LCD_set_XY
(0176) for (n=0; n<83; n++)
0708 24AA CLR R10
0709 C00B RJMP 0x0715
(0177) {
(0178) LCD_write_byte(buffer_l[n],1);
070A E021 LDI R18,1
070B 01CE MOVW R24,R28
070C 5A8C SUBI R24,0xAC
070D 4F9F SBCI R25,0xFF
070E 2DEA MOV R30,R10
070F 27FF CLR R31
0710 0FE8 ADD R30,R24
0711 1FF9 ADC R31,R25
0712 8100 LDD R16,Z+0
0713 D05B RCALL _LCD_write_byte
0714 94A3 INC R10
0715 2D8A MOV R24,R10
0716 3583 CPI R24,0x53
0717 F390 BCS 0x070A
(0179) }
(0180)
(0181) delay_nms(T);
0718 2D0C MOV R16,R12
0719 2711 CLR R17
071A 940E131D CALL _delay_nms
071C 9543 INC R20
071D 394C CPI R20,0x9C
071E F408 BCC 0x0720
071F CF7D RJMP 0x069D
0720 96EF ADIW R28,0x3F
0721 96EF ADIW R28,0x3F
0722 96AA ADIW R28,0x2A
0723 940E141F CALL pop_gset5
0725 9624 ADIW R28,4
0726 9508 RET
_LCD_draw_bmp_pixel:
row --> R20
n --> R22
i --> R14
Pix_y --> Y+18
Pix_x --> R10
map --> R12
Y --> Y+12
X --> Y+10
0727 940E132C CALL push_arg4
0729 940E1422 CALL push_gset5
072B 84CE LDD R12,Y+14
072C 84DF LDD R13,Y+15
072D 88A8 LDD R10,Y+16
(0182) }
(0183) }
(0184) /*void LCD_move_english_string (unsigned char X, unsigned char Y, unsigned char T,unsigned int n)
(0185) {
(0186) unsigned char i,n,j=0;
(0187) unsigned char buffer[84]={0};
(0188) T -= 31;
(0189) for (i=0; i<n; i++)
(0190) {
(0191) buffer[83] = LCD_write_byte(font6x8[T][j], 1);
(0192) j++;
(0193) if (j==6) j=0;
(0194)
(0195) for (n=0; n<83; n++)
(0196) {
(0197) buffer_h[n]=buffer_h[n+1];
(0198) buffer_l[n]=buffer_l[n+1];
(0199) }
(0200)
(0201) LCD_set_XY(X,Y);
(0202) for (n=0; n<83; n++)
(0203) {
(0204) LCD_write_byte(buffer_h[n],1);
(0205) }
(0206)
(0207) LCD_set_XY(X,Y+1);
(0208) for (n=0; n<83; n++)
(0209) {
(0210) LCD_write_byte(buffer_l[n],1);
(0211) }
(0212)
(0213) delay_nms(T);
(0214) }
(0215) }*/
(0216) /*
(0217) void LCD_write_char(unsigned char c)
(0218) {
(0219) unsigned char line;
(0220)
(0221) c -= 32;
(0222)
(0223) for (line=0; line<6; line++)
(0224) LCD_write_byte(font6x8[c][line], 1);
(0225) }
(0226) */
(0227) /*-----------------------------------------------------------------------
(0228) LCD_draw_map : 位图绘制函数
(0229)
(0230) 输入参数:X、Y :位图绘制的起始X、Y坐标;
(0231) *map :位图点阵数据;
(0232) Pix_x :位图像素(长)
(0233) Pix_y :位图像素(宽)
(0234)
(0235) 编写日期 :2004-8-13
(0236) 最后修改日期 :2004-8-13
(0237) -----------------------------------------------------------------------*/
(0238) void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
(0239) unsigned char Pix_x,unsigned char Pix_y)
(0240) {
(0241) unsigned int i,n;
(0242) unsigned char row;
(0243)
(0244) if (Pix_y%8==0) row=Pix_y/8; //计算位图所占行数
072E E018 LDI R17,0x8
072F 890A LDD R16,Y+18
0730 940E13BE CALL mod8u
0732 2300 TST R16
0733 F429 BNE 0x0739
0734 894A LDD R20,Y+18
0735 9546 LSR R20
0736 9546 LSR R20
0737 9546 LSR R20
0738 C005 RJMP 0x073E
(0245) else
(0246) row=Pix_y/8+1;
0739 894A LDD R20,Y+18
073A 9546 LSR R20
073B 9546 LSR R20
073C 9546 LSR R20
073D 5F4F SUBI R20,0xFF
(0247)
(0248) for (n=0;n<row;n++)
073E 2766 CLR R22
073F 2777 CLR R23
0740 C025 RJMP 0x0766
(0249) {
(0250) LCD_set_XY(X,Y);
0741 852C LDD R18,Y+12
0742 850A LDD R16,Y+10
0743 DEAE RCALL _LCD_set_XY
(0251) for(i=0; i<Pix_x; i++)
0744 24EE CLR R14
0745 24FF CLR R15
0746 C015 RJMP 0x075C
(0252) {
(0253) LCD_write_byte(map[i+n*Pix_x], 1);
0747 E021 LDI R18,1
0748 2C2A MOV R2,R10
0749 2433 CLR R3
074A 932F PUSH R18
074B 933F PUSH R19
074C 0191 MOVW R18,R2
074D 018B MOVW R16,R22
074E 940E13D6 CALL empy16s
0750 913F POP R19
0751 912F POP R18
0752 01F7 MOVW R30,R14
0753 0FE0 ADD R30,R16
0754 1FF1 ADC R31,R17
0755 0DEC ADD R30,R12
0756 1DFD ADC R31,R13
0757 8100 LDD R16,Z+0
0758 D016 RCALL _LCD_write_byte
0759 01C7 MOVW R24,R14
075A 9601 ADIW R24,1
075B 017C MOVW R14,R24
075C 2C2A MOV R2,R10
075D 2433 CLR R3
075E 14E2 CP R14,R2
075F 04F3 CPC R15,R3
0760 F330 BCS 0x0747
(0254) }
(0255) Y++; //换行
0761 840C LDD R0,Y+12
0762 9403 INC R0
0763 860C STD Y+12,R0
0764 5F6F SUBI R22,0xFF
0765 4F7F SBCI R23,0xFF
0766 2E24 MOV R2,R20
0767 2433 CLR R3
0768 1562 CP R22,R2
0769 0573 CPC R23,R3
076A F2B0 BCS 0x0741
076B 940E141F CALL pop_gset5
076D 9624 ADIW R28,4
076E 9508 RET
(0256) }
(0257) }
(0258)
(0259) /*-----------------------------------------------------------------------
(0260) LCD_write_byte : 使用SPI接口写数据到LCD
(0261)
(0262) 输入参数:data :写入的数据;
(0263) command :写数据/命令选择;
(0264)
(0265) 编写日期 :2004-8-10
(0266) 最后修改日期 :2004-8-13
(0267) -----------------------------------------------------------------------*/
(0268) void LCD_write_byte(unsigned char data, unsigned char command)
(0269) {
(0270) PORTA &= ~LCD_CE ; // 使能LCD
_LCD_write_byte:
command --> R18
data --> R16
076F 98DC CBI 0x1B,4
(0271)
(0272) if (command == 0)
0770 2322 TST R18
0771 F411 BNE 0x0774
(0273) PORTA &= ~LCD_DC ; // 传送命令
0772 98DE CBI 0x1B,6
0773 C001 RJMP 0x0775
(0274) else
(0275) PORTA |= LCD_DC ; // 传送数据
0774 9ADE SBI 0x1B,6
(0276)
(0277) SPDR = data; // 传送数据到SPI寄存器
0775 B90F OUT 0x0F,R16
(0278)
(0279) while ((SPSR & 0x80) == 0); // 等待数据传送完毕
0776 9B77 SBIS 0x0E,7
0777 CFFE RJMP 0x0776
(0280)
(0281) PORTA |= LCD_CE ; // 关闭LCD
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -