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

📄 18lcd.lst

📁 这是用于atmega128控制12864显示的源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0150) 		x ++;
    047F 9543      INC	R20
    0480 1746      CP	R20,R22
    0481 F3D8      BCS	0x047D
    0482 940E058B  CALL	pop_gset4
    0484 9508      RET
_disp_char:
  q                    --> R20
  i                    --> R22
  ascii                --> Y+8
  y                    --> R12
  x                    --> R10
    0485 940E0590  CALL	push_gset4
    0487 2EC2      MOV	R12,R18
    0488 2EA0      MOV	R10,R16
(0151) 		}
(0152) }
(0153) 
(0154) /*在指定位置显示一个ASCII 字符*/
(0155) void disp_char(unsigned char x, unsigned char y, unsigned char ascii) {
(0156) 
(0157) 	unsigned char i = 0x00;
    0489 2766      CLR	R22
(0158) 	const unsigned char *q;				/*取字库指针*/
(0159) 	
(0160) 	ascii -= 0x20;
    048A 8588      LDD	R24,Y+8
    048B 5280      SUBI	R24,0x20
    048C 8788      STD	Y+8,R24
(0161) 	q = &ENGLISH_FONT[ascii * 16];		/*定位指针地址*/
    048D E180      LDI	R24,0x10
    048E 8408      LDD	R0,Y+8
    048F 9D80      MUL	R24,R0
    0490 01A0      MOVW	R20,R0
    0491 E88C      LDI	R24,0x8C
    0492 E090      LDI	R25,0
    0493 0F48      ADD	R20,R24
    0494 1F59      ADC	R21,R25
(0162) 
(0163) 	/*显示高8位*/	
(0164) 	i = 0x00;
(0165) 	if (x < 64) {						/*地址在左半屏范围内*/
    0495 2D8A      MOV	R24,R10
    0496 3480      CPI	R24,0x40
    0497 F4A0      BCC	0x04AC
(0166) 		LCD0_write_com(y | 0xB8);
    0498 2D0C      MOV	R16,R12
    0499 6B08      ORI	R16,0xB8
    049A DF5E      RCALL	_LCD0_write_com
(0167) 		LCD0_write_com(x | 0x40);
    049B 2D0A      MOV	R16,R10
    049C 6400      ORI	R16,0x40
    049D DF5B      RCALL	_LCD0_write_com
    049E C00B      RJMP	0x04AA
(0168) 		while (i < 8) {
(0169) 			LCD0_write_data(*q);
    049F 01FA      MOVW	R30,R20
    04A0 9104      LPM	R16,0(Z)
    04A1 DF77      RCALL	_LCD0_write_data
(0170) 			q ++;
    04A2 5F4F      SUBI	R20,0xFF
    04A3 4F5F      SBCI	R21,0xFF
(0171) 			x ++;
    04A4 94A3      INC	R10
(0172) 			i ++;
    04A5 9563      INC	R22
(0173) 			if (x > 63) {				/*判断地址是否越界*/
    04A6 E38F      LDI	R24,0x3F
    04A7 158A      CP	R24,R10
    04A8 F408      BCC	0x04AA
(0174) 				break;
    04A9 C002      RJMP	0x04AC
    04AA 3068      CPI	R22,0x8
    04AB F398      BCS	0x049F
(0175) 				}
(0176) 			}
(0177) 		}
(0178) 	if (i < 8) {						/*地址进入左半屏范围*/
    04AC 3068      CPI	R22,0x8
    04AD F480      BCC	0x04BE
(0179) 		LCD1_write_com(y | 0xB8);
    04AE 2D0C      MOV	R16,R12
    04AF 6B08      ORI	R16,0xB8
    04B0 DF58      RCALL	_LCD1_write_com
(0180) 		LCD1_write_com(x | 0x40);
    04B1 2D0A      MOV	R16,R10
    04B2 6400      ORI	R16,0x40
    04B3 DF55      RCALL	_LCD1_write_com
    04B4 C007      RJMP	0x04BC
(0181) 		while (i < 8) {
(0182) 			LCD1_write_data(*q);
    04B5 01FA      MOVW	R30,R20
    04B6 9104      LPM	R16,0(Z)
    04B7 DF71      RCALL	_LCD1_write_data
(0183) 			q ++;
    04B8 5F4F      SUBI	R20,0xFF
    04B9 4F5F      SBCI	R21,0xFF
(0184) 			x ++;
    04BA 94A3      INC	R10
(0185) 			i ++;
    04BB 9563      INC	R22
    04BC 3068      CPI	R22,0x8
    04BD F3B8      BCS	0x04B5
(0186) 			}
(0187) 		}
(0188) 
(0189) 	/*显示低8位*/
(0190) 	i = 0x00;
    04BE 2766      CLR	R22
(0191) 	x -= 8;
    04BF 2D8A      MOV	R24,R10
    04C0 5088      SUBI	R24,0x8
    04C1 2EA8      MOV	R10,R24
(0192) 	if (x < 64) {						/*地址在左半屏范围内*/
    04C2 3480      CPI	R24,0x40
    04C3 F4A8      BCC	0x04D9
(0193) 		LCD0_write_com((y+1) | 0xB8);
    04C4 2D0C      MOV	R16,R12
    04C5 5F0F      SUBI	R16,0xFF
    04C6 6B08      ORI	R16,0xB8
    04C7 DF31      RCALL	_LCD0_write_com
(0194) 		LCD0_write_com(x | 0x40);
    04C8 2D0A      MOV	R16,R10
    04C9 6400      ORI	R16,0x40
    04CA DF2E      RCALL	_LCD0_write_com
    04CB C00B      RJMP	0x04D7
(0195) 		while (i < 8) {
(0196) 			LCD0_write_data(*q);
    04CC 01FA      MOVW	R30,R20
    04CD 9104      LPM	R16,0(Z)
    04CE DF4A      RCALL	_LCD0_write_data
(0197) 			q ++;
    04CF 5F4F      SUBI	R20,0xFF
    04D0 4F5F      SBCI	R21,0xFF
(0198) 			x ++;
    04D1 94A3      INC	R10
(0199) 			i ++;
    04D2 9563      INC	R22
(0200) 			if (x > 63) {				/*判断地址是否越界*/
    04D3 E38F      LDI	R24,0x3F
    04D4 158A      CP	R24,R10
    04D5 F408      BCC	0x04D7
(0201) 				break;
    04D6 C002      RJMP	0x04D9
    04D7 3068      CPI	R22,0x8
    04D8 F398      BCS	0x04CC
(0202) 				}
(0203) 			}
(0204) 		}
(0205) 	if (i < 8) {						/*地址进入左半屏范围*/
    04D9 3068      CPI	R22,0x8
    04DA F488      BCC	0x04EC
(0206) 		LCD1_write_com((y+1) | 0xB8);
    04DB 2D0C      MOV	R16,R12
    04DC 5F0F      SUBI	R16,0xFF
    04DD 6B08      ORI	R16,0xB8
    04DE DF2A      RCALL	_LCD1_write_com
(0207) 		LCD1_write_com(x | 0x40);
    04DF 2D0A      MOV	R16,R10
    04E0 6400      ORI	R16,0x40
    04E1 DF27      RCALL	_LCD1_write_com
    04E2 C007      RJMP	0x04EA
(0208) 		while (i < 8) {
(0209) 			LCD1_write_data(*q);
    04E3 01FA      MOVW	R30,R20
    04E4 9104      LPM	R16,0(Z)
    04E5 DF43      RCALL	_LCD1_write_data
(0210) 			q ++;
    04E6 5F4F      SUBI	R20,0xFF
    04E7 4F5F      SBCI	R21,0xFF
(0211) 			x ++;
    04E8 94A3      INC	R10
(0212) 			i ++;
    04E9 9563      INC	R22
    04EA 3068      CPI	R22,0x8
    04EB F3B8      BCS	0x04E3
(0213) 			}
(0214) 		}
(0215) 	CSA_CLR;
    04EC 98AF      CBI	0x15,7
(0216) 	CSB_CLR;
    04ED 98AE      CBI	0x15,6
    04EE 940E058B  CALL	pop_gset4
    04F0 9508      RET
_disp_word:
  q                    --> R20
  i                    --> R22
  word                 --> Y+8
  y                    --> R12
  x                    --> R10
    04F1 940E0590  CALL	push_gset4
    04F3 2EC2      MOV	R12,R18
    04F4 2EA0      MOV	R10,R16
(0217) }
(0218) 
(0219) /*在指定位置显示一个汉字*/
(0220) void disp_word(unsigned char x, unsigned char y, unsigned char word) {
(0221) 
(0222) 	unsigned char i = 0x00;
    04F5 2766      CLR	R22
(0223) 	const unsigned char *q;				/*取字库指针*/
(0224) 	
(0225) 	q = &CHINESE_FONT[word * 32];		/*定位指针地址*/
    04F6 E280      LDI	R24,0x20
    04F7 8408      LDD	R0,Y+8
    04F8 9D80      MUL	R24,R0
    04F9 01A0      MOVW	R20,R0
    04FA E38C      LDI	R24,0x3C
    04FB E096      LDI	R25,6
    04FC 0F48      ADD	R20,R24
    04FD 1F59      ADC	R21,R25
(0226) 
(0227) 	/*显示高16位*/	
(0228) 	i = 0x00;
(0229) 	if (x < 64) {						/*地址在左半屏范围内*/
    04FE 2D8A      MOV	R24,R10
    04FF 3480      CPI	R24,0x40
    0500 F4A0      BCC	0x0515
(0230) 		LCD0_write_com(y | 0xB8);
    0501 2D0C      MOV	R16,R12
    0502 6B08      ORI	R16,0xB8
    0503 DEF5      RCALL	_LCD0_write_com
(0231) 		LCD0_write_com(x | 0x40);
    0504 2D0A      MOV	R16,R10
    0505 6400      ORI	R16,0x40
    0506 DEF2      RCALL	_LCD0_write_com
    0507 C00B      RJMP	0x0513
(0232) 		while (i < 16) {
(0233) 			LCD0_write_data(*q);
    0508 01FA      MOVW	R30,R20
    0509 9104      LPM	R16,0(Z)
    050A DF0E      RCALL	_LCD0_write_data
(0234) 			q ++;
    050B 5F4F      SUBI	R20,0xFF
    050C 4F5F      SBCI	R21,0xFF
(0235) 			x ++;
    050D 94A3      INC	R10
(0236) 			i ++;
    050E 9563      INC	R22
(0237) 			if (x > 63) {				/*判断地址是否越界*/
    050F E38F      LDI	R24,0x3F
    0510 158A      CP	R24,R10
    0511 F408      BCC	0x0513
(0238) 				break;
    0512 C002      RJMP	0x0515
    0513 3160      CPI	R22,0x10
    0514 F398      BCS	0x0508
(0239) 				}
(0240) 			}
(0241) 		}
(0242) 	if (i < 16) {						/*地址进入左半屏范围*/
    0515 3160      CPI	R22,0x10
    0516 F480      BCC	0x0527
(0243) 		LCD1_write_com(y | 0xB8);
    0517 2D0C      MOV	R16,R12
    0518 6B08      ORI	R16,0xB8
    0519 DEEF      RCALL	_LCD1_write_com
(0244) 		LCD1_write_com(x | 0x40);
    051A 2D0A      MOV	R16,R10
    051B 6400      ORI	R16,0x40
    051C DEEC      RCALL	_LCD1_write_com
    051D C007      RJMP	0x0525
(0245) 		while (i < 16) {
(0246) 			LCD1_write_data(*q);
    051E 01FA      MOVW	R30,R20
    051F 9104      LPM	R16,0(Z)
    0520 DF08      RCALL	_LCD1_write_data
(0247) 			q ++;
    0521 5F4F      SUBI	R20,0xFF
    0522 4F5F      SBCI	R21,0xFF
(0248) 			x ++;
    0523 94A3      INC	R10
(0249) 			i ++;
    0524 9563      INC	R22
    0525 3160      CPI	R22,0x10
    0526 F3B8      BCS	0x051E
(0250) 			}
(0251) 		}
(0252) 
(0253) 	/*显示低16位*/
(0254) 	i = 0x00;
    0527 2766      CLR	R22
(0255) 	x -= 16;
    0528 2D8A      MOV	R24,R10
    0529 5180      SUBI	R24,0x10
    052A 2EA8      MOV	R10,R24
(0256) 	if (x < 64) {						/*地址在左半屏范围内*/
    052B 3480      CPI	R24,0x40
    052C F4A8      BCC	0x0542
(0257) 		LCD0_write_com((y+1) | 0xB8);
    052D 2D0C      MOV	R16,R12
    052E 5F0F      SUBI	R16,0xFF
    052F 6B08      ORI	R16,0xB8
    0530 DEC8      RCALL	_LCD0_write_com
(0258) 		LCD0_write_com(x | 0x40);
    0531 2D0A      MOV	R16,R10
    0532 6400      ORI	R16,0x40
    0533 DEC5      RCALL	_LCD0_write_com
    0534 C00B      RJMP	0x0540
(0259) 		while (i < 16) {
(0260) 			LCD0_write_data(*q);
    0535 01FA      MOVW	R30,R20
    0536 9104      LPM	R16,0(Z)
    0537 DEE1      RCALL	_LCD0_write_data
(0261) 			q ++;
    0538 5F4F      SUBI	R20,0xFF
    0539 4F5F      SBCI	R21,0xFF
(0262) 			x ++;
    053A 94A3      INC	R10
(0263) 			i ++;
    053B 9563      INC	R22
(0264) 			if (x > 63) {				/*判断地址是否越界*/
    053C E38F      LDI	R24,0x3F
    053D 158A      CP	R24,R10
    053E F408      BCC	0x0540
(0265) 				break;
    053F C002      RJMP	0x0542
    0540 3160      CPI	R22,0x10
    0541 F398      BCS	0x0535
(0266) 				}
(0267) 			}
(0268) 		}
(0269) 	if (i < 16) {						/*地址进入左半屏范围*/
    0542 3160      CPI	R22,0x10
    0543 F488      BCC	0x0555
(0270) 		LCD1_write_com((y+1) | 0xB8);
    0544 2D0C      MOV	R16,R12
    0545 5F0F      SUBI	R16,0xFF
    0546 6B08      ORI	R16,0xB8
    0547 DEC1      RCALL	_LCD1_write_com
(0271) 		LCD1_write_com(x | 0x40);
    0548 2D0A      MOV	R16,R10
    0549 6400      ORI	R16,0x40
    054A DEBE      RCALL	_LCD1_write_com
    054B C007      RJMP	0x0553
(0272) 		while (i < 16) {
(0273) 			LCD1_write_data(*q);
    054C 01FA      MOVW	R30,R20
    054D 9104      LPM	R16,0(Z)
    054E DEDA      RCALL	_LCD1_write_data
(0274) 			q ++;
    054F 5F4F      SUBI	R20,0xFF
    0550 4F5F      SBCI	R21,0xFF
(0275) 			x ++;
    0551 94A3      INC	R10
(0276) 			i ++;
    0552 9563      INC	R22
    0553 3160      CPI	R22,0x10
    0554 F3B8      BCS	0x054C
(0277) 			}
(0278) 		}
(0279) 	CSA_CLR;
    0555 98AF      CBI	0x15,7
(0280) 	CSB_CLR;
    0556 98AE      CBI	0x15,6
    0557 940E058B  CALL	pop_gset4
    0559 9508      RET
_disp_char_str:
  str                  --> R20
  y                    --> R22
  x                    --> R10
    055A 940E0592  CALL	push_gset3
    055C 2F62      MOV	R22,R18
    055D 2EA0      MOV	R10,R16
    055E 9721      SBIW	R28,1
    055F 814F      LDD	R20,Y+7
    0560 8558      LDD	R21,Y+8
(0281) }
(0282) 
(0283) /*显示一串字符*/
(0284) void disp_char_str(unsigned char x, unsigned char y, unsigned char *str) {
    0561 C00B      RJMP	0x056D
(0285) 
(0286) 	while (*str != 0) {
(0287) 		disp_char(x, y, *str);
    0562 01FA      MOVW	R30,R20
    0563 8020      LDD	R2,Z+0
    0564 8228      STD	Y+0,R2
    0565 2F26      MOV	R18,R22
    0566 2D0A      MOV	R16,R10
    0567 DF1D      RCALL	_disp_char
(0288) 		x += 8;
    0568 2D8A      MOV	R24,R10
    0569 5F88      SUBI	R24,0xF8
    056A 2EA8      MOV	R10,R24
(0289) 		str ++;
    056B 5F4F      SUBI	R20,0xFF
    056C 4F5F      SBCI	R21,0xFF
    056D 01FA      MOVW	R30,R20
    056E 8020      LDD	R2,Z+0
    056F 2022      TST	R2
    0570 F789      BNE	0x0562
    0571 9621      ADIW	R28,1
    0572 940E0588  CALL	pop_gset3
    0574 9508      RET
(0290) 		}
(0291) }
(0292) 
(0293) /*显示屏初始化函数*/
(0294) void disp_init(void) {
(0295) 	
(0296) 	DDRA = 0xFF;						/*I/O口方向设置*/
_disp_init:
    0575 EF8F      LDI	R24,0xFF
    0576 BB8A      OUT	0x1A,R24
(0297) 	DDRC = 0xFF;
    0577 BB84      OUT	0x14,R24
(0298) 
(0299) 	RST_CLR;
    0578 98AD      CBI	0x15,5
(0300) 	delay_ms(10);
    0579 E00A      LDI	R16,0xA
    057A DE6F      RCALL	_delay_ms
(0301) 	RST_SET;
    057B 9AAD      SBI	0x15,5
(0302) 
(0303) 	LCD0_write_com(0xC0);				/*显示起行设置*/
    057C EC00      LDI	R16,0xC0
    057D DE7B      RCALL	_LCD0_write_com
(0304) 	LCD1_write_com(0xC0);
    057E EC00      LDI	R16,0xC0
    057F DE89      RCALL	_LCD1_write_com
(0305) 	
(0306) 	LCD0_write_com(0x3F);				/*开显示设置*/
    0580 E30F      LDI	R16,0x3F
    0581 DE77      RCALL	_LCD0_write_com
(0307) 	LCD1_write_com(0x3F);
FILE: <library>
    0582 E30F      LDI	R16,0x3F
    0583 DE85      RCALL	_LCD1_write_com
    0584 9508      RET
pop_gset2:
    0585 E0E2      LDI	R30,2
    0586 940C059A  JMP	pop
pop_gset3:
    0588 E0E4      LDI	R30,4
    0589 940C059A  JMP	pop
pop_gset4:
    058B E0E8      LDI	R30,0x8
    058C 940C059A  JMP	pop
push_gset5:
    058E 92FA      ST	R15,-Y
    058F 92EA      ST	R14,-Y
push_gset4:
    0590 92DA      ST	R13,-Y
    0591 92CA      ST	R12,-Y
push_gset3:
    0592 92BA      ST	R11,-Y
    0593 92AA      ST	R10,-Y
push_gset2:
    0594 937A      ST	R23,-Y
    0595 936A      ST	R22,-Y
push_gset1:
    0596 935A      ST	R21,-Y
    0597 934A      ST	R20,-Y
    0598 9508      RET
pop_gset1:
    0599 E0E1      LDI	R30,1
pop:
    059A 9149      LD	R20,Y+
    059B 9159      LD	R21,Y+
    059C FDE0      SBRC	R30,0
    059D 9508      RET
    059E 9169      LD	R22,Y+
    059F 9179      LD	R23,Y+
    05A0 FDE1      SBRC	R30,1
    05A1 9508      RET
    05A2 90A9      LD	R10,Y+
    05A3 90B9      LD	R11,Y+
    05A4 FDE2      SBRC	R30,2
    05A5 9508      RET
    05A6 90C9      LD	R12,Y+
    05A7 90D9      LD	R13,Y+
    05A8 FDE3      SBRC	R30,3
    05A9 9508      RET
    05AA 90E9      LD	R14,Y+
    05AB 90F9      LD	R15,Y+
    05AC 9508      RET

⌨️ 快捷键说明

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