📄 ylf240128a.lst
字号:
(1270) NOP();NOP();NOP();NOP();NOP();
0339 0000 NOP
033A 0000 NOP
033B 0000 NOP
033C 0000 NOP
033D 0000 NOP
(1271) state=datain;
033E B300 IN R16,0x10
(1272) RD_SET;
033F 9AC4 SBI 0x18,4
(1273) DBOUT;
0340 EF8F LDI R24,0xFF
0341 BB81 OUT 0x11,R24
(1274) return state;
0342 9508 RET
(1275) }
(1276)
(1277) void STA01()
(1278) {//判断状态位是否0,1位为高,并等待置高
(1279) while((ReadState()&0x03)!=0x03)
_STA01:
0343 DFF1 RCALL _ReadState
0344 2F80 MOV R24,R16
0345 7083 ANDI R24,3
0346 3083 CPI R24,3
0347 F7D9 BNE 0x0343
0348 9508 RET
(1280) ;
(1281) }
(1282)
(1283) void STA3()
(1284) {//判断状态位是否3位为高,并等待置高
(1285) while((ReadState()&0x08)!=0x08)
_STA3:
0349 DFEB RCALL _ReadState
034A 2F80 MOV R24,R16
034B 7088 ANDI R24,0x8
034C 3088 CPI R24,0x8
034D F7D9 BNE 0x0349
034E 9508 RET
(1286) ;
(1287) }
(1288)
(1289) void WriteData(uchar dat)
(1290) {//把一位数据写入数据总线
(1291) CD_CLR;
_WriteData:
dat --> R16
034F 98C5 CBI 0x18,5
(1292) NOP();NOP();NOP();NOP();NOP();
0350 0000 NOP
0351 0000 NOP
0352 0000 NOP
0353 0000 NOP
0354 0000 NOP
(1293) dataout=dat;
0355 BB02 OUT 0x12,R16
(1294) WR_CLR;
0356 98C3 CBI 0x18,3
(1295) NOP();NOP();NOP();NOP();NOP();
0357 0000 NOP
0358 0000 NOP
0359 0000 NOP
035A 0000 NOP
035B 0000 NOP
(1296) WR_SET;
035C 9AC3 SBI 0x18,3
035D 9508 RET
(1297) }
(1298)
(1299) void WriteCmd(uchar cmd)
(1300) {//把一位命令字写入数据总线
(1301) CD_SET;
_WriteCmd:
cmd --> R16
035E 9AC5 SBI 0x18,5
(1302) NOP();NOP();NOP();NOP();NOP();
035F 0000 NOP
0360 0000 NOP
0361 0000 NOP
0362 0000 NOP
0363 0000 NOP
(1303) dataout=cmd;
0364 BB02 OUT 0x12,R16
(1304) WR_CLR;
0365 98C3 CBI 0x18,3
(1305) NOP();NOP();NOP();NOP();NOP();
0366 0000 NOP
0367 0000 NOP
0368 0000 NOP
0369 0000 NOP
036A 0000 NOP
(1306) WR_SET;
036B 9AC3 SBI 0x18,3
036C 9508 RET
_WriteTwoData:
cmd --> Y+4
dat2 --> R20
dat1 --> R22
036D 940E0555 CALL push_gset2
036F 2F42 MOV R20,R18
0370 2F60 MOV R22,R16
(1307) }
(1308)
(1309) void WriteTwoData(uchar dat1,uchar dat2,uchar cmd)
(1310) {//写入有两位数据的命令
(1311) STA01();
0371 DFD1 RCALL _STA01
(1312) WriteData(dat1);
0372 2F06 MOV R16,R22
0373 DFDB RCALL _WriteData
(1313) STA01();
0374 DFCE RCALL _STA01
(1314) WriteData(dat2);
0375 2F04 MOV R16,R20
0376 DFD8 RCALL _WriteData
(1315) STA01();
0377 DFCB RCALL _STA01
(1316) WriteCmd(cmd);
0378 810C LDD R16,Y+4
0379 DFE4 RCALL _WriteCmd
037A 940E0549 CALL pop_gset2
037C 9508 RET
_WriteOneData:
cmd --> R20
dat --> R22
037D 940E0555 CALL push_gset2
037F 2F42 MOV R20,R18
0380 2F60 MOV R22,R16
(1317) }
(1318)
(1319) void WriteOneData(uchar dat,uchar cmd)
(1320) {//写入有一位数据的命令
(1321) STA01();
0381 DFC1 RCALL _STA01
(1322) WriteData(dat);
0382 2F06 MOV R16,R22
0383 DFCB RCALL _WriteData
(1323) STA01();
0384 DFBE RCALL _STA01
(1324) WriteCmd(cmd);
0385 2F04 MOV R16,R20
0386 DFD7 RCALL _WriteCmd
0387 940E0549 CALL pop_gset2
0389 9508 RET
_LcdInit:
delay --> R20
038A 940E0557 CALL push_gset1
038C 9721 SBIW R28,1
(1325) }
(1326)
(1327) void LcdInit()
(1328) {//用于设置显示器的参数
(1329) uchar delay;
(1330) delay=255;
038D EF4F LDI R20,0xFF
(1331) RS_CLR;
038E 98DF CBI 0x1B,7
(1332) while(delay--);
038F 2E24 MOV R2,R20
0390 2433 CLR R3
0391 5041 SUBI R20,1
0392 2022 TST R2
0393 F7D9 BNE 0x038F
(1333) RS_SET;
0394 9ADF SBI 0x1B,7
(1334)
(1335) WriteTwoData(0x00,0x00,0x40);//设置文本显示区域首地址
0395 E480 LDI R24,0x40
0396 8388 STD Y+0,R24
0397 2722 CLR R18
0398 2700 CLR R16
0399 DFD3 RCALL _WriteTwoData
(1336) WriteTwoData(0x20,0x00,0x41);//设置文本显示区域宽度32
039A E481 LDI R24,0x41
039B 8388 STD Y+0,R24
039C 2722 CLR R18
039D E200 LDI R16,0x20
039E DFCE RCALL _WriteTwoData
(1337) WriteTwoData(0x00,0x08,0x42);//设置图形显示区域首地址
039F E482 LDI R24,0x42
03A0 8388 STD Y+0,R24
03A1 E028 LDI R18,0x8
03A2 2700 CLR R16
03A3 DFC9 RCALL _WriteTwoData
(1338) WriteTwoData(0x20,0x00,0x43);//设置文本显示区域宽度32
03A4 E483 LDI R24,0x43
03A5 8388 STD Y+0,R24
03A6 2722 CLR R18
03A7 E200 LDI R16,0x20
03A8 DFC4 RCALL _WriteTwoData
(1339)
(1340) STA01();
03A9 DF99 RCALL _STA01
(1341) WriteCmd(0xA7);//光标形状设置
03AA EA07 LDI R16,0xA7
03AB DFB2 RCALL _WriteCmd
(1342) STA01();
03AC DF96 RCALL _STA01
(1343) WriteCmd(0x80);//显示方式设置,逻辑"或"合成
03AD E800 LDI R16,0x80
03AE DFAF RCALL _WriteCmd
(1344) STA01();
03AF DF93 RCALL _STA01
(1345) WriteCmd(0x9C);//显示开关设置,文本、图形显示启用
03B0 E90C LDI R16,0x9C
03B1 DFAC RCALL _WriteCmd
(1346)
(1347) WriteTwoData(0x03,0x00,0x22);//设置CGRAM OFFSET地址 0000 0011
03B2 E282 LDI R24,0x22
03B3 8388 STD Y+0,R24
03B4 2722 CLR R18
03B5 E003 LDI R16,3
03B6 DFB6 RCALL _WriteTwoData
03B7 9621 ADIW R28,1
03B8 940E055A CALL pop_gset1
03BA 9508 RET
_ClearLcd:
count --> R20
03BB 940E0557 CALL push_gset1
03BD 9721 SBIW R28,1
(1348) }
(1349)
(1350) void ClearLcd()
(1351) {//用于清空显示器
(1352) uint count=512;
03BE E040 LDI R20,0
03BF E052 LDI R21,2
(1353) WriteTwoData(0x00,0x00,0x24);//设置显示RAM指针
03C0 E284 LDI R24,0x24
03C1 8388 STD Y+0,R24
03C2 2722 CLR R18
03C3 2700 CLR R16
03C4 DFA8 RCALL _WriteTwoData
(1354) WriteCmd(0xB0);//自动写方式
03C5 EB00 LDI R16,0xB0
03C6 DF97 RCALL _WriteCmd
03C7 C003 RJMP 0x03CB
(1355) while(count--)
(1356) {
(1357) STA3();
03C8 DF80 RCALL _STA3
(1358) WriteData(0x00);
03C9 2700 CLR R16
03CA DF84 RCALL _WriteData
03CB 011A MOVW R2,R20
03CC 5041 SUBI R20,1
03CD 4050 SBCI R21,0
03CE 2022 TST R2
03CF F7C1 BNE 0x03C8
03D0 2033 TST R3
03D1 F7B1 BNE 0x03C8
(1359) }
(1360) WriteCmd(0xB2);//结束自动写指令
03D2 EB02 LDI R16,0xB2
03D3 DF8A RCALL _WriteCmd
(1361)
(1362) count=4096;
03D4 E040 LDI R20,0
03D5 E150 LDI R21,0x10
(1363) WriteTwoData(0x00,0x08,0x24);//设置显示RAM首地址
03D6 E284 LDI R24,0x24
03D7 8388 STD Y+0,R24
03D8 E028 LDI R18,0x8
03D9 2700 CLR R16
03DA DF92 RCALL _WriteTwoData
(1364) WriteCmd(0xB0);//自动写方式
03DB EB00 LDI R16,0xB0
03DC DF81 RCALL _WriteCmd
03DD C003 RJMP 0x03E1
(1365) while(count--)
(1366) {
(1367) STA3();
03DE DF6A RCALL _STA3
(1368) WriteData(0x00);
03DF 2700 CLR R16
03E0 DF6E RCALL _WriteData
03E1 011A MOVW R2,R20
03E2 5041 SUBI R20,1
03E3 4050 SBCI R21,0
03E4 2022 TST R2
03E5 F7C1 BNE 0x03DE
03E6 2033 TST R3
03E7 F7B1 BNE 0x03DE
(1369) }
(1370) WriteCmd(0xB2);//结束自动写指令
03E8 EB02 LDI R16,0xB2
03E9 DF74 RCALL _WriteCmd
03EA 9621 ADIW R28,1
03EB 940E055A CALL pop_gset1
03ED 9508 RET
_CGRamGen:
round --> R20
num --> R22
text --> R10
03EE 940E0553 CALL push_gset3
03F0 0158 MOVW R10,R16
03F1 9721 SBIW R28,1
(1371) }
(1372)
(1373) //通过CGRAM写入用户个人的字符库
(1374) //16*16显示
(1375) //num表示写入库的字符的个数
(1376) //写入的数据放在CGTAB[]数组里
(1377) //CGTAB格式
(1378) //左半部分--右半部分
(1379) //其中code为从零开始的地址,text为字符数组
(1380) void CGRamGen(const uchar text[])
(1381) {//自动写入CGRAM,共128字符,num表示字符个数
(1382) uint num=0;
03F2 2766 CLR R22
03F3 2777 CLR R23
(1383) uint round;
(1384) WriteTwoData(0x00,0x1c,0x24);//设置地址指针 (0001 1)(100 0000 0)000
03F4 E284 LDI R24,0x24
03F5 8388 STD Y+0,R24
03F6 E12C LDI R18,0x1C
03F7 2700 CLR R16
03F8 DF74 RCALL _WriteTwoData
(1385) WriteCmd(0xB0);//自动写方式
03F9 EB00 LDI R16,0xB0
03FA DF63 RCALL _WriteCmd
(1386) for(round=0;round<10;round++)
03FB 2744 CLR R20
03FC 2755 CLR R21
03FD C03C RJMP 0x043A
(1387) {
(1388) num=16;
03FE E160 LDI R22,0x10
03FF E070 LDI R23,0
0400 C017 RJMP 0x0418
(1389) while(num)
(1390) {
(1391) STA3();
0401 DF47 RCALL _STA3
(1392) WriteData(text[32-num*2+round*32]);
0402 E002 LDI R16,2
0403 E010 LDI R17,0
0404 019B MOVW R18,R22
0405 940E0539 CALL empy16s
0407 E2E0 LDI R30,0x20
0408 E0F0 LDI R31,0
0409 1BE0 SUB R30,R16
040A 0BF1 SBC R31,R17
040B E200 LDI R16,0x20
040C E010 LDI R17,0
040D 019A MOVW R18,R20
040E 940E0539 CALL empy16s
0410 0FE0 ADD R30,R16
0411 1FF1 ADC R31,R17
0412 0DEA ADD R30,R10
0413 1DFB ADC R31,R11
0414 9104 LPM R16,0(Z)
0415 DF39 RCALL _WriteData
(1393) num--;
0416 5061 SUBI R22,1
0417 4070 SBCI R23,0
0418 3060 CPI R22,0
0419 0767 CPC R22,R23
041A F731 BNE 0x0401
(1394) }
(1395) num=16;
041B E160 LDI R22,0x10
041C E070 LDI R23,0
041D C017 RJMP 0x0435
(1396) while(num)
(1397) {
(1398) STA3();
041E DF2A RCALL _STA3
(1399) WriteData(text[33-num*2+round*32]);
041F E002 LDI R16,2
0420 E010 LDI R17,0
0421 019B MOVW R18,R22
0422 940E0539 CALL empy16s
0424 E2E1 LDI R30,0x21
0425 E0F0 LDI R31,0
0426 1BE0 SUB R30,R16
0427 0BF1 SBC R31,R17
0428 E200 LDI R16,0x20
0429 E010 LDI R17,0
042A 019A MOVW R18,R20
042B 940E0539 CALL empy16s
042D 0FE0 ADD R30,R16
042E 1FF1 ADC R31,R17
042F 0DEA ADD R30,R10
0430 1DFB ADC R31,R11
0431 9104 LPM R16,0(Z)
0432 DF1C RCALL _WriteData
(1400) num--;
0433 5061 SUBI R22,1
0434 4070 SBCI R23,0
0435 3060 CPI R22,0
0436 0767 CPC R22,R23
0437 F731 BNE 0x041E
0438 5F4F SUBI R20,0xFF
0439 4F5F SBCI R21,0xFF
043A 304A CPI R20,0xA
043B E0E0 LDI R30,0
043C 075E CPC R21,R30
043D F408 BCC 0x043F
043E CFBF RJMP 0x03FE
(1401) }
(1402) }
(1403) WriteCmd(0xB2);//结束自动写
043F EB02 LDI R16,0xB2
0440 DF1D RCALL _WriteCmd
0441 9621 ADIW R28,1
0442 940E054C CALL pop_gset3
0444 9508 RET
_DispChinaCode:
temp --> R22
code --> R20
o_y --> R22
o_x --> R10
0445 940E0553 CALL push_gset3
0447 2F62 MOV R22,R18
0448 2EA0 MOV R10,R16
0449 9721 SBIW R28,1
044A 814F LDD R20,Y+7
(1404) }
(1405)
(1406) /*void CGRamGenTry(const uchar text[])
(1407) {//自动写入CGRAM,共128字符,num表示字符个数
(1408) uint num=0;
(1409) WriteTwoData(0x00,0x1c,0x24);//设置地址指针 (0001 1)(100 0000 0)000
(1410) WriteCmd(0xB0);//自动写方式
(1411) num=320;
(1412) while(num)
(1413) {
(1414) STA3();
(1415) WriteData(text[320-num]);
(1416) num--;
(1417) }
(1418) WriteCmd(0xB2);//结束自动写
(1419) }
(1420) */
(1421)
(1422) //通过CGRAM写入字符图层,位置为8*8字符行和列
(1423) void DispChinaCode(uchar o_x,uchar o_y,uchar code)
(1424) {//设置在x,y位置显示code代码的字符
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -