📄 qingxi.lst
字号:
(0476) {
(0477) lcd_wd(lcd_data1);
0D06 2F06 MOV R16,R22
0D07 DFC5 RCALL _lcd_wd
(0478) lcd_wc(lcd_code);
0D08 2F04 MOV R16,R20
0D09 DFD9 RCALL _lcd_wc
0D0A 940E1363 CALL pop_gset2
0D0C 9508 RET
(0479) }
(0480)
(0481)
(0482)
(0483) /*
(0484) uchar fnST3(void) // 状态位ST3判断(数据自动写状态)
(0485) {
(0486) uchar data i;
(0487)
(0488) for(i=10;i>0;i--)
(0489) {
(0490) if((LCMCW & 0x08) == 0x08)
(0491) break;
(0492) }
(0493) return i; // 若返回零,说明错误
(0494) }
(0495) */
(0496)
(0497) uchar fnST3(void) // 状态位ST3判断(数据自动写状态)
(0498) {
(0499) uchar i;
(0500)
(0501) for(i=10;i>0;i--)
_fnST3:
i --> R16
0D0D E00A LDI R16,0xA
0D0E C001 RJMP 0x0D10
0D0F 950A DEC R16
0D10 2422 CLR R2
0D11 1620 CP R2,R16
0D12 F000 BCS 0x0D13
(0502) {
(0503)
(0504) //if((LCMCW & 0x08) == 0x08)
(0505) break;
(0506) }
(0507) return i; // 若返回零,说明错误
0D13 9508 RET
(0508) }
(0509)
(0510)
(0511)
(0512) uchar fnGetRow(void)
(0513) {
(0514) return gCurRow;
_fnGetRow:
0D14 91000167 LDS R16,gCurRow
0D16 9508 RET
(0515) }
(0516)
(0517) uchar fnGetCol(void)
(0518) {
(0519) return gCurCol;
_fnGetCol:
0D17 91000166 LDS R16,gCurCol
0D19 9508 RET
_fnSetPos:
iPos --> R10
ucol --> R20
urow --> R22
0D1A 940E1373 CALL push_gset3
0D1C 2F42 MOV R20,R18
0D1D 2F60 MOV R22,R16
0D1E 9721 SBIW R28,1
(0520) }
(0521)
(0522) // 设置当前地址
(0523) void fnSetPos(uchar urow, uchar ucol)
(0524) {
(0525) uint iPos;
(0526) iPos = urow * 30 + ucol;
0D1F E18E LDI R24,0x1E
0D20 9F86 MUL R24,R22
0D21 0150 MOVW R10,R0
0D22 2E24 MOV R2,R20
0D23 2433 CLR R3
0D24 0CA2 ADD R10,R2
0D25 1CB3 ADC R11,R3
(0527) lcd_wc3(LC_ADD_POS,iPos & 0xFF,iPos / 256);
0D26 0115 MOVW R2,R10
0D27 2C23 MOV R2,R3
0D28 2433 CLR R3
0D29 8228 STD Y+0,R2
0D2A 2D2A MOV R18,R10
0D2B 7030 ANDI R19,0
0D2C E204 LDI R16,0x24
0D2D DFC7 RCALL _lcd_wc3
(0528) gCurRow = urow;
0D2E 93600167 STS gCurRow,R22
(0529) gCurCol = ucol;
0D30 93400166 STS gCurCol,R20
0D32 9621 ADIW R28,1
0D33 940E1366 CALL pop_gset3
0D35 9508 RET
_cursor:
uCol --> R22
uRow --> R20
0D36 940E1375 CALL push_gset2
0D38 2F62 MOV R22,R18
0D39 2F40 MOV R20,R16
(0530) }
(0531)
(0532) // 设置当前显示行、列
(0533) void cursor(uchar uRow, uchar uCol)
(0534) {
(0535) fnSetPos(uRow * 16, uCol);
0D3A 2F26 MOV R18,R22
0D3B E180 LDI R24,0x10
0D3C 9F84 MUL R24,R20
0D3D 2D00 MOV R16,R0
0D3E DFDB RCALL _fnSetPos
0D3F 940E1363 CALL pop_gset2
0D41 9508 RET
_clsrows:
baddr --> Y+1
i --> R20
erow --> R22
brow --> R10
0D42 940E1373 CALL push_gset3
0D44 2F62 MOV R22,R18
0D45 2EA0 MOV R10,R16
0D46 9723 SBIW R28,3
(0536) }
(0537)
(0538) //清汉字行函数,参数1起始行,参数2终止行
(0539) void clsrows(uchar brow,uchar erow)
(0540) {
(0541) uint i;
(0542) union address baddr;
(0543) baddr.a = 480*brow;
0D47 2D2A MOV R18,R10
0D48 2733 CLR R19
0D49 EE00 LDI R16,0xE0
0D4A E011 LDI R17,1
0D4B 940E1353 CALL empy16s
0D4D 831A STD Y+2,R17
0D4E 8309 STD Y+1,R16
(0544) lcd_wc3(LC_ADD_POS,baddr.apart.al,baddr.apart.ah);
0D4F 2E20 MOV R2,R16
0D50 8228 STD Y+0,R2
0D51 812A LDD R18,Y+2
0D52 E204 LDI R16,0x24
0D53 DFA1 RCALL _lcd_wc3
(0545) lcd_wc(LC_AUT_WR);
0D54 EB00 LDI R16,0xB0
0D55 DF8D RCALL _lcd_wc
(0546) for(i=0;i<(erow-brow)*30;i++)
0D56 2744 CLR R20
0D57 2755 CLR R21
0D58 C005 RJMP 0x0D5E
(0547) {
(0548) fnST3();
0D59 DFB3 RCALL _fnST3
(0549) lcd_wd(0x00);
0D5A 2700 CLR R16
0D5B DF71 RCALL _lcd_wd
0D5C 5F4F SUBI R20,0xFF
0D5D 4F5F SBCI R21,0xFF
0D5E 2E26 MOV R2,R22
0D5F 182A SUB R2,R10
0D60 E18E LDI R24,0x1E
0D61 9D82 MUL R24,R2
0D62 1540 CP R20,R0
0D63 0551 CPC R21,R1
0D64 F3A0 BCS 0x0D59
(0550) }
(0551) lcd_wc(LC_AUT_OVR);
0D65 EB02 LDI R16,0xB2
0D66 DF7C RCALL _lcd_wc
(0552) lcd_wc3(LC_ADD_POS,baddr.apart.al,baddr.apart.ah);
0D67 8029 LDD R2,Y+1
0D68 8228 STD Y+0,R2
0D69 812A LDD R18,Y+2
0D6A E204 LDI R16,0x24
0D6B DF89 RCALL _lcd_wc3
(0553) gCurRow = brow<<4;
0D6C 2D8A MOV R24,R10
0D6D 708F ANDI R24,0xF
0D6E 9582 SWAP R24
0D6F 93800167 STS gCurRow,R24
(0554) gCurCol = 0;
0D71 2422 CLR R2
0D72 92200166 STS gCurCol,R2
0D74 9623 ADIW R28,3
0D75 940E1366 CALL pop_gset3
0D77 9508 RET
_fnLCMInit:
0D78 9721 SBIW R28,1
(0555) }
(0556)
(0557)
(0558) void fnLCMInit(void)
(0559) {
(0560) lcd_wc3(LC_TXT_STP,0x00,0x0f); // 文本显示区首地址 10
0D79 E08F LDI R24,0xF
0D7A 8388 STD Y+0,R24
0D7B 2722 CLR R18
0D7C E400 LDI R16,0x40
0D7D DF77 RCALL _lcd_wc3
(0561) lcd_wc3(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
0D7E 2422 CLR R2
0D7F 8228 STD Y+0,R2
0D80 E12E LDI R18,0x1E
0D81 E401 LDI R16,0x41
0D82 DF72 RCALL _lcd_wc3
(0562) lcd_wc3(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
0D83 2422 CLR R2
0D84 8228 STD Y+0,R2
0D85 2722 CLR R18
0D86 E402 LDI R16,0x42
0D87 DF6D RCALL _lcd_wc3
(0563) lcd_wc3(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
0D88 2422 CLR R2
0D89 8228 STD Y+0,R2
0D8A E12E LDI R18,0x1E
0D8B E403 LDI R16,0x43
0D8C DF68 RCALL _lcd_wc3
(0564) lcd_wc(LC_CUR_SHP | 0x00); // 光标形状
0D8D EA01 LDI R16,0xA1
0D8E DF54 RCALL _lcd_wc
(0565) lcd_wc3(LC_CGR_POS,0x03,0x00); //CGRAM设置
0D8F 2422 CLR R2
0D90 8228 STD Y+0,R2
0D91 E023 LDI R18,3
0D92 E202 LDI R16,0x22
0D93 DF61 RCALL _lcd_wc3
(0566) lcd_wc(LC_MOD_OR); // 显示方式设置
0D94 E800 LDI R16,0x80
0D95 DF4D RCALL _lcd_wc
(0567) lcd_wc(0x9f); // 显示开关设置
0D96 E90F LDI R16,0x9F
0D97 DF4B RCALL _lcd_wc
0D98 9621 ADIW R28,1
0D99 9508 RET
_lcd_init:
0D9A 9721 SBIW R28,1
(0568) }
(0569)
(0570)
(0571) /***********************************************************************************/
(0572) void lcd_init(void)
(0573) {
(0574) LCD_RES_H;
0D9B 9A96 SBI 0x12,6
(0575) LCD_RES_L; //低电平复位
0D9C 9896 CBI 0x12,6
(0576) delay_ms(30);
0D9D E10E LDI R16,0x1E
0D9E E010 LDI R17,0
0D9F DE2A RCALL _delay_ms
(0577) LCD_RES_H;
0DA0 9A96 SBI 0x12,6
(0578) lcd_wc(0x80); //设置显示模式为逻辑“或”模式
0DA1 E800 LDI R16,0x80
0DA2 DF40 RCALL _lcd_wc
(0579) lcd_wc(0x98); //开显示
0DA3 E908 LDI R16,0x98
0DA4 DF3E RCALL _lcd_wc
(0580) lcd_wc3(0x40,0,0); //设置文本显示区首地址
0DA5 2422 CLR R2
0DA6 8228 STD Y+0,R2
0DA7 2722 CLR R18
0DA8 E400 LDI R16,0x40
0DA9 DF4B RCALL _lcd_wc3
(0581) lcd_wc3(0x41,30,0); //设置文本显示区宽度
0DAA 2422 CLR R2
0DAB 8228 STD Y+0,R2
0DAC E12E LDI R18,0x1E
0DAD E401 LDI R16,0x41
0DAE DF46 RCALL _lcd_wc3
(0582) lcd_wc3(0x42,0,0); //设置图形显示区首地址
0DAF 2422 CLR R2
0DB0 8228 STD Y+0,R2
0DB1 2722 CLR R18
0DB2 E402 LDI R16,0x42
0DB3 DF41 RCALL _lcd_wc3
(0583) lcd_wc3(0x43,30,0); //设置图形显示区宽度
0DB4 2422 CLR R2
0DB5 8228 STD Y+0,R2
0DB6 E12E LDI R18,0x1E
0DB7 E403 LDI R16,0x43
0DB8 DF3C RCALL _lcd_wc3
(0584) lcd_wc3(LC_TXT_STP,0x00,0x0f) ; // 文本显示区首地址 10
0DB9 E08F LDI R24,0xF
0DBA 8388 STD Y+0,R24
0DBB 2722 CLR R18
0DBC E400 LDI R16,0x40
0DBD DF37 RCALL _lcd_wc3
(0585) lcd_wc3(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
0DBE 2422 CLR R2
0DBF 8228 STD Y+0,R2
0DC0 E12E LDI R18,0x1E
0DC1 E401 LDI R16,0x41
0DC2 DF32 RCALL _lcd_wc3
(0586) lcd_wc3(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
0DC3 2422 CLR R2
0DC4 8228 STD Y+0,R2
0DC5 2722 CLR R18
0DC6 E402 LDI R16,0x42
0DC7 DF2D RCALL _lcd_wc3
(0587) lcd_wc3(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
0DC8 2422 CLR R2
0DC9 8228 STD Y+0,R2
0DCA E12E LDI R18,0x1E
0DCB E403 LDI R16,0x43
0DCC DF28 RCALL _lcd_wc3
(0588) lcd_wc(LC_CUR_SHP | 0x00); // 光标形状
0DCD EA01 LDI R16,0xA1
0DCE DF14 RCALL _lcd_wc
(0589) lcd_wc3(LC_CGR_POS,0x03,0x00); //CGRAM设置
0DCF 2422 CLR R2
0DD0 8228 STD Y+0,R2
0DD1 E023 LDI R18,3
0DD2 E202 LDI R16,0x22
0DD3 DF21 RCALL _lcd_wc3
(0590) lcd_wc(LC_MOD_OR); // 显示方式设置
0DD4 E800 LDI R16,0x80
0DD5 DF0D RCALL _lcd_wc
(0591) lcd_wc(0x9C); // 显示开关设置,允许文本图形显示,关闭光标
0DD6 E90C LDI R16,0x9C
0DD7 DF0B RCALL _lcd_wc
0DD8 9621 ADIW R28,1
0DD9 9508 RET
_cls:
i --> R20
0DDA 940E1377 CALL push_gset1
0DDC 9721 SBIW R28,1
(0592) }
(0593)
(0594)
(0595)
(0596) // 清屏
(0597) void cls(void)
(0598) {
(0599) uint i;
(0600) lcd_init(); // 调用初始化
0DDD DFBC RCALL _lcd_init
(0601) lcd_wc3(LC_ADD_POS,0x00,0x00); // 置地址指针
0DDE 2422 CLR R2
0DDF 8228 STD Y+0,R2
0DE0 2722 CLR R18
0DE1 E204 LDI R16,0x24
0DE2 DF12 RCALL _lcd_wc3
(0602) lcd_wc(LC_AUT_WR); // 自动写
0DE3 EB00 LDI R16,0xB0
0DE4 DEFE RCALL _lcd_wc
(0603) for(i=0;i<4608;i++)
0DE5 2744 CLR R20
0DE6 2755 CLR R21
0DE7 C004 RJMP 0x0DEC
(0604) {
(0605) lcd_wd(0x00); // 写数据
0DE8 2700 CLR R16
0DE9 DEE3 RCALL _lcd_wd
0DEA 5F4F SUBI R20,0xFF
0DEB 4F5F SBCI R21,0xFF
0DEC 3040 CPI R20,0
0DED E1E2 LDI R30,0x12
0DEE 075E CPC R21,R30
0DEF F3C0 BCS 0x0DE8
(0606) }
(0607) lcd_wc(LC_AUT_OVR); // 自动写结束
0DF0 EB02 LDI R16,0xB2
0DF1 DEF1 RCALL _lcd_wc
(0608) lcd_wc3(LC_ADD_POS,0x00,0x00); // 重置地址指针
0DF2 2422 CLR R2
0DF3 8228 STD Y+0,R2
0DF4 2722 CLR R18
0DF5 E204 LDI R16,0x24
0DF6 DEFE RCALL _lcd_wc3
(0609) gCurRow = 0; // 置地址指针存储变量
0DF7 2422 CLR R2
0DF8 92200167 STS gCurRow,R2
(0610) gCurCol = 0;
0DFA 92200166 STS gCurCol,R2
0DFC 9621 ADIW R28,1
0DFD 940E137A CALL pop_gset1
0DFF 9508 RET
_lcd_fill:
i --> R20
j --> R10
lcd_data --> R22
0E00 940E1373 CALL push_gset3
0E02 2F60 MOV R22,R16
0E03 9721 SBIW R28,1
(0611) }
(0612)
(0613)
(0614)
(0615)
(0616) /***********************************************************************************/
(0617) void lcd_fill(uchar lcd_data)
(0618) {
(0619) uchar i,j;
(0620) lcd_wc(0x98); /* 打开图形显示,关闭文本显示 */
0E04 E908 LDI R16,0x98
0E05 DEDD RCALL _lcd_wc
(0621) lcd_wc3(0x24,0,0); /* 设置地址指针 */
0E06 2422 CLR R2
0E07 8228 STD Y+0,R2
0E08 2722 CLR R18
0E09 E204 LDI R16,0x24
0E0A DEEA RCALL _lcd_wc3
(0622) lcd_wc(0xb0); /* 设置自动写数据 */
0E0B EB00 LDI R16,0xB0
0E0C DED6 RCALL _lcd_wc
(0623) for(i=0;i<128;i++)
0E0D 2744 CLR R20
0E0E C009 RJMP 0x0E18
(0624) {
(0625) for(j=0;j<30;j++)
0E0F 24AA CLR R10
0E10 C003 RJMP 0x0E14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -