📄 ylf240128a.lst
字号:
cmd --> R16
036C 9ADA SBI 0x1B,2
(1287) NOP();NOP();NOP();NOP();NOP();
036D 0000 NOP
036E 0000 NOP
036F 0000 NOP
0370 0000 NOP
0371 0000 NOP
(1288) dataout=cmd;
0372 BB08 OUT 0x18,R16
(1289) WR_CLR;
0373 98D8 CBI 0x1B,0
(1290) NOP();NOP();NOP();NOP();NOP();
0374 0000 NOP
0375 0000 NOP
0376 0000 NOP
0377 0000 NOP
0378 0000 NOP
(1291) WR_SET;
0379 9AD8 SBI 0x1B,0
037A 9508 RET
_WriteTwoData:
cmd --> Y+4
dat2 --> R20
dat1 --> R22
037B 940E05CE CALL push_gset2
037D 2F42 MOV R20,R18
037E 2F60 MOV R22,R16
(1292) }
(1293)
(1294) void WriteTwoData(uchar dat1,uchar dat2,uchar cmd)
(1295) {//写入有两位数据的命令
(1296) STA01();
037F DFD1 RCALL _STA01
(1297) WriteData(dat1);
0380 2F06 MOV R16,R22
0381 DFDB RCALL _WriteData
(1298) STA01();
0382 DFCE RCALL _STA01
(1299) WriteData(dat2);
0383 2F04 MOV R16,R20
0384 DFD8 RCALL _WriteData
(1300) STA01();
0385 DFCB RCALL _STA01
(1301) WriteCmd(cmd);
0386 810C LDD R16,Y+4
0387 DFE4 RCALL _WriteCmd
0388 940E05C2 CALL pop_gset2
038A 9508 RET
_WriteOneData:
cmd --> R20
dat --> R22
038B 940E05CE CALL push_gset2
038D 2F42 MOV R20,R18
038E 2F60 MOV R22,R16
(1302) }
(1303)
(1304) void WriteOneData(uchar dat,uchar cmd)
(1305) {//写入有一位数据的命令
(1306) STA01();
038F DFC1 RCALL _STA01
(1307) WriteData(dat);
0390 2F06 MOV R16,R22
0391 DFCB RCALL _WriteData
(1308) STA01();
0392 DFBE RCALL _STA01
(1309) WriteCmd(cmd);
0393 2F04 MOV R16,R20
0394 DFD7 RCALL _WriteCmd
0395 940E05C2 CALL pop_gset2
0397 9508 RET
_LcdInit:
delay --> R20
0398 940E05D0 CALL push_gset1
039A 9721 SBIW R28,1
(1310) }
(1311)
(1312) void LcdInit()
(1313) {//用于设置显示器的参数
(1314) uchar delay;
(1315) delay=255;
039B EF4F LDI R20,0xFF
(1316) RS_CLR;
039C 98DB CBI 0x1B,3
(1317) while(delay--);
039D 2E24 MOV R2,R20
039E 2433 CLR R3
039F 5041 SUBI R20,1
03A0 2022 TST R2
03A1 F7D9 BNE 0x039D
(1318) RS_SET;
03A2 9ADB SBI 0x1B,3
(1319)
(1320) WriteTwoData(0x00,0x00,0x40);//设置文本显示区域首地址
03A3 E480 LDI R24,0x40
03A4 8388 STD Y+0,R24
03A5 2722 CLR R18
03A6 2700 CLR R16
03A7 DFD3 RCALL _WriteTwoData
(1321) WriteTwoData(0x20,0x00,0x41);//设置文本显示区域宽度32
03A8 E481 LDI R24,0x41
03A9 8388 STD Y+0,R24
03AA 2722 CLR R18
03AB E200 LDI R16,0x20
03AC DFCE RCALL _WriteTwoData
(1322) WriteTwoData(0x00,0x08,0x42);//设置图形显示区域首地址
03AD E482 LDI R24,0x42
03AE 8388 STD Y+0,R24
03AF E028 LDI R18,0x8
03B0 2700 CLR R16
03B1 DFC9 RCALL _WriteTwoData
(1323) WriteTwoData(0x20,0x00,0x43);//设置文本显示区域宽度32
03B2 E483 LDI R24,0x43
03B3 8388 STD Y+0,R24
03B4 2722 CLR R18
03B5 E200 LDI R16,0x20
03B6 DFC4 RCALL _WriteTwoData
(1324)
(1325) STA01();
03B7 DF99 RCALL _STA01
(1326) WriteCmd(0xA7);//光标形状设置
03B8 EA07 LDI R16,0xA7
03B9 DFB2 RCALL _WriteCmd
(1327) STA01();
03BA DF96 RCALL _STA01
(1328) WriteCmd(0x80);//显示方式设置,逻辑"或"合成
03BB E800 LDI R16,0x80
03BC DFAF RCALL _WriteCmd
(1329) STA01();
03BD DF93 RCALL _STA01
(1330) WriteCmd(0x9C);//显示开关设置,文本、图形显示启用
03BE E90C LDI R16,0x9C
03BF DFAC RCALL _WriteCmd
(1331)
(1332) WriteTwoData(0x03,0x00,0x22);//设置CGRAM OFFSET地址 0000 0011
03C0 E282 LDI R24,0x22
03C1 8388 STD Y+0,R24
03C2 2722 CLR R18
03C3 E003 LDI R16,3
03C4 DFB6 RCALL _WriteTwoData
03C5 9621 ADIW R28,1
03C6 940E05D3 CALL pop_gset1
03C8 9508 RET
_ClearLcd:
count --> R20
03C9 940E05D0 CALL push_gset1
03CB 9721 SBIW R28,1
(1333) }
(1334)
(1335) void ClearLcd()
(1336) {//用于清空显示器
(1337) uint count=512;
03CC E040 LDI R20,0
03CD E052 LDI R21,2
(1338) WriteTwoData(0x00,0x00,0x24);//设置显示RAM指针
03CE E284 LDI R24,0x24
03CF 8388 STD Y+0,R24
03D0 2722 CLR R18
03D1 2700 CLR R16
03D2 DFA8 RCALL _WriteTwoData
(1339) WriteCmd(0xB0);//自动写方式
03D3 EB00 LDI R16,0xB0
03D4 DF97 RCALL _WriteCmd
03D5 C003 RJMP 0x03D9
(1340) while(count--)
(1341) {
(1342) STA3();
03D6 DF80 RCALL _STA3
(1343) WriteData(0x00);
03D7 2700 CLR R16
03D8 DF84 RCALL _WriteData
03D9 011A MOVW R2,R20
03DA 5041 SUBI R20,1
03DB 4050 SBCI R21,0
03DC 2022 TST R2
03DD F7C1 BNE 0x03D6
03DE 2033 TST R3
03DF F7B1 BNE 0x03D6
(1344) }
(1345) WriteCmd(0xB2);//结束自动写指令
03E0 EB02 LDI R16,0xB2
03E1 DF8A RCALL _WriteCmd
(1346)
(1347) count=4096;
03E2 E040 LDI R20,0
03E3 E150 LDI R21,0x10
(1348) WriteTwoData(0x00,0x08,0x24);//设置显示RAM首地址
03E4 E284 LDI R24,0x24
03E5 8388 STD Y+0,R24
03E6 E028 LDI R18,0x8
03E7 2700 CLR R16
03E8 DF92 RCALL _WriteTwoData
(1349) WriteCmd(0xB0);//自动写方式
03E9 EB00 LDI R16,0xB0
03EA DF81 RCALL _WriteCmd
03EB C003 RJMP 0x03EF
(1350) while(count--)
(1351) {
(1352) STA3();
03EC DF6A RCALL _STA3
(1353) WriteData(0x00);
03ED 2700 CLR R16
03EE DF6E RCALL _WriteData
03EF 011A MOVW R2,R20
03F0 5041 SUBI R20,1
03F1 4050 SBCI R21,0
03F2 2022 TST R2
03F3 F7C1 BNE 0x03EC
03F4 2033 TST R3
03F5 F7B1 BNE 0x03EC
(1354) }
(1355) WriteCmd(0xB2);//结束自动写指令
03F6 EB02 LDI R16,0xB2
03F7 DF74 RCALL _WriteCmd
03F8 9621 ADIW R28,1
03F9 940E05D3 CALL pop_gset1
03FB 9508 RET
_CGRamGen:
round --> R20
num --> R22
text --> R10
03FC 940E05CC CALL push_gset3
03FE 0158 MOVW R10,R16
03FF 9721 SBIW R28,1
(1356) }
(1357)
(1358) //通过CGRAM写入用户个人的字符库
(1359) //16*16显示
(1360) //num表示写入库的字符的个数
(1361) //写入的数据放在CGTAB[]数组里
(1362) //CGTAB格式
(1363) //左半部分--右半部分
(1364) //其中code为从零开始的地址,text为字符数组
(1365) void CGRamGen(const uchar text[])
(1366) {//自动写入CGRAM,共128字符,num表示字符个数
(1367) uint num=0;
0400 2766 CLR R22
0401 2777 CLR R23
(1368) uint round;
(1369) WriteTwoData(0x00,0x1c,0x24);//设置地址指针 (0001 1)(100 0000 0)000
0402 E284 LDI R24,0x24
0403 8388 STD Y+0,R24
0404 E12C LDI R18,0x1C
0405 2700 CLR R16
0406 DF74 RCALL _WriteTwoData
(1370) WriteCmd(0xB0);//自动写方式
0407 EB00 LDI R16,0xB0
0408 DF63 RCALL _WriteCmd
(1371) for(round=0;round<10;round++)
0409 2744 CLR R20
040A 2755 CLR R21
040B C03C RJMP 0x0448
(1372) {
(1373) num=16;
040C E160 LDI R22,0x10
040D E070 LDI R23,0
040E C017 RJMP 0x0426
(1374) while(num)
(1375) {
(1376) STA3();
040F DF47 RCALL _STA3
(1377) WriteData(text[32-num*2+round*32]);
0410 E002 LDI R16,2
0411 E010 LDI R17,0
0412 019B MOVW R18,R22
0413 940E05B2 CALL empy16s
0415 E2E0 LDI R30,0x20
0416 E0F0 LDI R31,0
0417 1BE0 SUB R30,R16
0418 0BF1 SBC R31,R17
0419 E200 LDI R16,0x20
041A E010 LDI R17,0
041B 019A MOVW R18,R20
041C 940E05B2 CALL empy16s
041E 0FE0 ADD R30,R16
041F 1FF1 ADC R31,R17
0420 0DEA ADD R30,R10
0421 1DFB ADC R31,R11
0422 9104 LPM R16,0(Z)
0423 DF39 RCALL _WriteData
(1378) num--;
0424 5061 SUBI R22,1
0425 4070 SBCI R23,0
0426 3060 CPI R22,0
0427 0767 CPC R22,R23
0428 F731 BNE 0x040F
(1379) }
(1380) num=16;
0429 E160 LDI R22,0x10
042A E070 LDI R23,0
042B C017 RJMP 0x0443
(1381) while(num)
(1382) {
(1383) STA3();
042C DF2A RCALL _STA3
(1384) WriteData(text[33-num*2+round*32]);
042D E002 LDI R16,2
042E E010 LDI R17,0
042F 019B MOVW R18,R22
0430 940E05B2 CALL empy16s
0432 E2E1 LDI R30,0x21
0433 E0F0 LDI R31,0
0434 1BE0 SUB R30,R16
0435 0BF1 SBC R31,R17
0436 E200 LDI R16,0x20
0437 E010 LDI R17,0
0438 019A MOVW R18,R20
0439 940E05B2 CALL empy16s
043B 0FE0 ADD R30,R16
043C 1FF1 ADC R31,R17
043D 0DEA ADD R30,R10
043E 1DFB ADC R31,R11
043F 9104 LPM R16,0(Z)
0440 DF1C RCALL _WriteData
(1385) num--;
0441 5061 SUBI R22,1
0442 4070 SBCI R23,0
0443 3060 CPI R22,0
0444 0767 CPC R22,R23
0445 F731 BNE 0x042C
0446 5F4F SUBI R20,0xFF
0447 4F5F SBCI R21,0xFF
0448 304A CPI R20,0xA
0449 E0E0 LDI R30,0
044A 075E CPC R21,R30
044B F408 BCC 0x044D
044C CFBF RJMP 0x040C
(1386) }
(1387) }
(1388) WriteCmd(0xB2);//结束自动写
044D EB02 LDI R16,0xB2
044E DF1D RCALL _WriteCmd
044F 9621 ADIW R28,1
0450 940E05C5 CALL pop_gset3
0452 9508 RET
_CGRamGenTry:
num --> R20
text --> R22
0453 940E05CE CALL push_gset2
0455 01B8 MOVW R22,R16
0456 9721 SBIW R28,1
(1389) }
(1390)
(1391) void CGRamGenTry(const uchar text[])
(1392) {//自动写入CGRAM,共128字符,num表示字符个数
(1393) uint num=0;
0457 2744 CLR R20
0458 2755 CLR R21
(1394) WriteTwoData(0x00,0x1c,0x24);//设置地址指针 (0001 1)(100 0000 0)000
0459 E284 LDI R24,0x24
045A 8388 STD Y+0,R24
045B E12C LDI R18,0x1C
045C 2700 CLR R16
045D DF1D RCALL _WriteTwoData
(1395) WriteCmd(0xB0);//自动写方式
045E EB00 LDI R16,0xB0
045F DF0C RCALL _WriteCmd
(1396) num=320;
0460 E440 LDI R20,0x40
0461 E051 LDI R21,1
0462 C00B RJMP 0x046E
(1397) while(num)
(1398) {
(1399) STA3();
0463 DEF3 RCALL _STA3
(1400) WriteData(text[320-num]);
0464 E4E0 LDI R30,0x40
0465 E0F1 LDI R31,1
0466 1BE4 SUB R30,R20
0467 0BF5 SBC R31,R21
0468 0FE6 ADD R30,R22
0469 1FF7 ADC R31,R23
046A 9104 LPM R16,0(Z)
046B DEF1 RCALL _WriteData
(1401) num--;
046C 5041 SUBI R20,1
046D 4050 SBCI R21,0
046E 3040 CPI R20,0
046F 0745 CPC R20,R21
0470 F791 BNE 0x0463
(1402) }
(1403) WriteCmd(0xB2);//结束自动写
0471 EB02 LDI R16,0xB2
0472 DEF9 RCALL _WriteCmd
0473 9621 ADIW R28,1
0474 940E05C2 CALL pop_gset2
0476 9508 RET
_DispChinaCode:
temp --> R22
code --> R20
o_y --> R22
o_x --> R10
0477 940E05CC CALL push_gset3
0479 2F62 MOV R22,R18
047A 2EA0 MOV R10,R16
047B 9721 SBIW R28,1
047C 814F LDD R20,Y+7
(1404) }
(1405)
(1406) //通过CGRAM写入字符图层,位置为8*8字符行和列
(1407) void DispChinaCode(uchar o_x,uchar o_y,uchar code)
(1408) {//设置在x,y位置显示code代码的字符
(1409) uint temp;
(1410) temp=32*o_y;
047D E280 LDI R24,0x20
047E 9F86 MUL R24,R22
047F 01B0 MOVW R22,R0
(1411) temp=temp+o_x;//得到位置存储器
0480 2C2A MOV R2,R10
0481 2433 CLR R3
0482 0D62 ADD R22,R2
0483 1D73 ADC R23,R3
(1412) temp=temp+0x00;//加上字符区启始位置
(1413) WriteTwoData((uchar)temp,(uchar)(temp>>8),0x24);//设置地址指针
0484 E284 LDI R24,0x24
0485 8388 STD Y+0,R24
0486 019B MOVW R18,R22
0487 2F23 MOV R18,R19
0488 2733 CLR R19
0489 2F06 MOV R16,R22
048A DEF0 RCALL _WriteTwoData
(1414) WriteOneData(code,0xc0);//数据写,地址加1
048B EC20 LDI R18,0xC0
048C 2F04 MOV R16,R20
048D DEFD RCALL _WriteOneData
(1415) WriteOneData(code+2,0xc0);//数据写,地址加1
048E EC20 LDI R18,0xC0
048F 2F04 MOV R16,R20
0490 5F0E SUBI R16,0xFE
0491 DEF9 RCALL _WriteOneData
(1416) temp+=32;
0492 5E60 SUBI R22,0xE0
0493 4F7F SBCI R23,0xFF
(1417) WriteTwoData((uchar)temp,(uchar)(temp>>8),0x24);//设置地址指针
0494 E284 LDI R24,0x24
0495 8388 STD Y+0,R24
0496 019B MOVW R18,R22
0497 2F23 MOV R18,R19
0498 2733 CLR R19
0499 2F06 MOV R16,R22
049A DEE0 RCALL _WriteTwoData
(1418) WriteOneData(code+1,0xc0);//数据写,地址加1
049B EC20 LDI R18,0xC0
049C 2F04 MOV R16,R20
049D 5F0F SUBI R16,0xFF
049E DEEC RCALL _WriteOneData
(1419) WriteOneData(code+3,0xc0);//数据写,地址加1
049F EC20 LDI R18,0xC0
04A0 2F04 MOV R16,R20
04A1 5F0D SUBI R16,0xFD
04A2 DEE8 RCALL _WriteOneData
04A3 9621 ADIW R28,1
04A4 940E05C5 CALL pop_gset3
04A6 9508 RET
_DispChinaPic16:
num --> R20
temp --> R22
disp --> R10
o_y --> R22
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -