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

📄 t6963.lst

📁 LCD菜单的仿真及程序AVR_T6963.rar
💻 LST
📖 第 1 页 / 共 4 页
字号:
    045E 2700      CLR	R16
    045F D311      RCALL	pop_gset1
    0460 9508      RET
_fnPR2:
  temp                 --> R20
    0461 D30C      RCALL	push_gset1
(0198) }
(0199) /************************/
(0200) /* 读数据*/
(0201) /************************/
(0202) unsigned char fnPR2(void)
(0203) {
(0204)     unsigned char temp;
(0205)     if(fnSTA01() == 0)
    0462 DF77      RCALL	_fnSTA01
    0463 2300      TST	R16
    0464 F411      BNE	0x0467
(0206)     {
(0207)          return 1; // 获取状态如果状态错
    0465 E001      LDI	R16,1
    0466 C002      RJMP	0x0469
(0208)     }
(0209)     temp=RD_DAT();
    0467 DF56      RCALL	_RD_DAT
    0468 2F40      MOV	R20,R16
(0210)     return(temp); // 返回数据
    0469 D307      RCALL	pop_gset1
    046A 9508      RET
_fnSetPos:
  iPos                 --> R10
  ucol                 --> R20
  urow                 --> R22
    046B D31C      RCALL	push_gset3
    046C 2F42      MOV	R20,R18
    046D 2F60      MOV	R22,R16
    046E 9721      SBIW	R28,1
(0211) }
(0212) /************************/
(0213) /* 设置当前地址*/
(0214) /************************/
(0215) void fnSetPos(unsigned char urow, unsigned char ucol)
(0216) {
(0217)     unsigned int iPos;
(0218)     iPos = (unsigned int)urow * 30 + ucol;
    046F E18E      LDI	R24,0x1E
    0470 9F86      MUL	R24,R22
    0471 0150      MOVW	R10,R0
    0472 2E24      MOV	R2,R20
    0473 2433      CLR	R3
    0474 0CA2      ADD	R10,R2
    0475 1CB3      ADC	R11,R3
(0219)     fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
    0476 0115      MOVW	R2,R10
    0477 2C23      MOV	R2,R3
    0478 2433      CLR	R3
    0479 8228      STD	Y+0,R2
    047A 2D2A      MOV	R18,R10
    047B 7030      ANDI	R19,0
    047C E204      LDI	R16,0x24
    047D DF9C      RCALL	_fnPR1
(0220)     gCurRow = urow;
    047E 93600090  STS	_gCurRow,R22
(0221)     gCurCol = ucol;
    0480 9340008F  STS	_gCurCol,R20
(0222) }
    0482 9621      ADIW	R28,1
    0483 D2E6      RCALL	pop_gset3
    0484 9508      RET
_cursor:
  uCol                 --> R22
  uRow                 --> R20
    0485 D2FF      RCALL	push_gset2
    0486 2F62      MOV	R22,R18
    0487 2F40      MOV	R20,R16
(0223) /**********************/
(0224) /* 设置当前显示行列*/
(0225) /**********************/
(0226) void cursor(unsigned char uRow, unsigned char uCol)
(0227) {
(0228)     fnSetPos(uRow * 16, uCol);
    0488 2F26      MOV	R18,R22
    0489 E180      LDI	R24,0x10
    048A 9F84      MUL	R24,R20
    048B 2D00      MOV	R16,R0
    048C DFDE      RCALL	_fnSetPos
(0229) }
    048D D2DA      RCALL	pop_gset2
    048E 9508      RET
_cls:
  i                    --> R20
    048F D2DE      RCALL	push_gset1
    0490 940E07E1  CALL	0x7E1
(0230) /*********************/
(0231) /* 清屏*/
(0232) /*********************/
(0233) void cls(void)
(0234) {
(0235)     unsigned int i;
(0236)     fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
    0492 E204      LDI	R16,0x24
    0493 DF86      RCALL	_fnPR1
(0237)     fnPR12(LC_AUT_WR); // 自动写
    0494 EB00      LDI	R16,0xB0
    0495 DFB3      RCALL	_fnPR12
(0238)     for(i=0;i<240*128/8;i++) // 清一屏
    0496 2744      CLR	R20
    0497 2755      CLR	R21
    0498 C005      RJMP	0x049E
(0239)     {
(0240)         fnSTA3();
    0499 DF60      RCALL	_fnSTA3
(0241)         fnPR13(0x0); // 写数据实际使用时请将0x55 改成0x0
    049A 2700      CLR	R16
    049B DFB9      RCALL	_fnPR13
    049C 5F4F      SUBI	R20,0xFF
    049D 4F5F      SBCI	R21,0xFF
    049E 3040      CPI	R20,0
    049F E0EF      LDI	R30,0xF
    04A0 075E      CPC	R21,R30
    04A1 F3B8      BCS	0x0499
(0242)     }
(0243)     fnPR12(LC_AUT_OVR); // 自动写结束
    04A2 EB02      LDI	R16,0xB2
    04A3 DFA5      RCALL	_fnPR12
(0244)     fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
    04A4 2422      CLR	R2
    04A5 8228      STD	Y+0,R2
    04A6 2722      CLR	R18
    04A7 E204      LDI	R16,0x24
    04A8 DF71      RCALL	_fnPR1
(0245)     gCurRow = 0; // 置地址指针存储变量
    04A9 2422      CLR	R2
    04AA 92200090  STS	_gCurRow,R2
(0246)     gCurCol = 0;
    04AC 9220008F  STS	_gCurCol,R2
(0247) }
    04AE 9621      ADIW	R28,1
    04AF D2C1      RCALL	pop_gset1
    04B0 9508      RET
_fnLCMInit:
    04B1 940E07E1  CALL	0x7E1
(0248) /************************/
(0249) /* LCM 初始化*/
(0250) /************************/
(0251) char fnLCMInit(void)
(0252) {
(0253)     if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
    04B3 E400      LDI	R16,0x40
    04B4 DF65      RCALL	_fnPR1
    04B5 2300      TST	R16
    04B6 F011      BEQ	0x04B9
(0254)     {
(0255)         return (0xff);
    04B7 EF0F      LDI	R16,0xFF
    04B8 C016      RJMP	0x04CF
(0256)     }
(0257)     fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
    04B9 2422      CLR	R2
    04BA 8228      STD	Y+0,R2
    04BB E12E      LDI	R18,0x1E
    04BC E401      LDI	R16,0x41
    04BD DF5C      RCALL	_fnPR1
(0258)     fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
    04BE 2422      CLR	R2
    04BF 8228      STD	Y+0,R2
    04C0 2722      CLR	R18
    04C1 E402      LDI	R16,0x42
    04C2 DF57      RCALL	_fnPR1
(0259)     fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
    04C3 2422      CLR	R2
    04C4 8228      STD	Y+0,R2
    04C5 E12E      LDI	R18,0x1E
    04C6 E403      LDI	R16,0x43
    04C7 DF52      RCALL	_fnPR1
(0260)     fnPR12(LC_CUR_SHP | 0x01); // 光标形状
    04C8 EA01      LDI	R16,0xA1
    04C9 DF7F      RCALL	_fnPR12
(0261)     fnPR12(LC_MOD_OR); // 显示方式设置
    04CA E800      LDI	R16,0x80
    04CB DF7D      RCALL	_fnPR12
(0262)     fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
    04CC E908      LDI	R16,0x98
    04CD DF7B      RCALL	_fnPR12
(0263)     return(0);
    04CE 2700      CLR	R16
    04CF 9621      ADIW	R28,1
    04D0 9508      RET
_dprintf:
  cData                --> Y+3
  uLen                 --> Y+2
  i                    --> Y+1
  c2                   --> R22
  uRow                 --> Y+0
  uCol                 --> R14
  c1                   --> R20
  k                    --> R10
  j                    --> R12
  ptr                  --> Y+14
  y                    --> R22
  x                    --> R20
    04D1 D2BC      RCALL	push_gset5
    04D2 2F62      MOV	R22,R18
    04D3 2F40      MOV	R20,R16
    04D4 9724      SBIW	R28,4
(0264) }
(0265) /********************************************************/
(0266) /* ASCII(8*16) 及 汉字(16*16) 显示函数      */
(0267) /********************************************************/
(0268) unsigned char dprintf(unsigned char x,unsigned char y, char *ptr)
(0269) {
(0270)     unsigned char c1,c2,cData;
(0271)     unsigned char i,j,uLen,uRow,uCol;
(0272)     unsigned int  k;
(0273)     uLen=0;
    04D5 2400      CLR	R0
    04D6 820A      STD	Y+2,R0
(0274)     i=0;
    04D7 8209      STD	Y+1,R0
(0275)     uRow = y;
    04D8 8368      STD	Y+0,R22
(0276)     uCol = x;
    04D9 2EE4      MOV	R14,R20
(0277)     fnSetPos(uRow*16,uCol);      //起点定位
    04DA 2D2E      MOV	R18,R14
    04DB E180      LDI	R24,0x10
    04DC 2E06      MOV	R0,R22
    04DD 9D80      MUL	R24,R0
    04DE 2D00      MOV	R16,R0
    04DF DF8B      RCALL	_fnSetPos
    04E0 C003      RJMP	0x04E4
(0278)     while (ptr[uLen]!=0) //探测字串长度
(0279)     {
(0280)         uLen++;
    04E1 800A      LDD	R0,Y+2
    04E2 9403      INC	R0
    04E3 820A      STD	Y+2,R0
    04E4 81EA      LDD	R30,Y+2
    04E5 940E07BB  CALL	0x7BB
    04E7 8020      LDD	R2,Z+0
    04E8 2022      TST	R2
    04E9 F7B9      BNE	0x04E1
    04EA C0A0      RJMP	0x058B
(0281)     }	
(0282)     while(i<uLen)
(0283)     {
(0284)     	c1 = ptr[i];
    04EB 81E9      LDD	R30,Y+1
    04EC 940E07BB  CALL	0x7BB
    04EE 8140      LDD	R20,Z+0
(0285)     	c2 = ptr[i+1];
    04EF 81E9      LDD	R30,Y+1
    04F0 27FF      CLR	R31
    04F1 0DE0      ADD	R30,R0
    04F2 1DF1      ADC	R31,R1
    04F3 8161      LDD	R22,Z+1
(0286)         //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
(0287)     	uRow = fnGetRow();    
    04F4 DEB9      RCALL	_fnGetRow
    04F5 8308      STD	Y+0,R16
(0288)     	uCol = fnGetCol();
    04F6 DEBA      RCALL	_fnGetCol
    04F7 2EE0      MOV	R14,R16
(0289)     	if(c1 <=128)	// ASCII
    04F8 E880      LDI	R24,0x80
    04F9 1784      CP	R24,R20
    04FA F140      BCS	0x0523
(0290)       	{
(0291)             for(j=0;j<16;j++) //写16行
    04FB 24CC      CLR	R12
    04FC C01E      RJMP	0x051B
(0292)             {
(0293)         	fnPR12(LC_AUT_WR);    			// 写数据(命令)
    04FD EB00      LDI	R16,0xB0
    04FE DF4A      RCALL	_fnPR12
(0294)         	if (c1 >= 0x20)
    04FF 3240      CPI	R20,0x20
    0500 F080      BCS	0x0511
(0295)           	{
(0296)             	    fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
    0501 E180      LDI	R24,0x10
    0502 9F84      MUL	R24,R20
    0503 01F0      MOVW	R30,R0
    0504 50E0      SUBI	R30,0
    0505 40F2      SBCI	R31,2
    0506 2C2C      MOV	R2,R12
    0507 2433      CLR	R3
    0508 0DE2      ADD	R30,R2
    0509 1DF3      ADC	R31,R3
    050A E584      LDI	R24,0x54
    050B E090      LDI	R25,0
    050C 0FE8      ADD	R30,R24
    050D 1FF9      ADC	R31,R25
    050E 9104      LPM	R16,0(Z)
    050F DF45      RCALL	_fnPR13
(0297)           	}
    0510 C002      RJMP	0x0513
(0298)         	else
(0299)         	{
(0300)           	    fnPR13(cData);
    0511 810B      LDD	R16,Y+3
    0512 DF42      RCALL	_fnPR13
(0301)           	}
(0302)          	fnPR12(LC_AUT_OVR);  			//写数据结束
    0513 EB02      LDI	R16,0xB2
    0514 DF34      RCALL	_fnPR12
(0303)                 fnSetPos(uRow+j+1,uCol);
    0515 2D2E      MOV	R18,R14
    0516 8108      LDD	R16,Y+0
    0517 0D0C      ADD	R16,R12
    0518 5F0F      SUBI	R16,0xFF
    0519 DF51      RCALL	_fnSetPos
    051A 94C3      INC	R12
    051B 2D8C      MOV	R24,R12
    051C 3180      CPI	R24,0x10
    051D F2F8      BCS	0x04FD
(0304)              }
(0305)             if(c1 != BS)  	// 非退格
    051E 3048      CPI	R20,0x8
    051F F409      BNE	0x0521
    0520 C055      RJMP	0x0576
(0306)             {
(0307)                 uCol++;   // 列数加1
    0521 94E3      INC	R14
(0308)             }
(0309)           			   				
(0310)         }
    0522 C053      RJMP	0x0576
(0311)     	else    	// 中文
(0312)       	{
(0313)             for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)  	// 查找定位
    0523 24CC      CLR	R12
    0524 C00F      RJMP	0x0534
(0314)             {
(0315)                 if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
    0525 E282      LDI	R24,0x22
    0526 9D8C      MUL	R24,R12
    0527 0110      MOVW	R2,R0
    0528 E584      LDI	R24,0x54
    0529 940E07AF  CALL	0x7AF
    052B 174E      CP	R20,R30
    052C F431      BNE	0x0533
    052D E585      LDI	R24,0x55
    052E 940E07AF  CALL	0x7AF
    0530 176E      CP	R22,R30
    0531 F409      BNE	0x0533
(0316)                 {
(0317)                     break;
    0532 C004      RJMP	0x0537
    0533 94C3      INC	R12
    0534 2D8C      MOV	R24,R12
    0535 3084      CPI	R24,4
    0536 F370      BCS	0x0525
(0318)                 }
(0319)           				
(0320)             }
(0321)             for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
    0537 24AA      CLR	R10
    0538 24BB      CLR	R11
    0539 C030      RJMP	0x056A
(0322)             {
(0323)                 fnSetPos(uRow+k,uCol);
    053A 2D2E      MOV	R18,R14
    053B 8108      LDD	R16,Y+0
    053C 2711      CLR	R17
    053D 0D0A      ADD	R16,R10
    053E 1D1B      ADC	R17,R11
    053F DF2B      RCALL	_fnSetPos
(0324)         	fnPR12(LC_AUT_WR);      		// 写数据
    0540 EB00      LDI	R16,0xB0
    0541 DF07      RCALL	_fnPR12
(0325)         	if(j < sizeof(GB_16)/sizeof(GB_16[0]))
    0542 2D8C      MOV	R24,R12
    0543 3084      CPI	R24,4
    0544 F490      BCC	0x0557
    0545 940E0796  CALL	0x796
(0326)           	{
(0327)           	    fnPR13(GB_16[j].Msk[k*2]);
    0547 D210      RCALL	empy16s
    0548 01F8      MOVW	R30,R16
    0549 0DE2      ADD	R30,R2
    054A 1DF3      ADC	R31,R3
    054B 9104      LPM	R16,0(Z)
    054C DF08      RCALL	_fnPR13
    054D 940E0796  CALL	0x796
(0328)           	    fnPR13(GB_16[j].Msk[k*2+1]);
    054F D208      RCALL	empy16s
    0550 01F8      MOVW	R30,R16
    0551 9631      ADIW	R30,1
    0552 0DE2      ADD	R30,R2
    0553 1DF3      ADC	R31,R3
    0554 9104      LPM	R16,0(Z)
    0555 DEFF      RCALL	_fnPR13
(0329)           	}
    0556 C00E      RJMP	0x0565
(0330)         	else   		// 未找到该字
(0331)           	{
(0332)           	    if(k < sizeof(GB_16[0].Msk)/4)
    0557 01C5      MOVW	R24,R10
    0558 3088      CPI	R24,0x8
    0559 E0E0      LDI	R30,0
    055A 079E      CPC	R25,R30
    055B F428      BCC	0x0561
(0333)             	    {
(0334)                         fnPR13(0x00);
    055C 2700      CLR	R16
    055D DEF7      RCALL	_fnPR13
(0335)             		fnPR13(0x00);
    055E 2700      CLR	R16
    055F DEF5      RCALL	_fnPR13
(0336)             	     }
    0560 C004      RJMP	0x0565
(0337)          	    else
(0338)             	    {
(0339)             		fnPR13(0xff);
    0561 EF0F      LDI	R16,0xFF
    0562 DEF2      RCALL	_fnPR13
(0340) 			fnPR13(0xff);
    0563 EF0F      LDI	R16,0xFF
    0564 DEF0      RCALL	_fnPR13
(0341)             	    }
(0342)                 }
(0343)         	fnPR12(LC_AUT_OVR);
    0565 EB02      LDI	R16,0xB2
    0566 DEE2      RCALL	_fnPR12
    0567 01C5      MOVW	R24,R10
    0568 9601      ADIW	R24,1
    0569 015C      MOVW	R10,R24
    056A 01C5      MOVW	R24,R10
    056B 3180      CPI	R24,0x10
    056C E0E0      LDI	R30,0
    056D 079E      CPC	R25,R30
    056E F408      BCC	0x0570
    056F CFCA      RJMP	0x053A
(0344)             }
(0345)       	    uCol += 2;
    0570 2D8E      MOV	R24,R14

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -