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

📄 17lcd.lst

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 LST
字号:
__text_start:
__start:
    0052 EFCF      LDI	R28,0xFF
    0053 E1D0      LDI	R29,0x10
    0054 BFCD      OUT	0x3D,R28
    0055 BFDE      OUT	0x3E,R29
    0056 51C0      SUBI	R28,0x10
    0057 40D0      SBCI	R29,0
    0058 EA0A      LDI	R16,0xAA
    0059 8308      STD	Y+0,R16
    005A 2400      CLR	R0
    005B E1E7      LDI	R30,0x17
    005C E0F1      LDI	R31,1
    005D E011      LDI	R17,1
    005E 31E7      CPI	R30,0x17
    005F 07F1      CPC	R31,R17
    0060 F011      BEQ	0x0063
    0061 9201      ST	R0,Z+
    0062 CFFB      RJMP	0x005E
    0063 8300      STD	Z+0,R16
    0064 E8EC      LDI	R30,0x8C
    0065 E0F0      LDI	R31,0
    0066 E0A0      LDI	R26,0
    0067 E0B1      LDI	R27,1
    0068 E010      LDI	R17,0
    0069 3AE3      CPI	R30,0xA3
    006A 07F1      CPC	R31,R17
    006B F021      BEQ	0x0070
    006C 95C8      LPM
    006D 9631      ADIW	R30,1
    006E 920D      ST	R0,X+
    006F CFF9      RJMP	0x0069
    0070 940E010D  CALL	_main
_exit:
    0072 CFFF      RJMP	_exit
FILE: E:\ICCAVR\project\AVRMEG~3\icc\017-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 <iom128v.h>
(0014) 
(0015) #define RS_CLR	PORTC &= ~(1 << PC2)
(0016) #define RS_SET	PORTC |= (1 << PC2)
(0017) 
(0018) #define RW_CLR	PORTC &= ~(1 << PC3)
(0019) #define RW_SET	PORTC |= (1 << PC3)
(0020) 
(0021) #define EN_CLR	PORTC &= ~(1 << PC4)
(0022) #define EN_SET	PORTC |= (1 << PC4)
(0023) 
(0024) /*延时函数*/
(0025) void delay_us(unsigned int n) {
(0026) 
(0027) 	if (n == 0) {
_delay_us:
  n                    --> R16
    0073 3000      CPI	R16,0
    0074 0701      CPC	R16,R17
    0075 F409      BNE	0x0077
(0028) 		return ;
    0076 C006      RJMP	0x007D
(0029) 		}
(0030) 	while (--n);
    0077 01C8      MOVW	R24,R16
    0078 9701      SBIW	R24,1
    0079 018C      MOVW	R16,R24
    007A 3000      CPI	R16,0
    007B 0701      CPC	R16,R17
    007C F7D1      BNE	0x0077
    007D 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  i                    --> R16
    007E 940E0149  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++) {
    0080 E041      LDI	R20,1
    0081 C006      RJMP	0x0088
(0038) 		for (b = 1; b; b++) {
    0082 E061      LDI	R22,1
    0083 C001      RJMP	0x0085
    0084 9563      INC	R22
    0085 2366      TST	R22
    0086 F7E9      BNE	0x0084
    0087 9543      INC	R20
    0088 1740      CP	R20,R16
    0089 F3C0      BCS	0x0082
    008A 940E013D  CALL	pop_gset2
    008C 9508      RET
_LCD_write_com:
  com                  --> R20
    008D 940E014B  CALL	push_gset1
    008F 2F40      MOV	R20,R16
(0039) 			;
(0040) 			}
(0041) 		}
(0042) }
(0043) 
(0044) /*显示屏命令写入函数*/
(0045) void LCD_write_com(unsigned char com) {
(0046) 	
(0047) 	RS_CLR;
    0090 98AA      CBI	0x15,2
(0048) 	RW_CLR;
    0091 98AB      CBI	0x15,3
(0049) 	EN_SET;
    0092 9AAC      SBI	0x15,4
(0050) 	PORTA = com;
    0093 BB4B      OUT	0x1B,R20
(0051) 	delay_us(5);
    0094 E005      LDI	R16,5
    0095 E010      LDI	R17,0
    0096 DFDC      RCALL	_delay_us
(0052) 	EN_CLR;
    0097 98AC      CBI	0x15,4
    0098 940E014E  CALL	pop_gset1
    009A 9508      RET
_LCD_write_data:
  data                 --> R20
    009B 940E014B  CALL	push_gset1
    009D 2F40      MOV	R20,R16
(0053) }
(0054) 
(0055) /*显示屏命令写入函数*/
(0056) void LCD_write_data(unsigned char data) {
(0057) 
(0058) 	RS_SET;
    009E 9AAA      SBI	0x15,2
(0059) 	RW_CLR;
    009F 98AB      CBI	0x15,3
(0060) 	EN_SET;
    00A0 9AAC      SBI	0x15,4
(0061) 	PORTA = data;
    00A1 BB4B      OUT	0x1B,R20
(0062) 	delay_us(5);
    00A2 E005      LDI	R16,5
    00A3 E010      LDI	R17,0
    00A4 DFCE      RCALL	_delay_us
(0063) 	EN_CLR;
    00A5 98AC      CBI	0x15,4
    00A6 940E014E  CALL	pop_gset1
    00A8 9508      RET
(0064) }
(0065) 
(0066) /*显示屏清空显示*/
(0067) void LCD_clear(void) {
(0068) 
(0069) 	LCD_write_com(0x01);
_LCD_clear:
    00A9 E001      LDI	R16,1
    00AA DFE2      RCALL	_LCD_write_com
(0070) 	delay_ms(5);
    00AB E005      LDI	R16,5
    00AC DFD1      RCALL	_delay_ms
    00AD 9508      RET
_LCD_write_str:
  s                    --> R20
  y                    --> R10
  x                    --> R22
    00AE 940E0147  CALL	push_gset3
    00B0 2EA2      MOV	R10,R18
    00B1 2F60      MOV	R22,R16
    00B2 814E      LDD	R20,Y+6
    00B3 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) {
    00B4 20AA      TST	R10
    00B5 F421      BNE	0x00BA
(0077)     	LCD_write_com(0x80 + x);
    00B6 2F06      MOV	R16,R22
    00B7 5800      SUBI	R16,0x80
    00B8 DFD4      RCALL	_LCD_write_com
(0078)     	}
    00B9 C009      RJMP	0x00C3
(0079)     else {
(0080)     	LCD_write_com(0xC0 + x);
    00BA 2F06      MOV	R16,R22
    00BB 5400      SUBI	R16,0x40
    00BC DFD0      RCALL	_LCD_write_com
(0081)     	}
    00BD C005      RJMP	0x00C3
(0082)     
(0083)     while (*s) {
(0084)     	LCD_write_data( *s);
    00BE 01FA      MOVW	R30,R20
    00BF 8100      LDD	R16,Z+0
    00C0 DFDA      RCALL	_LCD_write_data
(0085)     	s ++;
    00C1 5F4F      SUBI	R20,0xFF
    00C2 4F5F      SBCI	R21,0xFF
    00C3 01FA      MOVW	R30,R20
    00C4 8020      LDD	R2,Z+0
    00C5 2022      TST	R2
    00C6 F7B9      BNE	0x00BE
    00C7 940E0140  CALL	pop_gset3
    00C9 9508      RET
_LCD_write_char:
  data                 --> Y+4
  y                    --> R22
  x                    --> R20
    00CA 940E0149  CALL	push_gset2
    00CC 2F62      MOV	R22,R18
    00CD 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) {
    00CE 2366      TST	R22
    00CF F421      BNE	0x00D4
(0093)     	LCD_write_com(0x80 + x);
    00D0 2F04      MOV	R16,R20
    00D1 5800      SUBI	R16,0x80
    00D2 DFBA      RCALL	_LCD_write_com
(0094)     	}
    00D3 C003      RJMP	0x00D7
(0095)     else {
(0096)     	LCD_write_com(0xC0 + x);
    00D4 2F04      MOV	R16,R20
    00D5 5400      SUBI	R16,0x40
    00D6 DFB6      RCALL	_LCD_write_com
(0097)     	}
(0098)     
(0099)     LCD_write_data( data);  
    00D7 810C      LDD	R16,Y+4
    00D8 DFC2      RCALL	_LCD_write_data
    00D9 940E013D  CALL	pop_gset2
    00DB 9508      RET
(0100) }
(0101) 
(0102) /*显示屏初始化函数*/
(0103) void LCD_init(void) {
(0104) 	
(0105) 	DDRA = 0xFF;						/*I/O口方向设置*/
_LCD_init:
    00DC EF8F      LDI	R24,0xFF
    00DD BB8A      OUT	0x1A,R24
(0106) 	DDRC = 0xFF;
    00DE BB84      OUT	0x14,R24
(0107) 	LCD_write_com(0x38);				/*显示模式设置*/
    00DF E308      LDI	R16,0x38
    00E0 DFAC      RCALL	_LCD_write_com
(0108) 	delay_ms(5);
    00E1 E005      LDI	R16,5
    00E2 DF9B      RCALL	_delay_ms
(0109) 	LCD_write_com(0x38);
    00E3 E308      LDI	R16,0x38
    00E4 DFA8      RCALL	_LCD_write_com
(0110) 	delay_ms(5);
    00E5 E005      LDI	R16,5
    00E6 DF97      RCALL	_delay_ms
(0111) 	LCD_write_com(0x38);
    00E7 E308      LDI	R16,0x38
    00E8 DFA4      RCALL	_LCD_write_com
(0112) 	delay_ms(5);
    00E9 E005      LDI	R16,5
    00EA DF93      RCALL	_delay_ms
(0113) 	LCD_write_com(0x38);
    00EB E308      LDI	R16,0x38
    00EC DFA0      RCALL	_LCD_write_com
(0114) 	
(0115) 	LCD_write_com(0x08);				/*显示关闭*/
    00ED E008      LDI	R16,0x8
    00EE DF9E      RCALL	_LCD_write_com
(0116) 	LCD_write_com(0x01);				/*显示清屏*/
    00EF E001      LDI	R16,1
    00F0 DF9C      RCALL	_LCD_write_com
(0117) 	LCD_write_com(0x06);				/*显示光标移动设置*/
    00F1 E006      LDI	R16,6
    00F2 DF9A      RCALL	_LCD_write_com
(0118) 	delay_ms(5);
    00F3 E005      LDI	R16,5
    00F4 DF89      RCALL	_delay_ms
(0119) 	LCD_write_com(0x0C);				/*显示开及光标设置*/
    00F5 E00C      LDI	R16,0xC
    00F6 DF96      RCALL	_LCD_write_com
    00F7 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\017-LCD1602\main.c
(0001) /*
(0002) 实验十七:
(0003) 	LCD1602显示实验。
(0004) 	1、LCD1602显示实验。显示欢迎及网址信息。
(0005) 	2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 	3、此实验可以让你学会LCD1602的使用方法。
(0007) 
(0008) 	AVR  mega16学习板
(0009) 	www.iccavr.com
(0010) 	23:03 2007-4-13
(0011) */
(0012) 
(0013) #include <iom128v.h>
(0014) #include "lcd1602.h"
(0015) 
(0016) /*IO口初始化函数*/
(0017) void io_init(void) {
(0018) 
(0019) 	DDRA = 0xFF;							/*方向输出*/
_io_init:
    00F8 EF8F      LDI	R24,0xFF
    00F9 BB8A      OUT	0x1A,R24
(0020) 	PORTA = 0xFF;							/*高电平*/
    00FA BB8B      OUT	0x1B,R24
(0021) 	DDRB = 0x00;							/*方向输入*/
    00FB 2422      CLR	R2
    00FC BA27      OUT	0x17,R2
(0022) 	PORTB = 0xFF;							/*打开上拉*/
    00FD BB88      OUT	0x18,R24
(0023) 	DDRC = 0xFF;							/*不用的IO口建议设置为输入带上拉*/
    00FE BB84      OUT	0x14,R24
(0024) 	PORTC = 0x00;
    00FF BA25      OUT	0x15,R2
(0025) 	DDRD = 0x00;
    0100 BA21      OUT	0x11,R2
(0026) 	PORTD = 0xFF;
    0101 BB82      OUT	0x12,R24
(0027) 	DDRE = 0x00;
    0102 B822      OUT	0x02,R2
(0028) 	PORTE = 0xFF;
    0103 B983      OUT	0x03,R24
(0029) 	DDRF = 0x00;
    0104 92200061  STS	0x61,R2
(0030) 	PORTF = 0xFF;
    0106 93800062  STS	0x62,R24
(0031) 	DDRG = 0x00;
    0108 92200064  STS	0x64,R2
(0032) 	PORTG = 0xFF;
    010A 93800065  STS	0x65,R24
    010C 9508      RET
_main:
  i                    --> R20
  p                    --> R22
    010D 9722      SBIW	R28,2
(0033) }
(0034) 
(0035) void main(void) {
(0036) 
(0037) 	unsigned char i;
(0038) 	unsigned char *p;
(0039) 
(0040) 	io_init();								/*初始化IO口*/
    010E DFE9      RCALL	_io_init
(0041) 	delay_ms(100);
    010F E604      LDI	R16,0x64
    0110 940E007E  CALL	_delay_ms
(0042) 	LCD_init();								/*显示初始化*/
    0112 940E00DC  CALL	_LCD_init
    0114 C025      RJMP	0x013A
(0043) 
(0044) 	while (1) {
(0045) 		i = 1;
    0115 E041      LDI	R20,1
(0046) 		p = "www.iccavr.com";				/*定义字符串指针*/
    0116 E068      LDI	R22,0x8
    0117 E071      LDI	R23,1
(0047) 		LCD_clear();						/*清除显示屏内容*/
    0118 940E00A9  CALL	_LCD_clear
(0048) 		LCD_write_str(5,0,"Welcome");		/*在指定位置显示欢迎信息*/
    011A E080      LDI	R24,0
    011B E091      LDI	R25,1
    011C 8399      STD	Y+1,R25
    011D 8388      STD	Y+0,R24
    011E 2722      CLR	R18
    011F E005      LDI	R16,5
    0120 940E00AE  CALL	_LCD_write_str
(0049) 		delay_ms(250);
    0122 EF0A      LDI	R16,0xFA
    0123 940E007E  CALL	_delay_ms
    0125 C00D      RJMP	0x0133
(0050) 		
(0051) 		while (*p) {
(0052) 			LCD_write_char(i,1,*p);			/*按位显示网址信息*/
    0126 01FB      MOVW	R30,R22
    0127 8020      LDD	R2,Z+0
    0128 8228      STD	Y+0,R2
    0129 E021      LDI	R18,1
    012A 2F04      MOV	R16,R20
    012B 940E00CA  CALL	_LCD_write_char
(0053) 			i ++;
    012D 9543      INC	R20
(0054) 			p ++;
    012E 5F6F      SUBI	R22,0xFF
    012F 4F7F      SBCI	R23,0xFF
(0055) 			delay_ms(250);
    0130 EF0A      LDI	R16,0xFA
    0131 940E007E  CALL	_delay_ms
    0133 01FB      MOVW	R30,R22
    0134 8020      LDD	R2,Z+0
    0135 2022      TST	R2
    0136 F779      BNE	0x0126
(0056) 			}
(0057) 		delay_ms(250);
FILE: <library>
    0137 EF0A      LDI	R16,0xFA
    0138 940E007E  CALL	_delay_ms
    013A CFDA      RJMP	0x0115
    013B 9622      ADIW	R28,2
    013C 9508      RET
pop_gset2:
    013D E0E2      LDI	R30,2
    013E 940C014F  JMP	pop
pop_gset3:
    0140 E0E4      LDI	R30,4
    0141 940C014F  JMP	pop
push_gset5:
    0143 92FA      ST	R15,-Y
    0144 92EA      ST	R14,-Y
push_gset4:
    0145 92DA      ST	R13,-Y
    0146 92CA      ST	R12,-Y
push_gset3:
    0147 92BA      ST	R11,-Y
    0148 92AA      ST	R10,-Y
push_gset2:
    0149 937A      ST	R23,-Y
    014A 936A      ST	R22,-Y
push_gset1:
    014B 935A      ST	R21,-Y
    014C 934A      ST	R20,-Y
    014D 9508      RET
pop_gset1:
    014E E0E1      LDI	R30,1
pop:
    014F 9149      LD	R20,Y+
    0150 9159      LD	R21,Y+
    0151 FDE0      SBRC	R30,0
    0152 9508      RET
    0153 9169      LD	R22,Y+
    0154 9179      LD	R23,Y+
    0155 FDE1      SBRC	R30,1
    0156 9508      RET
    0157 90A9      LD	R10,Y+
    0158 90B9      LD	R11,Y+
    0159 FDE2      SBRC	R30,2
    015A 9508      RET
    015B 90C9      LD	R12,Y+
    015C 90D9      LD	R13,Y+
    015D FDE3      SBRC	R30,3
    015E 9508      RET
    015F 90E9      LD	R14,Y+
    0160 90F9      LD	R15,Y+
    0161 9508      RET

⌨️ 快捷键说明

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