⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ylf240128a.lst

📁 自己编制的北京友力发公司的液晶显示模块驱动程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
  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 + -