📄 t6963.lst
字号:
045E 2700 CLR R16
045F D311 RCALL pop_gset1
0460 9508 RET
_fnPR2:
temp --> R20
0461 D30C RCALL push_gset1
(0198) }
(0199) /************************/
(0200) /* 读数据*/
(0201) /************************/
(0202) unsigned char fnPR2(void)
(0203) {
(0204) unsigned char temp;
(0205) if(fnSTA01() == 0)
0462 DF77 RCALL _fnSTA01
0463 2300 TST R16
0464 F411 BNE 0x0467
(0206) {
(0207) return 1; // 获取状态如果状态错
0465 E001 LDI R16,1
0466 C002 RJMP 0x0469
(0208) }
(0209) temp=RD_DAT();
0467 DF56 RCALL _RD_DAT
0468 2F40 MOV R20,R16
(0210) return(temp); // 返回数据
0469 D307 RCALL pop_gset1
046A 9508 RET
_fnSetPos:
iPos --> R10
ucol --> R20
urow --> R22
046B D31C RCALL push_gset3
046C 2F42 MOV R20,R18
046D 2F60 MOV R22,R16
046E 9721 SBIW R28,1
(0211) }
(0212) /************************/
(0213) /* 设置当前地址*/
(0214) /************************/
(0215) void fnSetPos(unsigned char urow, unsigned char ucol)
(0216) {
(0217) unsigned int iPos;
(0218) iPos = (unsigned int)urow * 30 + ucol;
046F E18E LDI R24,0x1E
0470 9F86 MUL R24,R22
0471 0150 MOVW R10,R0
0472 2E24 MOV R2,R20
0473 2433 CLR R3
0474 0CA2 ADD R10,R2
0475 1CB3 ADC R11,R3
(0219) fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
0476 0115 MOVW R2,R10
0477 2C23 MOV R2,R3
0478 2433 CLR R3
0479 8228 STD Y+0,R2
047A 2D2A MOV R18,R10
047B 7030 ANDI R19,0
047C E204 LDI R16,0x24
047D DF9C RCALL _fnPR1
(0220) gCurRow = urow;
047E 93600090 STS _gCurRow,R22
(0221) gCurCol = ucol;
0480 9340008F STS _gCurCol,R20
(0222) }
0482 9621 ADIW R28,1
0483 D2E6 RCALL pop_gset3
0484 9508 RET
_cursor:
uCol --> R22
uRow --> R20
0485 D2FF RCALL push_gset2
0486 2F62 MOV R22,R18
0487 2F40 MOV R20,R16
(0223) /**********************/
(0224) /* 设置当前显示行列*/
(0225) /**********************/
(0226) void cursor(unsigned char uRow, unsigned char uCol)
(0227) {
(0228) fnSetPos(uRow * 16, uCol);
0488 2F26 MOV R18,R22
0489 E180 LDI R24,0x10
048A 9F84 MUL R24,R20
048B 2D00 MOV R16,R0
048C DFDE RCALL _fnSetPos
(0229) }
048D D2DA RCALL pop_gset2
048E 9508 RET
_cls:
i --> R20
048F D2DE RCALL push_gset1
0490 940E07E1 CALL 0x7E1
(0230) /*********************/
(0231) /* 清屏*/
(0232) /*********************/
(0233) void cls(void)
(0234) {
(0235) unsigned int i;
(0236) fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
0492 E204 LDI R16,0x24
0493 DF86 RCALL _fnPR1
(0237) fnPR12(LC_AUT_WR); // 自动写
0494 EB00 LDI R16,0xB0
0495 DFB3 RCALL _fnPR12
(0238) for(i=0;i<240*128/8;i++) // 清一屏
0496 2744 CLR R20
0497 2755 CLR R21
0498 C005 RJMP 0x049E
(0239) {
(0240) fnSTA3();
0499 DF60 RCALL _fnSTA3
(0241) fnPR13(0x0); // 写数据实际使用时请将0x55 改成0x0
049A 2700 CLR R16
049B DFB9 RCALL _fnPR13
049C 5F4F SUBI R20,0xFF
049D 4F5F SBCI R21,0xFF
049E 3040 CPI R20,0
049F E0EF LDI R30,0xF
04A0 075E CPC R21,R30
04A1 F3B8 BCS 0x0499
(0242) }
(0243) fnPR12(LC_AUT_OVR); // 自动写结束
04A2 EB02 LDI R16,0xB2
04A3 DFA5 RCALL _fnPR12
(0244) fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
04A4 2422 CLR R2
04A5 8228 STD Y+0,R2
04A6 2722 CLR R18
04A7 E204 LDI R16,0x24
04A8 DF71 RCALL _fnPR1
(0245) gCurRow = 0; // 置地址指针存储变量
04A9 2422 CLR R2
04AA 92200090 STS _gCurRow,R2
(0246) gCurCol = 0;
04AC 9220008F STS _gCurCol,R2
(0247) }
04AE 9621 ADIW R28,1
04AF D2C1 RCALL pop_gset1
04B0 9508 RET
_fnLCMInit:
04B1 940E07E1 CALL 0x7E1
(0248) /************************/
(0249) /* LCM 初始化*/
(0250) /************************/
(0251) char fnLCMInit(void)
(0252) {
(0253) if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
04B3 E400 LDI R16,0x40
04B4 DF65 RCALL _fnPR1
04B5 2300 TST R16
04B6 F011 BEQ 0x04B9
(0254) {
(0255) return (0xff);
04B7 EF0F LDI R16,0xFF
04B8 C016 RJMP 0x04CF
(0256) }
(0257) fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
04B9 2422 CLR R2
04BA 8228 STD Y+0,R2
04BB E12E LDI R18,0x1E
04BC E401 LDI R16,0x41
04BD DF5C RCALL _fnPR1
(0258) fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
04BE 2422 CLR R2
04BF 8228 STD Y+0,R2
04C0 2722 CLR R18
04C1 E402 LDI R16,0x42
04C2 DF57 RCALL _fnPR1
(0259) fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
04C3 2422 CLR R2
04C4 8228 STD Y+0,R2
04C5 E12E LDI R18,0x1E
04C6 E403 LDI R16,0x43
04C7 DF52 RCALL _fnPR1
(0260) fnPR12(LC_CUR_SHP | 0x01); // 光标形状
04C8 EA01 LDI R16,0xA1
04C9 DF7F RCALL _fnPR12
(0261) fnPR12(LC_MOD_OR); // 显示方式设置
04CA E800 LDI R16,0x80
04CB DF7D RCALL _fnPR12
(0262) fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
04CC E908 LDI R16,0x98
04CD DF7B RCALL _fnPR12
(0263) return(0);
04CE 2700 CLR R16
04CF 9621 ADIW R28,1
04D0 9508 RET
_dprintf:
cData --> Y+3
uLen --> Y+2
i --> Y+1
c2 --> R22
uRow --> Y+0
uCol --> R14
c1 --> R20
k --> R10
j --> R12
ptr --> Y+14
y --> R22
x --> R20
04D1 D2BC RCALL push_gset5
04D2 2F62 MOV R22,R18
04D3 2F40 MOV R20,R16
04D4 9724 SBIW R28,4
(0264) }
(0265) /********************************************************/
(0266) /* ASCII(8*16) 及 汉字(16*16) 显示函数 */
(0267) /********************************************************/
(0268) unsigned char dprintf(unsigned char x,unsigned char y, char *ptr)
(0269) {
(0270) unsigned char c1,c2,cData;
(0271) unsigned char i,j,uLen,uRow,uCol;
(0272) unsigned int k;
(0273) uLen=0;
04D5 2400 CLR R0
04D6 820A STD Y+2,R0
(0274) i=0;
04D7 8209 STD Y+1,R0
(0275) uRow = y;
04D8 8368 STD Y+0,R22
(0276) uCol = x;
04D9 2EE4 MOV R14,R20
(0277) fnSetPos(uRow*16,uCol); //起点定位
04DA 2D2E MOV R18,R14
04DB E180 LDI R24,0x10
04DC 2E06 MOV R0,R22
04DD 9D80 MUL R24,R0
04DE 2D00 MOV R16,R0
04DF DF8B RCALL _fnSetPos
04E0 C003 RJMP 0x04E4
(0278) while (ptr[uLen]!=0) //探测字串长度
(0279) {
(0280) uLen++;
04E1 800A LDD R0,Y+2
04E2 9403 INC R0
04E3 820A STD Y+2,R0
04E4 81EA LDD R30,Y+2
04E5 940E07BB CALL 0x7BB
04E7 8020 LDD R2,Z+0
04E8 2022 TST R2
04E9 F7B9 BNE 0x04E1
04EA C0A0 RJMP 0x058B
(0281) }
(0282) while(i<uLen)
(0283) {
(0284) c1 = ptr[i];
04EB 81E9 LDD R30,Y+1
04EC 940E07BB CALL 0x7BB
04EE 8140 LDD R20,Z+0
(0285) c2 = ptr[i+1];
04EF 81E9 LDD R30,Y+1
04F0 27FF CLR R31
04F1 0DE0 ADD R30,R0
04F2 1DF1 ADC R31,R1
04F3 8161 LDD R22,Z+1
(0286) //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
(0287) uRow = fnGetRow();
04F4 DEB9 RCALL _fnGetRow
04F5 8308 STD Y+0,R16
(0288) uCol = fnGetCol();
04F6 DEBA RCALL _fnGetCol
04F7 2EE0 MOV R14,R16
(0289) if(c1 <=128) // ASCII
04F8 E880 LDI R24,0x80
04F9 1784 CP R24,R20
04FA F140 BCS 0x0523
(0290) {
(0291) for(j=0;j<16;j++) //写16行
04FB 24CC CLR R12
04FC C01E RJMP 0x051B
(0292) {
(0293) fnPR12(LC_AUT_WR); // 写数据(命令)
04FD EB00 LDI R16,0xB0
04FE DF4A RCALL _fnPR12
(0294) if (c1 >= 0x20)
04FF 3240 CPI R20,0x20
0500 F080 BCS 0x0511
(0295) {
(0296) fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
0501 E180 LDI R24,0x10
0502 9F84 MUL R24,R20
0503 01F0 MOVW R30,R0
0504 50E0 SUBI R30,0
0505 40F2 SBCI R31,2
0506 2C2C MOV R2,R12
0507 2433 CLR R3
0508 0DE2 ADD R30,R2
0509 1DF3 ADC R31,R3
050A E584 LDI R24,0x54
050B E090 LDI R25,0
050C 0FE8 ADD R30,R24
050D 1FF9 ADC R31,R25
050E 9104 LPM R16,0(Z)
050F DF45 RCALL _fnPR13
(0297) }
0510 C002 RJMP 0x0513
(0298) else
(0299) {
(0300) fnPR13(cData);
0511 810B LDD R16,Y+3
0512 DF42 RCALL _fnPR13
(0301) }
(0302) fnPR12(LC_AUT_OVR); //写数据结束
0513 EB02 LDI R16,0xB2
0514 DF34 RCALL _fnPR12
(0303) fnSetPos(uRow+j+1,uCol);
0515 2D2E MOV R18,R14
0516 8108 LDD R16,Y+0
0517 0D0C ADD R16,R12
0518 5F0F SUBI R16,0xFF
0519 DF51 RCALL _fnSetPos
051A 94C3 INC R12
051B 2D8C MOV R24,R12
051C 3180 CPI R24,0x10
051D F2F8 BCS 0x04FD
(0304) }
(0305) if(c1 != BS) // 非退格
051E 3048 CPI R20,0x8
051F F409 BNE 0x0521
0520 C055 RJMP 0x0576
(0306) {
(0307) uCol++; // 列数加1
0521 94E3 INC R14
(0308) }
(0309)
(0310) }
0522 C053 RJMP 0x0576
(0311) else // 中文
(0312) {
(0313) for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++) // 查找定位
0523 24CC CLR R12
0524 C00F RJMP 0x0534
(0314) {
(0315) if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
0525 E282 LDI R24,0x22
0526 9D8C MUL R24,R12
0527 0110 MOVW R2,R0
0528 E584 LDI R24,0x54
0529 940E07AF CALL 0x7AF
052B 174E CP R20,R30
052C F431 BNE 0x0533
052D E585 LDI R24,0x55
052E 940E07AF CALL 0x7AF
0530 176E CP R22,R30
0531 F409 BNE 0x0533
(0316) {
(0317) break;
0532 C004 RJMP 0x0537
0533 94C3 INC R12
0534 2D8C MOV R24,R12
0535 3084 CPI R24,4
0536 F370 BCS 0x0525
(0318) }
(0319)
(0320) }
(0321) for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
0537 24AA CLR R10
0538 24BB CLR R11
0539 C030 RJMP 0x056A
(0322) {
(0323) fnSetPos(uRow+k,uCol);
053A 2D2E MOV R18,R14
053B 8108 LDD R16,Y+0
053C 2711 CLR R17
053D 0D0A ADD R16,R10
053E 1D1B ADC R17,R11
053F DF2B RCALL _fnSetPos
(0324) fnPR12(LC_AUT_WR); // 写数据
0540 EB00 LDI R16,0xB0
0541 DF07 RCALL _fnPR12
(0325) if(j < sizeof(GB_16)/sizeof(GB_16[0]))
0542 2D8C MOV R24,R12
0543 3084 CPI R24,4
0544 F490 BCC 0x0557
0545 940E0796 CALL 0x796
(0326) {
(0327) fnPR13(GB_16[j].Msk[k*2]);
0547 D210 RCALL empy16s
0548 01F8 MOVW R30,R16
0549 0DE2 ADD R30,R2
054A 1DF3 ADC R31,R3
054B 9104 LPM R16,0(Z)
054C DF08 RCALL _fnPR13
054D 940E0796 CALL 0x796
(0328) fnPR13(GB_16[j].Msk[k*2+1]);
054F D208 RCALL empy16s
0550 01F8 MOVW R30,R16
0551 9631 ADIW R30,1
0552 0DE2 ADD R30,R2
0553 1DF3 ADC R31,R3
0554 9104 LPM R16,0(Z)
0555 DEFF RCALL _fnPR13
(0329) }
0556 C00E RJMP 0x0565
(0330) else // 未找到该字
(0331) {
(0332) if(k < sizeof(GB_16[0].Msk)/4)
0557 01C5 MOVW R24,R10
0558 3088 CPI R24,0x8
0559 E0E0 LDI R30,0
055A 079E CPC R25,R30
055B F428 BCC 0x0561
(0333) {
(0334) fnPR13(0x00);
055C 2700 CLR R16
055D DEF7 RCALL _fnPR13
(0335) fnPR13(0x00);
055E 2700 CLR R16
055F DEF5 RCALL _fnPR13
(0336) }
0560 C004 RJMP 0x0565
(0337) else
(0338) {
(0339) fnPR13(0xff);
0561 EF0F LDI R16,0xFF
0562 DEF2 RCALL _fnPR13
(0340) fnPR13(0xff);
0563 EF0F LDI R16,0xFF
0564 DEF0 RCALL _fnPR13
(0341) }
(0342) }
(0343) fnPR12(LC_AUT_OVR);
0565 EB02 LDI R16,0xB2
0566 DEE2 RCALL _fnPR12
0567 01C5 MOVW R24,R10
0568 9601 ADIW R24,1
0569 015C MOVW R10,R24
056A 01C5 MOVW R24,R10
056B 3180 CPI R24,0x10
056C E0E0 LDI R30,0
056D 079E CPC R25,R30
056E F408 BCC 0x0570
056F CFCA RJMP 0x053A
(0344) }
(0345) uCol += 2;
0570 2D8E MOV R24,R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -