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

📄 015.lst

📁 基于AVR芯片的LCD显示实验代码,可以参考做练习
💻 LST
字号:
__text_start:
__start:
    0036 E5CF      LDI	R28,0x5F
    0037 E0D4      LDI	R29,4
    0038 BFCD      OUT	0x3D,R28
    0039 BFDE      OUT	0x3E,R29
    003A 51C0      SUBI	R28,0x10
    003B 40D0      SBCI	R29,0
    003C EA0A      LDI	R16,0xAA
    003D 8308      STD	Y+0,R16
    003E 2400      CLR	R0
    003F E7E7      LDI	R30,0x77
    0040 E0F0      LDI	R31,0
    0041 E010      LDI	R17,0
    0042 37E7      CPI	R30,0x77
    0043 07F1      CPC	R31,R17
    0044 F011      BEQ	0x0047
    0045 9201      ST	R0,Z+
    0046 CFFB      RJMP	0x0042
    0047 8300      STD	Z+0,R16
    0048 E5E4      LDI	R30,0x54
    0049 E0F0      LDI	R31,0
    004A E6A0      LDI	R26,0x60
    004B E0B0      LDI	R27,0
    004C E010      LDI	R17,0
    004D 36EB      CPI	R30,0x6B
    004E 07F1      CPC	R31,R17
    004F F021      BEQ	0x0054
    0050 95C8      LPM
    0051 9631      ADIW	R30,1
    0052 920D      ST	R0,X+
    0053 CFF9      RJMP	0x004D
    0054 940E00DE  CALL	_main
_exit:
    0056 CFFF      RJMP	_exit
FILE: E:\ICCAVR\project\AVRMEG~2\icc\015-LCD1602\lcd1602.c
(0001) /*
(0002) 	LCD1602液晶屏驱动模块
(0003) 	1、可直接嵌入到项目中使用
(0004) 	2、晶振频率:1M
(0005) 	3、如晶振提高低层驱动延时要作相应修改
(0006) 
(0007) 	AVR_AFA
(0008) 	www.iccavr.com
(0009) 	程序编写过程中参照了peak的4线显示程序
(0010) 	peak:AVR论坛技术版版主
(0011) */
(0012) 
(0013) #include <iom16v.h>
(0014) 
(0015) #define RS_CLR	PORTD &= ~(1 << PD3)
(0016) #define RS_SET	PORTD |= (1 << PD3)
(0017) 
(0018) #define RW_CLR	PORTD &= ~(1 << PD4)
(0019) #define RW_SET	PORTD |= (1 << PD4)
(0020) 
(0021) #define EN_CLR	PORTD &= ~(1 << PD6)
(0022) #define EN_SET	PORTD |= (1 << PD6)
(0023) 
(0024) /*延时函数*/
(0025) void delay_us(unsigned int n) {
(0026) 
(0027) 	if (n == 0) {
_delay_us:
  n                    --> R16
    0057 3000      CPI	R16,0
    0058 0701      CPC	R16,R17
    0059 F409      BNE	0x005B
(0028) 		return ;
    005A C006      RJMP	0x0061
(0029) 		}
(0030) 	while (--n);
    005B 01C8      MOVW	R24,R16
    005C 9701      SBIW	R24,1
    005D 018C      MOVW	R16,R24
    005E 3000      CPI	R16,0
    005F 0701      CPC	R16,R17
    0060 F7D1      BNE	0x005B
    0061 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    0062 940E0126  CALL	push_gset2
(0031) }
(0032) 
(0033) /*延时函数*/
(0034) void delay_ms(unsigned char i) {
(0035) 
(0036) 	unsigned char a, b;
(0037) 	for (a = 1; a < i; a++) {
    0064 E041      LDI	R20,1
    0065 C006      RJMP	0x006C
(0038) 		for (b = 1; b; b++) {
    0066 E061      LDI	R22,1
    0067 C001      RJMP	0x0069
    0068 9563      INC	R22
    0069 2366      TST	R22
    006A F7E9      BNE	0x0068
    006B 9543      INC	R20
    006C 1740      CP	R20,R16
    006D F3C0      BCS	0x0066
    006E 940E011A  CALL	pop_gset2
    0070 9508      RET
_LCD_write_com:
  com                  --> R20
    0071 940E0128  CALL	push_gset1
    0073 2F40      MOV	R20,R16
(0039) 			;
(0040) 			}
(0041) 		}
(0042) }
(0043) 
(0044) /*显示屏命令写入函数*/
(0045) void LCD_write_com(unsigned char com) {
(0046) 	
(0047) 	RS_CLR;
    0074 9893      CBI	0x12,3
(0048) 	RW_CLR;
    0075 9894      CBI	0x12,4
(0049) 	EN_SET;
    0076 9A96      SBI	0x12,6
(0050) 	PORTB = com;
    0077 BB48      OUT	0x18,R20
(0051) 	delay_us(5);
    0078 E005      LDI	R16,5
    0079 E010      LDI	R17,0
    007A DFDC      RCALL	_delay_us
(0052) 	EN_CLR;
    007B 9896      CBI	0x12,6
    007C 940E012B  CALL	pop_gset1
    007E 9508      RET
_LCD_write_data:
  data                 --> R20
    007F 940E0128  CALL	push_gset1
    0081 2F40      MOV	R20,R16
(0053) }
(0054) 
(0055) /*显示屏命令写入函数*/
(0056) void LCD_write_data(unsigned char data) {
(0057) 
(0058) 	RS_SET;
    0082 9A93      SBI	0x12,3
(0059) 	RW_CLR;
    0083 9894      CBI	0x12,4
(0060) 	EN_SET;
    0084 9A96      SBI	0x12,6
(0061) 	PORTB = data;
    0085 BB48      OUT	0x18,R20
(0062) 	delay_us(5);
    0086 E005      LDI	R16,5
    0087 E010      LDI	R17,0
    0088 DFCE      RCALL	_delay_us
(0063) 	EN_CLR;
    0089 9896      CBI	0x12,6
    008A 940E012B  CALL	pop_gset1
    008C 9508      RET
(0064) }
(0065) 
(0066) /*显示屏清空显示*/
(0067) void LCD_clear(void) {
(0068) 
(0069) 	LCD_write_com(0x01);
_LCD_clear:
    008D E001      LDI	R16,1
    008E DFE2      RCALL	_LCD_write_com
(0070) 	delay_ms(5);
    008F E005      LDI	R16,5
    0090 DFD1      RCALL	_delay_ms
    0091 9508      RET
_LCD_write_str:
  s                    --> R20
  y                    --> R10
  x                    --> R22
    0092 940E0124  CALL	push_gset3
    0094 2EA2      MOV	R10,R18
    0095 2F60      MOV	R22,R16
    0096 814E      LDD	R20,Y+6
    0097 815F      LDD	R21,Y+7
(0071) }
(0072) 
(0073) /*显示屏字符串写入函数*/
(0074) void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) {
(0075) 	
(0076)     if (y == 0) {
    0098 20AA      TST	R10
    0099 F421      BNE	0x009E
(0077)     	LCD_write_com(0x80 + x);
    009A 2F06      MOV	R16,R22
    009B 5800      SUBI	R16,0x80
    009C DFD4      RCALL	_LCD_write_com
(0078)     	}
    009D C009      RJMP	0x00A7
(0079)     else {
(0080)     	LCD_write_com(0xC0 + x);
    009E 2F06      MOV	R16,R22
    009F 5400      SUBI	R16,0x40
    00A0 DFD0      RCALL	_LCD_write_com
(0081)     	}
    00A1 C005      RJMP	0x00A7
(0082)     
(0083)     while (*s) {
(0084)     	LCD_write_data( *s);
    00A2 01FA      MOVW	R30,R20
    00A3 8100      LDD	R16,Z+0
    00A4 DFDA      RCALL	_LCD_write_data
(0085)     	s ++;
    00A5 5F4F      SUBI	R20,0xFF
    00A6 4F5F      SBCI	R21,0xFF
    00A7 01FA      MOVW	R30,R20
    00A8 8020      LDD	R2,Z+0
    00A9 2022      TST	R2
    00AA F7B9      BNE	0x00A2
    00AB 940E011D  CALL	pop_gset3
    00AD 9508      RET
_LCD_write_char:
  data                 --> Y+4
  y                    --> R22
  x                    --> R20
    00AE 940E0126  CALL	push_gset2
    00B0 2F62      MOV	R22,R18
    00B1 2F40      MOV	R20,R16
(0086)     	}
(0087) }
(0088) 
(0089) /*显示屏单字符写入函数*/
(0090) void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) {
(0091) 	
(0092)     if (y == 0) {
    00B2 2366      TST	R22
    00B3 F421      BNE	0x00B8
(0093)     	LCD_write_com(0x80 + x);
    00B4 2F04      MOV	R16,R20
    00B5 5800      SUBI	R16,0x80
    00B6 DFBA      RCALL	_LCD_write_com
(0094)     	}
    00B7 C003      RJMP	0x00BB
(0095)     else {
(0096)     	LCD_write_com(0xC0 + x);
    00B8 2F04      MOV	R16,R20
    00B9 5400      SUBI	R16,0x40
    00BA DFB6      RCALL	_LCD_write_com
(0097)     	}
(0098)     
(0099)     LCD_write_data( data);  
    00BB 810C      LDD	R16,Y+4
    00BC DFC2      RCALL	_LCD_write_data
    00BD 940E011A  CALL	pop_gset2
    00BF 9508      RET
(0100) }
(0101) 
(0102) /*显示屏初始化函数*/
(0103) void LCD_init(void) {
(0104) 	
(0105) 	DDRB = 0xFF;						/*I/O口方向设置*/
_LCD_init:
    00C0 EF8F      LDI	R24,0xFF
    00C1 BB87      OUT	0x17,R24
(0106) 	DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6);
    00C2 B381      IN	R24,0x11
    00C3 6588      ORI	R24,0x58
    00C4 BB81      OUT	0x11,R24
(0107) 	LCD_write_com(0x38);				/*显示模式设置*/
    00C5 E308      LDI	R16,0x38
    00C6 DFAA      RCALL	_LCD_write_com
(0108) 	delay_ms(5);
    00C7 E005      LDI	R16,5
    00C8 DF99      RCALL	_delay_ms
(0109) 	LCD_write_com(0x38);
    00C9 E308      LDI	R16,0x38
    00CA DFA6      RCALL	_LCD_write_com
(0110) 	delay_ms(5);
    00CB E005      LDI	R16,5
    00CC DF95      RCALL	_delay_ms
(0111) 	LCD_write_com(0x38);
    00CD E308      LDI	R16,0x38
    00CE DFA2      RCALL	_LCD_write_com
(0112) 	delay_ms(5);
    00CF E005      LDI	R16,5
    00D0 DF91      RCALL	_delay_ms
(0113) 	LCD_write_com(0x38);
    00D1 E308      LDI	R16,0x38
    00D2 DF9E      RCALL	_LCD_write_com
(0114) 	
(0115) 	LCD_write_com(0x08);				/*显示关闭*/
    00D3 E008      LDI	R16,0x8
    00D4 DF9C      RCALL	_LCD_write_com
(0116) 	LCD_write_com(0x01);				/*显示清屏*/
    00D5 E001      LDI	R16,1
    00D6 DF9A      RCALL	_LCD_write_com
(0117) 	LCD_write_com(0x06);				/*显示光标移动设置*/
    00D7 E006      LDI	R16,6
    00D8 DF98      RCALL	_LCD_write_com
(0118) 	delay_ms(5);
    00D9 E005      LDI	R16,5
    00DA DF87      RCALL	_delay_ms
(0119) 	LCD_write_com(0x0C);				/*显示开及光标设置*/
    00DB E00C      LDI	R16,0xC
    00DC DF94      RCALL	_LCD_write_com
    00DD 9508      RET
_main:
  i                    --> R20
  p                    --> R22
    00DE 9722      SBIW	R28,2
FILE: E:\ICCAVR\project\AVRMEG~2\icc\015-LCD1602\main.c
(0001) /*
(0002) 实验十五:
(0003) 	LCD1602显示实验。
(0004) 	1、LCD1602显示实验。显示欢及网址信息。
(0005) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 	3、进行此实验请插上JP1、JP2的所有8个短路块,PC7短路块。
(0007) 
(0008) 	AVR  mega16学习板
(0009) 	www.iccavr.com
(0010) 	2007-04-13
(0011) */
(0012) 
(0013) #include <iom16v.h>
(0014) #include "lcd1602.h"
(0015) 
(0016) void main(void) {
(0017) 
(0018) 	unsigned char i;
(0019) 	unsigned char *p;
(0020) 
(0021) 	PORTA = 0xFF;				/*打开上拉*/
    00DF EF8F      LDI	R24,0xFF
    00E0 BB8B      OUT	0x1B,R24
(0022) 	DDRA = 0x00;				/*方向输入*/
    00E1 2422      CLR	R2
    00E2 BA2A      OUT	0x1A,R2
(0023) 	PORTB = 0xFF;				/*电平设置*/
    00E3 BB88      OUT	0x18,R24
(0024) 	DDRB = 0xFF;				/*方向输出*/
    00E4 BB87      OUT	0x17,R24
(0025) 	PORTC = 0x7F;
    00E5 E78F      LDI	R24,0x7F
    00E6 BB85      OUT	0x15,R24
(0026) 	DDRC = 0x80;
    00E7 E880      LDI	R24,0x80
    00E8 BB84      OUT	0x14,R24
(0027) 	PORTD = 0xFF;
    00E9 EF8F      LDI	R24,0xFF
    00EA BB82      OUT	0x12,R24
(0028) 	DDRD = 0x00;
    00EB BA21      OUT	0x11,R2
(0029) 
(0030) 	delay_ms(100);
    00EC E604      LDI	R16,0x64
    00ED 940E0062  CALL	_delay_ms
(0031) 	LCD_init();
    00EF 940E00C0  CALL	_LCD_init
    00F1 C025      RJMP	0x0117
(0032) 
(0033) 	while (1) {
(0034) 		i = 1;
    00F2 E041      LDI	R20,1
(0035) 		p = "www.iccavr.com";
    00F3 E668      LDI	R22,0x68
    00F4 E070      LDI	R23,0
(0036) 		LCD_clear();
    00F5 940E008D  CALL	_LCD_clear
(0037) 		LCD_write_str(5,0,"Welcome");
    00F7 E680      LDI	R24,0x60
    00F8 E090      LDI	R25,0
    00F9 8399      STD	Y+1,R25
    00FA 8388      STD	Y+0,R24
    00FB 2722      CLR	R18
    00FC E005      LDI	R16,5
    00FD 940E0092  CALL	_LCD_write_str
(0038) 		delay_ms(250);
    00FF EF0A      LDI	R16,0xFA
    0100 940E0062  CALL	_delay_ms
    0102 C00D      RJMP	0x0110
(0039) 		
(0040) 		while (*p) {
(0041) 			LCD_write_char(i,1,*p);
    0103 01FB      MOVW	R30,R22
    0104 8020      LDD	R2,Z+0
    0105 8228      STD	Y+0,R2
    0106 E021      LDI	R18,1
    0107 2F04      MOV	R16,R20
    0108 940E00AE  CALL	_LCD_write_char
(0042) 			i ++;
    010A 9543      INC	R20
(0043) 			p ++;
    010B 5F6F      SUBI	R22,0xFF
    010C 4F7F      SBCI	R23,0xFF
(0044) 			delay_ms(250);
    010D EF0A      LDI	R16,0xFA
    010E 940E0062  CALL	_delay_ms
    0110 01FB      MOVW	R30,R22
    0111 8020      LDD	R2,Z+0
    0112 2022      TST	R2
    0113 F779      BNE	0x0103
(0045) 			}
(0046) 		delay_ms(250);
FILE: <library>
    0114 EF0A      LDI	R16,0xFA
    0115 940E0062  CALL	_delay_ms
    0117 CFDA      RJMP	0x00F2
    0118 9622      ADIW	R28,2
    0119 9508      RET
pop_gset2:
    011A E0E2      LDI	R30,2
    011B 940C012C  JMP	pop
pop_gset3:
    011D E0E4      LDI	R30,4
    011E 940C012C  JMP	pop
push_gset5:
    0120 92FA      ST	R15,-Y
    0121 92EA      ST	R14,-Y
push_gset4:
    0122 92DA      ST	R13,-Y
    0123 92CA      ST	R12,-Y
push_gset3:
    0124 92BA      ST	R11,-Y
    0125 92AA      ST	R10,-Y
push_gset2:
    0126 937A      ST	R23,-Y
    0127 936A      ST	R22,-Y
push_gset1:
    0128 935A      ST	R21,-Y
    0129 934A      ST	R20,-Y
    012A 9508      RET
pop_gset1:
    012B E0E1      LDI	R30,1
pop:
    012C 9149      LD	R20,Y+
    012D 9159      LD	R21,Y+
    012E FDE0      SBRC	R30,0
    012F 9508      RET
    0130 9169      LD	R22,Y+
    0131 9179      LD	R23,Y+
    0132 FDE1      SBRC	R30,1
    0133 9508      RET
    0134 90A9      LD	R10,Y+
    0135 90B9      LD	R11,Y+
    0136 FDE2      SBRC	R30,2
    0137 9508      RET
    0138 90C9      LD	R12,Y+
    0139 90D9      LD	R13,Y+
    013A FDE3      SBRC	R30,3
    013B 9508      RET
    013C 90E9      LD	R14,Y+
    013D 90F9      LD	R15,Y+
    013E 9508      RET

⌨️ 快捷键说明

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