📄 test.lst
字号:
04FF F411 BNE 0x0502
0500 2700 CLR R16
0501 C001 RJMP 0x0503
(0041) else return(1);
0502 E001 LDI R16,1
0503 9508 RET
(0042) }
(0043) /*******************************************************************************
(0044) 读LCD状态
(0045) *******************************************************************************/
(0046) unsigned char LCD_RD_STATUS(void)
(0047) {
(0048) unsigned char temp;
(0049) LCD_DDR = 0x00;
_LCD_RD_STATUS:
temp --> R16
0504 2422 CLR R2
0505 B82A OUT 0x0A,R2
(0050) LCD_CD_H;
0506 9A28 SBI 0x05,0
(0051) LCD_RD_L;
0507 982A CBI 0x05,2
(0052) NOP();NOP();NOP();
0508 0000 NOP
0509 0000 NOP
050A 0000 NOP
(0053) temp = LCD_DATA;
050B B109 IN R16,0x09
(0054) LCD_RD_H;
050C 9A2A SBI 0x05,2
(0055) LCD_DDR = 0xFF;
050D EF8F LDI R24,0xFF
050E B98A OUT 0x0A,R24
(0056) return(temp);
050F 9508 RET
(0057) }
(0058) /*******************************************************************************
(0059) 读LCD数据
(0060) *******************************************************************************/
(0061) unsigned char LCD_RD_DATA(void)
(0062) {
(0063) unsigned char temp;
(0064) LCD_DDR = 0x00;
_LCD_RD_DATA:
temp --> R16
0510 2422 CLR R2
0511 B82A OUT 0x0A,R2
(0065) LCD_CD_L;
0512 9828 CBI 0x05,0
(0066) LCD_RD_L;
0513 982A CBI 0x05,2
(0067) NOP();NOP();NOP();
0514 0000 NOP
0515 0000 NOP
0516 0000 NOP
(0068) temp = LCD_DATA;
0517 B109 IN R16,0x09
(0069) LCD_RD_H;
0518 9A2A SBI 0x05,2
(0070) LCD_DDR = 0xFF;
0519 EF8F LDI R24,0xFF
051A B98A OUT 0x0A,R24
(0071) return(temp);
051B 9508 RET
_LCD_WR_DATA:
data --> R20
051C D323 RCALL push_gset1
051D 2F40 MOV R20,R16
(0072) }
(0073) /*******************************************************************************
(0074) 写数据
(0075) *******************************************************************************/
(0076) void LCD_WR_DATA(unsigned char data)
(0077) {
(0078) while( fnSTA01() );
051E DFC1 RCALL _fnSTA01
051F 2300 TST R16
0520 F7E9 BNE 0x051E
(0079) LCD_CD_L;
0521 9828 CBI 0x05,0
(0080) LCD_WR_L;
0522 9829 CBI 0x05,1
(0081) //LCD_DDR = 0XFF;----------------单片机端口必须处于输出状态
(0082) LCD_PORT = data;
0523 B94B OUT 0x0B,R20
(0083) LCD_WR_H;
0524 9A29 SBI 0x05,1
0525 D31D RCALL pop_gset1
0526 9508 RET
_LCD_WR_CODE:
code --> R20
0527 D318 RCALL push_gset1
0528 2F40 MOV R20,R16
(0084) }
(0085) /*******************************************************************************
(0086) 写无参数命令
(0087) *******************************************************************************/
(0088) void LCD_WR_CODE(unsigned char code)
(0089) {
(0090) while( fnSTA01() );
0529 DFB6 RCALL _fnSTA01
052A 2300 TST R16
052B F7E9 BNE 0x0529
(0091) LCD_CD_H;
052C 9A28 SBI 0x05,0
(0092) LCD_WR_L;
052D 9829 CBI 0x05,1
(0093) //LCD_DDR = 0XFF;----------------单片机端口必须处于输出状态
(0094) LCD_PORT = code;
052E B94B OUT 0x0B,R20
(0095) LCD_WR_H;
052F 9A29 SBI 0x05,1
0530 D312 RCALL pop_gset1
0531 9508 RET
_LCD_WR_CODE1:
data1 --> R22
code --> R20
0532 D30B RCALL push_gset2
0533 2F62 MOV R22,R18
0534 2F40 MOV R20,R16
(0096) }
(0097) /*******************************************************************************
(0098) 写单参数的指令
(0099) *******************************************************************************/
(0100) void LCD_WR_CODE1(unsigned char code, unsigned char data1)
(0101) {
(0102) LCD_WR_DATA(data1);
0535 2F06 MOV R16,R22
0536 DFE5 RCALL _LCD_WR_DATA
(0103) LCD_WR_CODE(code);
0537 2F04 MOV R16,R20
0538 DFEE RCALL _LCD_WR_CODE
0539 D2F8 RCALL pop_gset2
053A 9508 RET
_LCD_WR_CODE2:
data2 --> Y+4
data1 --> R22
code --> R20
053B D302 RCALL push_gset2
053C 2F62 MOV R22,R18
053D 2F40 MOV R20,R16
(0104) }
(0105) /*******************************************************************************
(0106) 写双参数的指令
(0107) *******************************************************************************/
(0108) void LCD_WR_CODE2(unsigned char code, unsigned char data1, unsigned char data2)
(0109) {
(0110) LCD_WR_DATA(data1);
053E 2F06 MOV R16,R22
053F DFDC RCALL _LCD_WR_DATA
(0111) LCD_WR_DATA(data2);
0540 810C LDD R16,Y+4
0541 DFDA RCALL _LCD_WR_DATA
(0112) LCD_WR_CODE(code);
0542 2F04 MOV R16,R20
0543 DFE3 RCALL _LCD_WR_CODE
0544 D2ED RCALL pop_gset2
0545 9508 RET
_LCD_INIT:
0546 9721 SBIW R28,1
(0113) }
(0114) /*******************************************************************************
(0115) 初始化LCD
(0116) *******************************************************************************/
(0117) void LCD_INIT(void)
(0118) {
(0119) LCD_WR_CODE(LCD_MOD_OR);
0547 E800 LDI R16,0x80
0548 DFDE RCALL _LCD_WR_CODE
(0120) LCD_WR_CODE(0x98); //打开图形显示
0549 E908 LDI R16,0x98
054A DFDC RCALL _LCD_WR_CODE
(0121) LCD_WR_CODE2(LCD_TXT_STP,0,0);
054B 2422 CLR R2
054C 8228 STD Y+0,R2
054D 2722 CLR R18
054E E400 LDI R16,0x40
054F DFEB RCALL _LCD_WR_CODE2
(0122) LCD_WR_CODE2(LCD_TXT_WID,30,0);
0550 2422 CLR R2
0551 8228 STD Y+0,R2
0552 E12E LDI R18,0x1E
0553 E401 LDI R16,0x41
0554 DFE6 RCALL _LCD_WR_CODE2
(0123) LCD_WR_CODE2(LCD_GRH_STP,0,0);
0555 2422 CLR R2
0556 8228 STD Y+0,R2
0557 2722 CLR R18
0558 E402 LDI R16,0x42
0559 DFE1 RCALL _LCD_WR_CODE2
(0124) LCD_WR_CODE2(LCD_GRH_WID,30,0);
055A 2422 CLR R2
055B 8228 STD Y+0,R2
055C E12E LDI R18,0x1E
055D E403 LDI R16,0x43
055E DFDC RCALL _LCD_WR_CODE2
055F 9621 ADIW R28,1
0560 9508 RET
_LCD_CLEAR:
i --> R20
j --> R10
data --> R22
0561 D2DA RCALL push_gset3
0562 2F60 MOV R22,R16
0563 9721 SBIW R28,1
(0125) }
(0126) /*******************************************************************************
(0127) 清整屏
(0128) *******************************************************************************/
(0129) void LCD_CLEAR(unsigned char data)
(0130) {
(0131) unsigned char i,j;
(0132) LCD_WR_CODE(0x98); //打开图形显示
0564 E908 LDI R16,0x98
0565 DFC1 RCALL _LCD_WR_CODE
(0133) LCD_WR_CODE2(LCD_ADD_POS,0,0);
0566 2422 CLR R2
0567 8228 STD Y+0,R2
0568 2722 CLR R18
0569 E204 LDI R16,0x24
056A DFD0 RCALL _LCD_WR_CODE2
(0134) LCD_WR_CODE(LCD_AUT_WR);
056B EB00 LDI R16,0xB0
056C DFBA RCALL _LCD_WR_CODE
(0135) for(i=0;i<128;i++)
056D 2744 CLR R20
056E C009 RJMP 0x0578
(0136) {
(0137) for(j=0;j<30;j++)
056F 24AA CLR R10
0570 C003 RJMP 0x0574
(0138) {
(0139) LCD_WR_DATA(data);
0571 2F06 MOV R16,R22
0572 DFA9 RCALL _LCD_WR_DATA
0573 94A3 INC R10
0574 2D8A MOV R24,R10
0575 318E CPI R24,0x1E
0576 F3D0 BCS 0x0571
0577 9543 INC R20
0578 3840 CPI R20,0x80
0579 F3A8 BCS 0x056F
(0140) }
(0141) }
(0142) LCD_WR_CODE(LCD_AUT_OVR);
057A EB02 LDI R16,0xB2
057B DFAB RCALL _LCD_WR_CODE
057C 9621 ADIW R28,1
057D D2B6 RCALL pop_gset3
057E 9508 RET
_PRINT_240128:
i --> R20
j --> R10
str --> R22
057F D2BC RCALL push_gset3
0580 01B8 MOVW R22,R16
0581 9721 SBIW R28,1
(0143) }
(0144) /*******************************************************************************
(0145) 显示一个240*128的图片 图片的大小为3840 。
(0146) *******************************************************************************/
(0147) void PRINT_240128(const unsigned char *str)
(0148) {
(0149) unsigned char i,j;
(0150) LCD_WR_CODE(0x98);
0582 E908 LDI R16,0x98
0583 DFA3 RCALL _LCD_WR_CODE
(0151) LCD_WR_CODE2(LCD_ADD_POS,0,0);
0584 2422 CLR R2
0585 8228 STD Y+0,R2
0586 2722 CLR R18
0587 E204 LDI R16,0x24
0588 DFB2 RCALL _LCD_WR_CODE2
(0152) LCD_WR_CODE(LCD_AUT_WR);
0589 EB00 LDI R16,0xB0
058A DF9C RCALL _LCD_WR_CODE
(0153) for(i=0;i<128;i++)
058B 2744 CLR R20
058C C00D RJMP 0x059A
(0154) {
(0155) for(j=0;j<30;j++)
058D 24AA CLR R10
058E C007 RJMP 0x0596
(0156) {
(0157) LCD_WR_DATA(*str++);
058F 011B MOVW R2,R22
0590 5F6F SUBI R22,0xFF
0591 4F7F SBCI R23,0xFF
0592 01F1 MOVW R30,R2
0593 9104 LPM R16,0(Z)
0594 DF87 RCALL _LCD_WR_DATA
0595 94A3 INC R10
0596 2D8A MOV R24,R10
0597 318E CPI R24,0x1E
0598 F3B0 BCS 0x058F
0599 9543 INC R20
059A 3840 CPI R20,0x80
059B F388 BCS 0x058D
(0158) }
(0159) }
(0160) LCD_WR_CODE(LCD_AUT_OVR);
059C EB02 LDI R16,0xB2
059D DF89 RCALL _LCD_WR_CODE
059E 9621 ADIW R28,1
059F D294 RCALL pop_gset3
05A0 9508 RET
_LCD_SET_ADD:
ucol --> R20
urow --> R22
05A1 D29C RCALL push_gset2
05A2 2F42 MOV R20,R18
05A3 2F60 MOV R22,R16
05A4 9721 SBIW R28,1
(0161) }
(0162) /*******************************************************************************
(0163) 设置当前地址,用于起点定位。
(0164) *******************************************************************************/
(0165) void LCD_SET_ADD(unsigned char urow, unsigned char ucol)
(0166) {
(0167) LCD_WR_CODE2(LCD_ADD_POS,(urow*30+ucol) & 0xFF,(urow*30+ucol) / 256);
05A5 E18E LDI R24,0x1E
05A6 9F86 MUL R24,R22
05A7 0110 MOVW R2,R0
05A8 2E44 MOV R4,R20
05A9 2455 CLR R5
05AA 0C24 ADD R2,R4
05AB 1C35 ADC R3,R5
05AC E020 LDI R18,0
05AD E031 LDI R19,1
05AE 0181 MOVW R16,R2
05AF D23D RCALL div16s
05B0 8308 STD Y+0,R16
05B1 2D22 MOV R18,R2
05B2 7030 ANDI R19,0
05B3 E204 LDI R16,0x24
05B4 DF86 RCALL _LCD_WR_CODE2
(0168) gCurRow = urow;
05B5 93600145 STS gCurRow,R22
(0169) gCurCol = ucol;
05B7 93400144 STS gCurCol,R20
05B9 9621 ADIW R28,1
05BA D277 RCALL pop_gset2
05BB 9508 RET
_PRINT_words:
length --> Y+0
uRow --> R22
uCol --> R10
i --> R12
k --> R14
j --> R20
ptr --> Y+15
y --> Y+13
x --> Y+11
05BC D227 RCALL push_arg4
05BD D27A RCALL push_gset5
05BE 9721 SBIW R28,1
(0170) }
(0171) /*******************************************************************************
(0172) ASCII(8*16) 及 汉字(16*16) 显示函数,ASCII与汉字区别在于128做分界。
(0173) *******************************************************************************/
(0174) void PRINT_words (unsigned char x,unsigned char y, char *ptr)
(0175) {
(0176) unsigned char length=0,i=0,j=0,uRow=0,uCol=0;
05BF 2400 CLR R0
05C0 8208 STD Y+0,R0
05C1 24CC CLR R12
05C2 2744 CLR R20
05C3 2766 CLR R22
05C4 24AA CLR R10
(0177) unsigned int k=0;
05C5 24EE CLR R14
05C6 24FF CLR R15
(0178) uRow = y;
05C7 856D LDD R22,Y+13
(0179) uCol = x;
05C8 84AB LDD R10,Y+11
(0180) LCD_SET_ADD(uRow*16,uCol); //起点定位
05C9 2D2A MOV R18,R10
05CA E180 LDI R24,0x10
05CB 9F86 MUL R24,R22
05CC 2D00 MOV R16,R0
05CD DFD3 RCALL _LCD_SET_ADD
05CE C003 RJMP 0x05D2
(0181)
(0182)
(0183) while (ptr[length]!=0) //探测字串长度
(0184) {
(0185) length++;
05CF 8008 LDD R0,Y+0
05D0 9403 INC R0
05D1 8208 STD Y+0,R0
05D2 81E8 LDD R30,Y+0
05D3 27FF CLR R31
05D4 840F LDD R0,Y+15
05D5 8818 LDD R1,Y+16
05D6 0DE0 ADD R30,R0
05D7 1DF1 ADC R31,R1
05D8 8020 LDD R2,Z+0
05D9 2022 TST R2
05DA F7A1 BNE 0x05CF
05DB C0B2 RJMP 0x068E
(0186) }
(0187) while(i<length)//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
(0188) {
(0189) uRow = gCurRow;
05DC 91600145 LDS R22,gCurRow
(0190) uCol = gCurCol;
05DE 90A00144 LDS R10,gCurCol
(0191) if(ptr[i] <= 128)//ASCII
05E0 2DEC MOV R30,R12
05E1 27FF CLR R31
05E2 840F LDD R0,Y+15
05E3 8818 LDD R1,Y+16
05E4 0DE0 ADD R30,R0
05E5 1DF1 ADC R31,R1
05E6 8020 LDD R2,Z+0
05E7 E880 LDI R24,0x80
05E8 1582 CP R24,R2
05E9 F130 BCS 0x0610
(0192) {
(0193) for(j=0;j<16;j++)
05EA 2744 CLR R20
05EB C020 RJMP 0x060C
(0194) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -