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

📄 18lcd.lst

📁 这是用于atmega128控制12864显示的源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0368 EFCF      LDI	R28,0xFF
    0369 E1D0      LDI	R29,0x10
    036A BFCD      OUT	0x3D,R28
    036B BFDE      OUT	0x3E,R29
    036C 51C0      SUBI	R28,0x10
    036D 40D0      SBCI	R29,0
    036E EA0A      LDI	R16,0xAA
    036F 8308      STD	Y+0,R16
    0370 2400      CLR	R0
    0371 E1E3      LDI	R30,0x13
    0372 E0F1      LDI	R31,1
    0373 E011      LDI	R17,1
    0374 31E3      CPI	R30,0x13
    0375 07F1      CPC	R31,R17
    0376 F011      BEQ	0x0379
    0377 9201      ST	R0,Z+
    0378 CFFB      RJMP	0x0374
    0379 8300      STD	Z+0,R16
    037A EBEC      LDI	R30,0xBC
    037B E0F6      LDI	R31,6
    037C E0A0      LDI	R26,0
    037D E0B1      LDI	R27,1
    037E E016      LDI	R17,6
    037F 3CEF      CPI	R30,0xCF
    0380 07F1      CPC	R31,R17
    0381 F021      BEQ	0x0386
    0382 95C8      LPM
    0383 9631      ADIW	R30,1
    0384 920D      ST	R0,X+
    0385 CFF9      RJMP	0x037F
    0386 940E039E  CALL	_main
_exit:
    0388 CFFF      RJMP	_exit
FILE: E:\ICCAVR\project\AVRMEG~3\icc\018-LCD12864\main.c
(0001) /*
(0002) 实验十六:
(0003) 	LCD12864液晶屏显示实验。
(0004) 	1、LCD12864显示实验。显示AVR开发网及网址信息。
(0005) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 	3、进行此实验请插上JP1、JP2的所有8个短路块,PC6、PC7短路块。
(0007) 	4、RW1用于调节显示屏的对比度。
(0008) 
(0009) 	AVR  mega16学习板
(0010) 	www.iccavr.com
(0011) 	16:22 2007-4-25
(0012) */
(0013) 
(0014) #include <iom128v.h>
(0015) #include "font.h"
(0016) #include "lcd12864.h"
(0017) 
(0018) /*IO口初始化函数*/
(0019) void io_init(void) {
(0020) 
(0021) 	DDRA = 0xFF;							/*方向输出*/
_io_init:
    0389 EF8F      LDI	R24,0xFF
    038A BB8A      OUT	0x1A,R24
(0022) 	PORTA = 0xFF;							/*高电平*/
    038B BB8B      OUT	0x1B,R24
(0023) 	DDRB = 0x00;							/*方向输入*/
    038C 2422      CLR	R2
    038D BA27      OUT	0x17,R2
(0024) 	PORTB = 0xFF;							/*打开上拉*/
    038E BB88      OUT	0x18,R24
(0025) 	DDRC = 0xFF;							/*不用的IO口建议设置为输入带上拉*/
    038F BB84      OUT	0x14,R24
(0026) 	PORTC = 0x00;
    0390 BA25      OUT	0x15,R2
(0027) 	DDRD = 0x00;
    0391 BA21      OUT	0x11,R2
(0028) 	PORTD = 0xFF;
    0392 BB82      OUT	0x12,R24
(0029) 	DDRE = 0x00;
    0393 B822      OUT	0x02,R2
(0030) 	PORTE = 0xFF;
    0394 B983      OUT	0x03,R24
(0031) 	DDRF = 0x00;
    0395 92200061  STS	0x61,R2
(0032) 	PORTF = 0xFF;
    0397 93800062  STS	0x62,R24
(0033) 	DDRG = 0x00;
    0399 92200064  STS	0x64,R2
(0034) 	PORTG = 0xFF;
    039B 93800065  STS	0x65,R24
    039D 9508      RET
_main:
    039E 9722      SBIW	R28,2
(0035) }
(0036) 
(0037) void main(void) {
(0038) 
(0039) 	io_init();								/*IO口初始化*/
    039F DFE9      RCALL	_io_init
(0040) 	disp_init();							/*LCD初始化*/
    03A0 940E0575  CALL	_disp_init
(0041) 	disp_clear(0, 128, 0);					/*清除四行显示*/
    03A2 2422      CLR	R2
    03A3 8228      STD	Y+0,R2
    03A4 E820      LDI	R18,0x80
    03A5 2700      CLR	R16
    03A6 940E0439  CALL	_disp_clear
(0042) 	disp_clear(0, 128, 2);
    03A8 E082      LDI	R24,2
    03A9 8388      STD	Y+0,R24
    03AA E820      LDI	R18,0x80
    03AB 2700      CLR	R16
    03AC 940E0439  CALL	_disp_clear
(0043) 	disp_clear(0, 128, 4);
    03AE E084      LDI	R24,4
    03AF 8388      STD	Y+0,R24
    03B0 E820      LDI	R18,0x80
    03B1 2700      CLR	R16
    03B2 940E0439  CALL	_disp_clear
(0044) 	disp_clear(0, 128, 6);
    03B4 E086      LDI	R24,6
    03B5 8388      STD	Y+0,R24
    03B6 E820      LDI	R18,0x80
    03B7 2700      CLR	R16
    03B8 940E0439  CALL	_disp_clear
(0045) 	
(0046) 	disp_char_str(28, 2, "AVR");			/*写入“AVR”三个字母*/
    03BA E08F      LDI	R24,0xF
    03BB E091      LDI	R25,1
    03BC 8399      STD	Y+1,R25
    03BD 8388      STD	Y+0,R24
    03BE E022      LDI	R18,2
    03BF E10C      LDI	R16,0x1C
    03C0 940E055A  CALL	_disp_char_str
(0047) 	disp_word(52, 2, CBFAA);				/*写入“开发网”三个汉字*/
    03C2 E081      LDI	R24,1
    03C3 8388      STD	Y+0,R24
    03C4 E022      LDI	R18,2
    03C5 E304      LDI	R16,0x34
    03C6 940E04F1  CALL	_disp_word
(0048) 	disp_word(68, 2, CB7A2);
    03C8 E082      LDI	R24,2
    03C9 8388      STD	Y+0,R24
    03CA E022      LDI	R18,2
    03CB E404      LDI	R16,0x44
    03CC 940E04F1  CALL	_disp_word
(0049) 	disp_word(84, 2, CCDF8);
    03CE E083      LDI	R24,3
    03CF 8388      STD	Y+0,R24
    03D0 E022      LDI	R18,2
    03D1 E504      LDI	R16,0x54
    03D2 940E04F1  CALL	_disp_word
(0050) 	disp_char_str(8, 5, "www.iccavr.com");	/*显示网址信息*/
    03D4 E080      LDI	R24,0
    03D5 E091      LDI	R25,1
    03D6 8399      STD	Y+1,R25
    03D7 8388      STD	Y+0,R24
    03D8 E025      LDI	R18,5
    03D9 E008      LDI	R16,0x8
    03DA 940E055A  CALL	_disp_char_str
(0051) 
(0052) 	while (1);
    03DC CFFF      RJMP	0x03DC
    03DD 9622      ADIW	R28,2
    03DE 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\018-LCD12864\lcd12864.c
(0001) /*
(0002) 	LCD12864液晶屏驱动模块
(0003) 	1、可直接嵌入到项目中使用
(0004) 	2、晶振频率:1M
(0005) 	3、如晶振提高低层驱动延时要作相应修改
(0006) 
(0007) 	AVR_AFA
(0008) 	www.iccavr.com
(0009) */
(0010) 
(0011) #include <iom128v.h>
(0012) #include "font.h"
(0013) 
(0014) #define RS_CLR	PORTC &= ~(1 << PC2)		/*命令或数据选择*/
(0015) #define RS_SET	PORTC |= (1 << PC2)			/*RS = 1命令,RS = 0数据*/
(0016) 
(0017) #define RW_CLR	PORTC &= ~(1 << PC3)		/*读取或写入选择*/
(0018) #define RW_SET	PORTC |= (1 << PC3)			/*RW = 1读,RW = 0写*/
(0019) 
(0020) #define EN_CLR	PORTC &= ~(1 << PC4)		/*读写使能信号*/
(0021) #define EN_SET	PORTC |= (1 << PC4)			/*下降沿有效*/
(0022) 
(0023) #define RST_CLR	PORTC &= ~(1 << PC5)		/*芯片复位脚*/
(0024) #define RST_SET	PORTC |= (1 << PC5)			/*高电平复位*/
(0025) 
(0026) #define CSA_CLR	PORTC &= ~(1 << PC7)		/*左半屏片选*/
(0027) #define CSA_SET	PORTC |= (1 << PC7)			/*高电平选中*/
(0028) 
(0029) #define CSB_CLR	PORTC &= ~(1 << PC6)		/*右半屏片选*/
(0030) #define CSB_SET	PORTC |= (1 << PC6)			/*高电平选中*/
(0031) 
(0032) /*延时函数*/
(0033) void delay_us(unsigned int n) {
(0034) 
(0035) 	if (n == 0) {
_delay_us:
  n                    --> R16
    03DF 3000      CPI	R16,0
    03E0 0701      CPC	R16,R17
    03E1 F409      BNE	0x03E3
(0036) 		return ;
    03E2 C006      RJMP	0x03E9
(0037) 		}
(0038) 	while (--n);
    03E3 01C8      MOVW	R24,R16
    03E4 9701      SBIW	R24,1
    03E5 018C      MOVW	R16,R24
    03E6 3000      CPI	R16,0
    03E7 0701      CPC	R16,R17
    03E8 F7D1      BNE	0x03E3
    03E9 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    03EA 940E0594  CALL	push_gset2
(0039) }
(0040) 
(0041) /*延时函数*/
(0042) void delay_ms(unsigned char i) {
(0043) 
(0044) 	unsigned char a, b;
(0045) 	for (a = 1; a < i; a++) {
    03EC E041      LDI	R20,1
    03ED C006      RJMP	0x03F4
(0046) 		for (b = 1; b; b++) {
    03EE E061      LDI	R22,1
    03EF C001      RJMP	0x03F1
    03F0 9563      INC	R22
    03F1 2366      TST	R22
    03F2 F7E9      BNE	0x03F0
    03F3 9543      INC	R20
    03F4 1740      CP	R20,R16
    03F5 F3C0      BCS	0x03EE
    03F6 940E0585  CALL	pop_gset2
    03F8 9508      RET
_LCD0_write_com:
  com                  --> R20
    03F9 940E0596  CALL	push_gset1
    03FB 2F40      MOV	R20,R16
(0047) 			;
(0048) 			}
(0049) 		}
(0050) }
(0051) 
(0052) /*显示屏命令写入函数前半屏*/
(0053) void LCD0_write_com(unsigned char com) {
(0054) 	
(0055) 	RS_CLR;
    03FC 98AA      CBI	0x15,2
(0056) 	RW_CLR;
    03FD 98AB      CBI	0x15,3
(0057) 	CSA_SET;
    03FE 9AAF      SBI	0x15,7
(0058) 	CSB_CLR;
    03FF 98AE      CBI	0x15,6
(0059) 	EN_SET;
    0400 9AAC      SBI	0x15,4
(0060) 	PORTA = com;
    0401 BB4B      OUT	0x1B,R20
(0061) 	delay_us(1);
    0402 E001      LDI	R16,1
    0403 E010      LDI	R17,0
    0404 DFDA      RCALL	_delay_us
(0062) 	EN_CLR;
    0405 98AC      CBI	0x15,4
    0406 940E0599  CALL	pop_gset1
    0408 9508      RET
_LCD1_write_com:
  com                  --> R20
    0409 940E0596  CALL	push_gset1
    040B 2F40      MOV	R20,R16
(0063) }
(0064) 
(0065) /*显示屏命令写入函数后半屏*/
(0066) void LCD1_write_com(unsigned char com) {
(0067) 	
(0068) 	RS_CLR;
    040C 98AA      CBI	0x15,2
(0069) 	RW_CLR;
    040D 98AB      CBI	0x15,3
(0070) 	CSA_CLR;
    040E 98AF      CBI	0x15,7
(0071) 	CSB_SET;
    040F 9AAE      SBI	0x15,6
(0072) 	EN_SET;
    0410 9AAC      SBI	0x15,4
(0073) 	PORTA = com;
    0411 BB4B      OUT	0x1B,R20
(0074) 	delay_us(1);
    0412 E001      LDI	R16,1
    0413 E010      LDI	R17,0
    0414 DFCA      RCALL	_delay_us
(0075) 	EN_CLR;
    0415 98AC      CBI	0x15,4
    0416 940E0599  CALL	pop_gset1
    0418 9508      RET
_LCD0_write_data:
  data                 --> R20
    0419 940E0596  CALL	push_gset1
    041B 2F40      MOV	R20,R16
(0076) }
(0077) 
(0078) /*显示屏命令写入函数*/
(0079) void LCD0_write_data(unsigned char data) {
(0080) 
(0081) 	RS_SET;
    041C 9AAA      SBI	0x15,2
(0082) 	RW_CLR;
    041D 98AB      CBI	0x15,3
(0083) 	CSA_SET;
    041E 9AAF      SBI	0x15,7
(0084) 	CSB_CLR;
    041F 98AE      CBI	0x15,6
(0085) 	EN_SET;
    0420 9AAC      SBI	0x15,4
(0086) 	PORTA = data;
    0421 BB4B      OUT	0x1B,R20
(0087) 	delay_us(1);
    0422 E001      LDI	R16,1
    0423 E010      LDI	R17,0
    0424 DFBA      RCALL	_delay_us
(0088) 	EN_CLR;
    0425 98AC      CBI	0x15,4
    0426 940E0599  CALL	pop_gset1
    0428 9508      RET
_LCD1_write_data:
  data                 --> R20
    0429 940E0596  CALL	push_gset1
    042B 2F40      MOV	R20,R16
(0089) }
(0090) 
(0091) /*显示屏命令写入函数*/
(0092) void LCD1_write_data(unsigned char data) {
(0093) 
(0094) 	RS_SET;
    042C 9AAA      SBI	0x15,2
(0095) 	RW_CLR;
    042D 98AB      CBI	0x15,3
(0096) 	CSA_CLR;
    042E 98AF      CBI	0x15,7
(0097) 	CSB_SET;
    042F 9AAE      SBI	0x15,6
(0098) 	EN_SET;
    0430 9AAC      SBI	0x15,4
(0099) 	PORTA = data;
    0431 BB4B      OUT	0x1B,R20
(0100) 	delay_us(1);
    0432 E001      LDI	R16,1
    0433 E010      LDI	R17,0
    0434 DFAA      RCALL	_delay_us
(0101) 	EN_CLR;
    0435 98AC      CBI	0x15,4
    0436 940E0599  CALL	pop_gset1
    0438 9508      RET
_disp_clear:
  x                    --> R20
  y                    --> R10
  x1                   --> R22
  x0                   --> R12
    0439 940E0590  CALL	push_gset4
    043B 2F62      MOV	R22,R18
    043C 2EC0      MOV	R12,R16
    043D 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;
    043E 2D4C      MOV	R20,R12
(0111) 	if (x < 63) {						/*地址在左半屏范围内*/
    043F 334F      CPI	R20,0x3F
    0440 F470      BCC	0x044F
(0112) 		LCD0_write_com(y | 0xB8);
    0441 2D0A      MOV	R16,R10
    0442 6B08      ORI	R16,0xB8
    0443 DFB5      RCALL	_LCD0_write_com
(0113) 		LCD0_write_com(x | 0x40);
    0444 2F04      MOV	R16,R20
    0445 6400      ORI	R16,0x40
    0446 DFB2      RCALL	_LCD0_write_com
(0114) 		}
    0447 C007      RJMP	0x044F
(0115) 	while (x < x1) {
(0116) 		LCD0_write_data(0x00);
    0448 2700      CLR	R16
    0449 DFCF      RCALL	_LCD0_write_data
(0117) 		x ++;
    044A 9543      INC	R20
(0118) 		if (x > 63) {					/*判断地址是否越界*/
    044B E38F      LDI	R24,0x3F
    044C 1784      CP	R24,R20
    044D F408      BCC	0x044F
(0119) 			break;
    044E C002      RJMP	0x0451
    044F 1746      CP	R20,R22
    0450 F3B8      BCS	0x0448
(0120) 			}
(0121) 		}
(0122) 	if (x < x1) {						/*地址进入左半屏范围*/
    0451 1746      CP	R20,R22
    0452 F450      BCC	0x045D
(0123) 		LCD1_write_com(y | 0xB8);
    0453 2D0A      MOV	R16,R10
    0454 6B08      ORI	R16,0xB8
    0455 DFB3      RCALL	_LCD1_write_com
(0124) 		LCD1_write_com(x | 0x40);
    0456 2F04      MOV	R16,R20
    0457 6400      ORI	R16,0x40
    0458 DFB0      RCALL	_LCD1_write_com
(0125) 		}
    0459 C003      RJMP	0x045D
(0126) 	while (x < x1) {
(0127) 		LCD1_write_data(0x00);
    045A 2700      CLR	R16
    045B DFCD      RCALL	_LCD1_write_data
(0128) 		x ++;
    045C 9543      INC	R20
    045D 1746      CP	R20,R22
    045E F3D8      BCS	0x045A
(0129) 		}
(0130) 
(0131) 	/*清除低位*/
(0132) 	x = x0;
    045F 2D4C      MOV	R20,R12
(0133) 	if (x < 63) {						/*地址在左半屏范围内*/
    0460 334F      CPI	R20,0x3F
    0461 F478      BCC	0x0471
(0134) 		LCD0_write_com((y+1) | 0xB8);
    0462 2D0A      MOV	R16,R10
    0463 5F0F      SUBI	R16,0xFF
    0464 6B08      ORI	R16,0xB8
    0465 DF93      RCALL	_LCD0_write_com
(0135) 		LCD0_write_com(x | 0x40);
    0466 2F04      MOV	R16,R20
    0467 6400      ORI	R16,0x40
    0468 DF90      RCALL	_LCD0_write_com
(0136) 		}
    0469 C007      RJMP	0x0471
(0137) 	while (x < x1) {
(0138) 		LCD0_write_data(0x00);
    046A 2700      CLR	R16
    046B DFAD      RCALL	_LCD0_write_data
(0139) 		x ++;
    046C 9543      INC	R20
(0140) 		if (x > 63) {					/*判断地址是否越界*/
    046D E38F      LDI	R24,0x3F
    046E 1784      CP	R24,R20
    046F F408      BCC	0x0471
(0141) 			break;
    0470 C002      RJMP	0x0473
    0471 1746      CP	R20,R22
    0472 F3B8      BCS	0x046A
(0142) 			}
(0143) 		}
(0144) 	if (x < x1) {						/*地址进入左半屏范围*/
    0473 1746      CP	R20,R22
    0474 F458      BCC	0x0480
(0145) 		LCD1_write_com((y+1) | 0xB8);
    0475 2D0A      MOV	R16,R10
    0476 5F0F      SUBI	R16,0xFF
    0477 6B08      ORI	R16,0xB8
    0478 DF90      RCALL	_LCD1_write_com
(0146) 		LCD1_write_com(x | 0x40);
    0479 2F04      MOV	R16,R20
    047A 6400      ORI	R16,0x40
    047B DF8D      RCALL	_LCD1_write_com
(0147) 		}
    047C C003      RJMP	0x0480
(0148) 	while (x < x1) {
(0149) 		LCD1_write_data(0x00);
    047D 2700      CLR	R16
    047E DFAA      RCALL	_LCD1_write_data

⌨️ 快捷键说明

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