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

📄 18lcd.lst

📁 atmega128 adc LCD
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0071) 	CSB_SET;
    0546 9AAE      SBI	0x15,6
(0072) 	EN_SET;
    0547 9AAC      SBI	0x15,4
(0073) 	PORTA = com;
    0548 BB4B      OUT	0x1B,R20
(0074) 	delay_us(1);
    0549 E001      LDI	R16,1
    054A E010      LDI	R17,0
    054B DFCA      RCALL	_delay_us
(0075) 	EN_CLR;
    054C 98AC      CBI	0x15,4
    054D 940E07D3  CALL	pop_gset1
    054F 9508      RET
_LCD0_write_data:
  data                 --> R20
    0550 940E07D0  CALL	push_gset1
    0552 2F40      MOV	R20,R16
(0076) }
(0077) 
(0078) /*显示屏命令写入函数*/
(0079) void LCD0_write_data(unsigned char data) {
(0080) 
(0081) 	RS_SET;
    0553 9AAA      SBI	0x15,2
(0082) 	RW_CLR;
    0554 98AB      CBI	0x15,3
(0083) 	CSA_SET;
    0555 9AAF      SBI	0x15,7
(0084) 	CSB_CLR;
    0556 98AE      CBI	0x15,6
(0085) 	EN_SET;
    0557 9AAC      SBI	0x15,4
(0086) 	PORTA = data;
    0558 BB4B      OUT	0x1B,R20
(0087) 	delay_us(1);
    0559 E001      LDI	R16,1
    055A E010      LDI	R17,0
    055B DFBA      RCALL	_delay_us
(0088) 	EN_CLR;
    055C 98AC      CBI	0x15,4
    055D 940E07D3  CALL	pop_gset1
    055F 9508      RET
_LCD1_write_data:
  data                 --> R20
    0560 940E07D0  CALL	push_gset1
    0562 2F40      MOV	R20,R16
(0089) }
(0090) 
(0091) /*显示屏命令写入函数*/
(0092) void LCD1_write_data(unsigned char data) {
(0093) 
(0094) 	RS_SET;
    0563 9AAA      SBI	0x15,2
(0095) 	RW_CLR;
    0564 98AB      CBI	0x15,3
(0096) 	CSA_CLR;
    0565 98AF      CBI	0x15,7
(0097) 	CSB_SET;
    0566 9AAE      SBI	0x15,6
(0098) 	EN_SET;
    0567 9AAC      SBI	0x15,4
(0099) 	PORTA = data;
    0568 BB4B      OUT	0x1B,R20
(0100) 	delay_us(1);
    0569 E001      LDI	R16,1
    056A E010      LDI	R17,0
    056B DFAA      RCALL	_delay_us
(0101) 	EN_CLR;
    056C 98AC      CBI	0x15,4
    056D 940E07D3  CALL	pop_gset1
    056F 9508      RET
_disp_clear:
  x                    --> R20
  y                    --> R10
  x1                   --> R22
  x0                   --> R12
    0570 940E07CA  CALL	push_gset4
    0572 2F62      MOV	R22,R18
    0573 2EC0      MOV	R12,R16
    0574 84A8      LDD	R10,Y+8
(0102) }
(0103) 
(0104) /*显示屏清空显示*/
(0105) void disp_clear(unsigned char x0, unsigned char x1, unsigned char y) {
(0106) 
(0107) 	unsigned char x;
(0108) 	
(0109) 	/*清除高位*/	
(0110) 	x = x0;
    0575 2D4C      MOV	R20,R12
(0111) 	if (x < 63) {						/*地址在左半屏范围内*/
    0576 334F      CPI	R20,0x3F
    0577 F470      BCC	0x0586
(0112) 		LCD0_write_com(y | 0xB8);
    0578 2D0A      MOV	R16,R10
    0579 6B08      ORI	R16,0xB8
    057A DFB5      RCALL	_LCD0_write_com
(0113) 		LCD0_write_com(x | 0x40);
    057B 2F04      MOV	R16,R20
    057C 6400      ORI	R16,0x40
    057D DFB2      RCALL	_LCD0_write_com
(0114) 		}
    057E C007      RJMP	0x0586
(0115) 	while (x < x1) {
(0116) 		LCD0_write_data(0x00);
    057F 2700      CLR	R16
    0580 DFCF      RCALL	_LCD0_write_data
(0117) 		x ++;
    0581 9543      INC	R20
(0118) 		if (x > 63) {					/*判断地址是否越界*/
    0582 E38F      LDI	R24,0x3F
    0583 1784      CP	R24,R20
    0584 F408      BCC	0x0586
(0119) 			break;
    0585 C002      RJMP	0x0588
    0586 1746      CP	R20,R22
    0587 F3B8      BCS	0x057F
(0120) 			}
(0121) 		}
(0122) 	if (x < x1) {						/*地址进入左半屏范围*/
    0588 1746      CP	R20,R22
    0589 F450      BCC	0x0594
(0123) 		LCD1_write_com(y | 0xB8);
    058A 2D0A      MOV	R16,R10
    058B 6B08      ORI	R16,0xB8
    058C DFB3      RCALL	_LCD1_write_com
(0124) 		LCD1_write_com(x | 0x40);
    058D 2F04      MOV	R16,R20
    058E 6400      ORI	R16,0x40
    058F DFB0      RCALL	_LCD1_write_com
(0125) 		}
    0590 C003      RJMP	0x0594
(0126) 	while (x < x1) {
(0127) 		LCD1_write_data(0x00);
    0591 2700      CLR	R16
    0592 DFCD      RCALL	_LCD1_write_data
(0128) 		x ++;
    0593 9543      INC	R20
    0594 1746      CP	R20,R22
    0595 F3D8      BCS	0x0591
(0129) 		}
(0130) 
(0131) 	/*清除低位*/
(0132) 	x = x0;
    0596 2D4C      MOV	R20,R12
(0133) 	if (x < 63) {						/*地址在左半屏范围内*/
    0597 334F      CPI	R20,0x3F
    0598 F478      BCC	0x05A8
(0134) 		LCD0_write_com((y+1) | 0xB8);
    0599 2D0A      MOV	R16,R10
    059A 5F0F      SUBI	R16,0xFF
    059B 6B08      ORI	R16,0xB8
    059C DF93      RCALL	_LCD0_write_com
(0135) 		LCD0_write_com(x | 0x40);
    059D 2F04      MOV	R16,R20
    059E 6400      ORI	R16,0x40
    059F DF90      RCALL	_LCD0_write_com
(0136) 		}
    05A0 C007      RJMP	0x05A8
(0137) 	while (x < x1) {
(0138) 		LCD0_write_data(0x00);
    05A1 2700      CLR	R16
    05A2 DFAD      RCALL	_LCD0_write_data
(0139) 		x ++;
    05A3 9543      INC	R20
(0140) 		if (x > 63) {					/*判断地址是否越界*/
    05A4 E38F      LDI	R24,0x3F
    05A5 1784      CP	R24,R20
    05A6 F408      BCC	0x05A8
(0141) 			break;
    05A7 C002      RJMP	0x05AA
    05A8 1746      CP	R20,R22
    05A9 F3B8      BCS	0x05A1
(0142) 			}
(0143) 		}
(0144) 	if (x < x1) {						/*地址进入左半屏范围*/
    05AA 1746      CP	R20,R22
    05AB F458      BCC	0x05B7
(0145) 		LCD1_write_com((y+1) | 0xB8);
    05AC 2D0A      MOV	R16,R10
    05AD 5F0F      SUBI	R16,0xFF
    05AE 6B08      ORI	R16,0xB8
    05AF DF90      RCALL	_LCD1_write_com
(0146) 		LCD1_write_com(x | 0x40);
    05B0 2F04      MOV	R16,R20
    05B1 6400      ORI	R16,0x40
    05B2 DF8D      RCALL	_LCD1_write_com
(0147) 		}
    05B3 C003      RJMP	0x05B7
(0148) 	while (x < x1) {
(0149) 		LCD1_write_data(0x00);
    05B4 2700      CLR	R16
    05B5 DFAA      RCALL	_LCD1_write_data
(0150) 		x ++;
    05B6 9543      INC	R20
    05B7 1746      CP	R20,R22
    05B8 F3D8      BCS	0x05B4
    05B9 940E07C2  CALL	pop_gset4
    05BB 9508      RET
_disp_char:
  q                    --> R20
  i                    --> R22
  ascii                --> Y+8
  y                    --> R12
  x                    --> R10
    05BC 940E07CA  CALL	push_gset4
    05BE 2EC2      MOV	R12,R18
    05BF 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;
    05C0 2766      CLR	R22
(0158) 	const unsigned char *q;				/*取字库指针*/
(0159) 	
(0160) 	
(0161) 	ascii -= 0x20;
    05C1 8588      LDD	R24,Y+8
    05C2 5280      SUBI	R24,0x20
    05C3 8788      STD	Y+8,R24
(0162) 	q = &ENGLISH_FONT[ascii * 16];		/*定位指针地址*/
    05C4 E180      LDI	R24,0x10
    05C5 8408      LDD	R0,Y+8
    05C6 9D80      MUL	R24,R0
    05C7 01A0      MOVW	R20,R0
    05C8 E780      LDI	R24,0x70
    05C9 E090      LDI	R25,0
    05CA 0F48      ADD	R20,R24
    05CB 1F59      ADC	R21,R25
(0163) 
(0164) 	/*显示高8位*/	
(0165) 	i = 0x00;
(0166) 	if (x < 64) {						/*地址在左半屏范围内*/
    05CC 2D8A      MOV	R24,R10
    05CD 3480      CPI	R24,0x40
    05CE F4A0      BCC	0x05E3
(0167) 		LCD0_write_com(y | 0xB8);
    05CF 2D0C      MOV	R16,R12
    05D0 6B08      ORI	R16,0xB8
    05D1 DF5E      RCALL	_LCD0_write_com
(0168) 		LCD0_write_com(x | 0x40);
    05D2 2D0A      MOV	R16,R10
    05D3 6400      ORI	R16,0x40
    05D4 DF5B      RCALL	_LCD0_write_com
    05D5 C00B      RJMP	0x05E1
(0169) 		while (i < 8) {
(0170) 			LCD0_write_data(*q);
    05D6 01FA      MOVW	R30,R20
    05D7 9104      LPM	R16,0(Z)
    05D8 DF77      RCALL	_LCD0_write_data
(0171) 			q ++;
    05D9 5F4F      SUBI	R20,0xFF
    05DA 4F5F      SBCI	R21,0xFF
(0172) 			x ++;
    05DB 94A3      INC	R10
(0173) 			i ++;
    05DC 9563      INC	R22
(0174) 			if (x > 63) {				/*判断地址是否越界*/
    05DD E38F      LDI	R24,0x3F
    05DE 158A      CP	R24,R10
    05DF F408      BCC	0x05E1
(0175) 				break;
    05E0 C002      RJMP	0x05E3
    05E1 3068      CPI	R22,0x8
    05E2 F398      BCS	0x05D6
(0176) 				}
(0177) 			}
(0178) 		}
(0179) 	if (i < 8) {						/*地址进入左半屏范围*/
    05E3 3068      CPI	R22,0x8
    05E4 F480      BCC	0x05F5
(0180) 		LCD1_write_com(y | 0xB8);
    05E5 2D0C      MOV	R16,R12
    05E6 6B08      ORI	R16,0xB8
    05E7 DF58      RCALL	_LCD1_write_com
(0181) 		LCD1_write_com(x | 0x40);
    05E8 2D0A      MOV	R16,R10
    05E9 6400      ORI	R16,0x40
    05EA DF55      RCALL	_LCD1_write_com
    05EB C007      RJMP	0x05F3
(0182) 		while (i < 8) {
(0183) 			LCD1_write_data(*q);
    05EC 01FA      MOVW	R30,R20
    05ED 9104      LPM	R16,0(Z)
    05EE DF71      RCALL	_LCD1_write_data
(0184) 			q ++;
    05EF 5F4F      SUBI	R20,0xFF
    05F0 4F5F      SBCI	R21,0xFF
(0185) 			x ++;
    05F1 94A3      INC	R10
(0186) 			i ++;
    05F2 9563      INC	R22
    05F3 3068      CPI	R22,0x8
    05F4 F3B8      BCS	0x05EC
(0187) 			}
(0188) 		}
(0189) 
(0190) 	/*显示低8位*/
(0191) 	i = 0x00;
    05F5 2766      CLR	R22
(0192) 	x -= 8;
    05F6 2D8A      MOV	R24,R10
    05F7 5088      SUBI	R24,0x8
    05F8 2EA8      MOV	R10,R24
(0193) 	if (x < 64) {						/*地址在左半屏范围内*/
    05F9 3480      CPI	R24,0x40
    05FA F4A8      BCC	0x0610
(0194) 		LCD0_write_com((y+1) | 0xB8);
    05FB 2D0C      MOV	R16,R12
    05FC 5F0F      SUBI	R16,0xFF
    05FD 6B08      ORI	R16,0xB8
    05FE DF31      RCALL	_LCD0_write_com
(0195) 		LCD0_write_com(x | 0x40);
    05FF 2D0A      MOV	R16,R10
    0600 6400      ORI	R16,0x40
    0601 DF2E      RCALL	_LCD0_write_com
    0602 C00B      RJMP	0x060E
(0196) 		while (i < 8) {
(0197) 			LCD0_write_data(*q);
    0603 01FA      MOVW	R30,R20
    0604 9104      LPM	R16,0(Z)
    0605 DF4A      RCALL	_LCD0_write_data
(0198) 			q ++;
    0606 5F4F      SUBI	R20,0xFF
    0607 4F5F      SBCI	R21,0xFF
(0199) 			x ++;
    0608 94A3      INC	R10
(0200) 			i ++;
    0609 9563      INC	R22
(0201) 			if (x > 63) {				/*判断地址是否越界*/
    060A E38F      LDI	R24,0x3F
    060B 158A      CP	R24,R10
    060C F408      BCC	0x060E
(0202) 				break;
    060D C002      RJMP	0x0610
    060E 3068      CPI	R22,0x8
    060F F398      BCS	0x0603
(0203) 				}
(0204) 			}
(0205) 		}
(0206) 	if (i < 8) {						/*地址进入左半屏范围*/
    0610 3068      CPI	R22,0x8
    0611 F488      BCC	0x0623
(0207) 		LCD1_write_com((y+1) | 0xB8);
    0612 2D0C      MOV	R16,R12
    0613 5F0F      SUBI	R16,0xFF
    0614 6B08      ORI	R16,0xB8
    0615 DF2A      RCALL	_LCD1_write_com
(0208) 		LCD1_write_com(x | 0x40);
    0616 2D0A      MOV	R16,R10
    0617 6400      ORI	R16,0x40
    0618 DF27      RCALL	_LCD1_write_com
    0619 C007      RJMP	0x0621
(0209) 		while (i < 8) {
(0210) 			LCD1_write_data(*q);
    061A 01FA      MOVW	R30,R20
    061B 9104      LPM	R16,0(Z)
    061C DF43      RCALL	_LCD1_write_data
(0211) 			q ++;
    061D 5F4F      SUBI	R20,0xFF
    061E 4F5F      SBCI	R21,0xFF
(0212) 			x ++;
    061F 94A3      INC	R10
(0213) 			i ++;
    0620 9563      INC	R22
    0621 3068      CPI	R22,0x8
    0622 F3B8      BCS	0x061A
(0214) 			}
(0215) 		}
(0216) 	CSA_CLR;
    0623 98AF      CBI	0x15,7
(0217) 	CSB_CLR;
    0624 98AE      CBI	0x15,6
    0625 940E07C2  CALL	pop_gset4
    0627 9508      RET
_disp_word:
  q                    --> R20
  i                    --> R22
  word                 --> Y+8
  y                    --> R12
  x                    --> R10
    0628 940E07CA  CALL	push_gset4
    062A 2EC2      MOV	R12,R18
    062B 2EA0      MOV	R10,R16
(0218) }
(0219) 
(0220) /*在指定位置显示一个汉字*/
(0221) void disp_word(unsigned char x, unsigned char y, unsigned char word) {
(0222) 
(0223) 	unsigned char i = 0x00;
    062C 2766      CLR	R22
(0224) 	const unsigned char *q;				/*取字库指针*/
(0225) 	
(0226) 	q = &CHINESE_FONT[word * 32];		/*定位指针地址*/
    062D E280      LDI	R24,0x20
    062E 8408      LDD	R0,Y+8
    062F 9D80      MUL	R24,R0
    0630 01A0      MOVW	R20,R0
    0631 E480      LDI	R24,0x40
    0632 E096      LDI	R25,6
    0633 0F48      ADD	R20,R24
    0634 1F59      ADC	R21,R25
(0227) 
(0228) 	/*显示高16位*/	
(0229) 	i = 0x00;
(0230) 	if (x < 64) {						/*地址在左半屏范围内*/
    0635 2D8A      MOV	R24,R10
    0636 3480      CPI	R24,0x40
    0637 F4A0      BCC	0x064C
(0231) 		LCD0_write_com(y | 0xB8);
    0638 2D0C      MOV	R16,R12
    0639 6B08      ORI	R16,0xB8
    063A DEF5      RCALL	_LCD0_write_com
(0232) 		LCD0_write_com(x | 0x40);
    063B 2D0A      MOV	R16,R10
    063C 6400      ORI	R16,0x40
    063D DEF2      RCALL	_LCD0_write_com
    063E C00B      RJMP	0x064A
(0233) 		while (i < 16) {
(0234) 			LCD0_write_data(*q);
    063F 01FA      MOVW	R30,R20
    0640 9104      LPM	R16,0(Z)
    0641 DF0E      RCALL	_LCD0_write_data
(0235) 			q ++;
    0642 5F4F      SUBI	R20,0xFF
    0643 4F5F      SBCI	R21,0xFF
(0236) 			x ++;
    0644 94A3      INC	R10
(0237) 			i ++;
    0645 9563      INC	R22
(0238) 			if (x > 63) {				/*判断地址是否越界*/
    0646 E38F      LDI	R24,0x3F
    0647 158A      CP	R24,R10
    0648 F408      BCC	0x064A
(0239) 				break;
    0649 C002      RJMP	0x064C
    064A 3160      CPI	R22,0x10
    064B F398      BCS	0x063F
(0240) 				}
(0241) 			}
(0242) 		}
(0243) 	if (i < 16) {						/*地址进入左半屏范围*/
    064C 3160      CPI	R22,0x10
    064D F480      BCC	0x065E
(0244) 		LCD1_write_com(y | 0xB8);
    064E 2D0C      MOV	R16,R12
    064F 6B08      ORI	R16,0xB8
    0650 DEEF      RCALL	_LCD1_write_com
(0245) 		LCD1_write_com(x | 0x40);
    0651 2D0A      MOV	R16,R10
    0652 6400      ORI	R16,0x40
    0653 DEEC      RCALL	_LCD1_write_com
    0654 C007      RJMP	0x065C
(0246) 		while (i < 16) {
(0247) 			LCD1_write_data(*q);
    0655 01FA      MOVW	R30,R20
    0656 9104      LPM	R16,0(Z)
    0657 DF08      RCALL	_LCD1_write_data
(0248) 			q ++;
    0658 5F4F      SUBI	R20,0xFF
    0659 4F5F      SBCI	R21,0xFF
(0249) 			x ++;
    065A 94A3      INC	R10
(0250) 			i ++;
    065B 9563      INC	R22
    065C 3160      CPI	R22,0x10
    065D F3B8      BCS	0x0655
(0251) 			}
(0252) 		}
(0253) 
(0254) 	/*显示低16位*/
(0255) 	i = 0x00;
    065E 2766      CLR	R22
(0256) 	x -= 16;
    065F 2D8A      MOV	R24,R10
    0660 5180      SUBI	R24,0x10
    0661 2EA8      MOV	R10,R24
(0257) 	if (x < 64) {						/*地址在左半屏范围内*/
    0662 3480      CPI	R24,0x40
    0663 F4A8      BCC	0x0679
(0258) 		LCD0_write_com((y+1) | 0xB8);
    0664 2D0C      MOV	R16,R12
    0665 5F0F      SUBI	R16,0xFF
    0666 6B08      ORI	R16,0xB8
    0667 DEC8      RCALL	_LCD0_write_com
(0259) 		LCD0_write_com(x | 0x40);
    0668 2D0A      MOV	R16,R10
    0669 6400      ORI	R16,0x40
    066A DEC5      RCALL	_LCD0_write_com
    066B C00B      RJMP	0x0677
(0260) 		while (i < 16) {
(0261) 			LCD0_write_data(*q);
    066C 01FA      MOVW	R30,R20
    066D 9104      LPM	R16,0(Z)
    066E DEE1      RCALL	_LCD0_write_data
(0262) 			q ++;
    066F 5F4F      SUBI	R20,0xFF

⌨️ 快捷键说明

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