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

📄 ylf240128a.lst

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