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

📄 ac14-1.lst

📁 AVR学习资料
💻 LST
字号:
__start:
__text_start:
    003B E5CF      LDI	R28,0x5F
    003C E0D4      LDI	R29,4
    003D BFCD      OUT	0x3D,R28
    003E BFDE      OUT	0x3E,R29
    003F 51C0      SUBI	R28,0x10
    0040 40D0      SBCI	R29,0
    0041 EA0A      LDI	R16,0xAA
    0042 8308      STD	Y+0,R16
    0043 2400      CLR	R0
    0044 E6E0      LDI	R30,0x60
    0045 E0F0      LDI	R31,0
    0046 E010      LDI	R17,0
    0047 36E0      CPI	R30,0x60
    0048 07F1      CPC	R31,R17
    0049 F011      BEQ	0x004C
    004A 9201      ST	R0,Z+
    004B CFFB      RJMP	0x0047
    004C 8300      STD	Z+0,R16
    004D E7E6      LDI	R30,0x76
    004E E0F0      LDI	R31,0
    004F E6A0      LDI	R26,0x60
    0050 E0B0      LDI	R27,0
    0051 E010      LDI	R17,0
    0052 37E6      CPI	R30,0x76
    0053 07F1      CPC	R31,R17
    0054 F021      BEQ	0x0059
    0055 95C8      LPM
    0056 9631      ADIW	R30,1
    0057 920D      ST	R0,X+
    0058 CFF9      RJMP	0x0052
    0059 940E005C  CALL	_main
_exit:
    005B CFFF      RJMP	_exit
_main:
    005C 9722      SBIW	R28,2
FILE: d:\MYDOCU~1\ac14-1\ac14-1.c
(0001) #include <iom16v.h>		
(0002) #include <macros.h>
(0003) //-----------------------------------------------
(0004) #define uchar unsigned char	
(0005) #define uint unsigned int
(0006) //-------------------引脚电平的宏定义---------
(0007) #define LCM_RS_1 PORTB|=BIT(PB0)	  
(0008) #define LCM_RS_0 PORTB&=~BIT(PB0) 
(0009) #define LCM_RW_1 PORTB|=BIT(PB1)
(0010) #define LCM_RW_0 PORTB&=~BIT(PB1) 
(0011) #define LCM_EN_1 PORTB|=BIT(PB2)	  
(0012) #define LCM_EN_0 PORTB&=~BIT(PB2)  
(0013) //======================================
(0014) #define DataPort PORTA		
(0015) #define Busy 0x80		
(0016) #define xtal 8   		
(0017) //======================================
(0018) const uchar str0[]={"-This is a LCD-!"};
(0019) const uchar str1[]={"-Design by ZXH-!"};
(0020) //========函数声明=========
(0021) void Delay_1ms(void);
(0022) void Delay_nms(uint n);
(0023) void WaitForEnable(void);
(0024) void LcdWriteData(uchar W);
(0025) void LcdWriteCommand(uchar CMD,uchar Attribc);
(0026) void InitLcd(void);
(0027) void Display(uchar dd);
(0028) void DisplayOneChar(uchar x,uchar y,uchar Wdata);
(0029) void ePutstr(uchar x,uchar y,uchar const *ptr);
(0030) //******************************************
(0031) void main(void)				
(0032) {
(0033)     Delay_nms(400);			
    005D E900      LDI	R16,0x90
    005E E011      LDI	R17,1
    005F D0E2      RCALL	_Delay_nms
(0034) 	DDRA=0xff;PORTA=0x00;	
    0060 EF8F      LDI	R24,0xFF
    0061 BB8A      OUT	0x1A,R24
    0062 2422      CLR	R2
    0063 BA2B      OUT	0x1B,R2
(0035) 	DDRB=0xff;PORTB=0x00;
    0064 BB87      OUT	0x17,R24
    0065 BA28      OUT	0x18,R2
(0036) 	InitLcd();				
    0066 D079      RCALL	_InitLcd
    0067 C02A      RJMP	0x0092
(0037) 	/********************************************/
(0038) 		while(1)              
(0039) 		{
(0040) 		   LcdWriteCommand(0x01,1); 
    0068 E021      LDI	R18,1
    0069 E001      LDI	R16,1
    006A D097      RCALL	_LcdWriteCommand
(0041) 		   LcdWriteCommand(0x0c,1);	  
    006B E021      LDI	R18,1
    006C E00C      LDI	R16,0xC
    006D D094      RCALL	_LcdWriteCommand
(0042) 		   DisplayOneChar(0,1,0x41); 
    006E E481      LDI	R24,0x41
    006F 8388      STD	Y+0,R24
    0070 E021      LDI	R18,1
    0071 2700      CLR	R16
    0072 D061      RCALL	_DisplayOneChar
(0043) 		   ePutstr(0,0,str0); 
    0073 E584      LDI	R24,0x54
    0074 E090      LDI	R25,0
    0075 8399      STD	Y+1,R25
    0076 8388      STD	Y+0,R24
    0077 2722      CLR	R18
    0078 2700      CLR	R16
    0079 D01B      RCALL	_ePutstr
(0044) 		   Delay_nms(2000);	
    007A ED00      LDI	R16,0xD0
    007B E017      LDI	R17,7
    007C D0C5      RCALL	_Delay_nms
(0045) 		   LcdWriteCommand(0x01,1);  
    007D E021      LDI	R18,1
    007E E001      LDI	R16,1
    007F D082      RCALL	_LcdWriteCommand
(0046) 		   LcdWriteCommand(0x0c,1);  
    0080 E021      LDI	R18,1
    0081 E00C      LDI	R16,0xC
    0082 D07F      RCALL	_LcdWriteCommand
(0047) 		   DisplayOneChar(8,0,0x42);	
    0083 E482      LDI	R24,0x42
    0084 8388      STD	Y+0,R24
    0085 2722      CLR	R18
    0086 E008      LDI	R16,0x8
    0087 D04C      RCALL	_DisplayOneChar
(0048) 		   ePutstr(0,1,str1);  
    0088 E685      LDI	R24,0x65
    0089 E090      LDI	R25,0
    008A 8399      STD	Y+1,R25
    008B 8388      STD	Y+0,R24
    008C E021      LDI	R18,1
    008D 2700      CLR	R16
    008E D006      RCALL	_ePutstr
(0049) 		   Delay_nms(2000); 
    008F ED00      LDI	R16,0xD0
    0090 E017      LDI	R17,7
    0091 D0B0      RCALL	_Delay_nms
    0092 CFD5      RJMP	0x0068
    0093 9622      ADIW	R28,2
    0094 9508      RET
_ePutstr:
  l                    --> R20
  i                    --> R22
  ptr                  --> R10
  y                    --> R12
  x                    --> R14
    0095 940E015A  CALL	push_gset5
    0097 2EC2      MOV	R12,R18
    0098 2EE0      MOV	R14,R16
    0099 9721      SBIW	R28,1
    009A 84AB      LDD	R10,Y+11
    009B 84BC      LDD	R11,Y+12
(0050) 	   }
(0051) }		   
(0052) //**********************显示指定座标的一串字符子函数**************
(0053) void ePutstr(uchar x,uchar y,uchar const *ptr)
(0054) {
(0055) uchar i,l=0;
    009C 2744      CLR	R20
    009D C001      RJMP	0x009F
(0056) 	while(ptr[l]>31){l++;}
    009E 9543      INC	R20
    009F 2FE4      MOV	R30,R20
    00A0 27FF      CLR	R31
    00A1 0DEA      ADD	R30,R10
    00A2 1DFB      ADC	R31,R11
    00A3 91E4      LPM	R30,0(Z)
    00A4 E18F      LDI	R24,0x1F
    00A5 178E      CP	R24,R30
    00A6 F3B8      BCS	0x009E
(0057) 	for(i=0;i<l;i++){
    00A7 2766      CLR	R22
    00A8 C014      RJMP	0x00BD
(0058) 	DisplayOneChar(x++,y,ptr[i]);
    00A9 2FE6      MOV	R30,R22
    00AA 27FF      CLR	R31
    00AB 0DEA      ADD	R30,R10
    00AC 1DFB      ADC	R31,R11
    00AD 91E4      LPM	R30,0(Z)
    00AE 83E8      STD	Y+0,R30
    00AF 2D2C      MOV	R18,R12
    00B0 2C2E      MOV	R2,R14
    00B1 2D82      MOV	R24,R2
    00B2 5F8F      SUBI	R24,0xFF
    00B3 2EE8      MOV	R14,R24
    00B4 2D02      MOV	R16,R2
    00B5 D01E      RCALL	_DisplayOneChar
(0059) 	if(x==16){
    00B6 2D8E      MOV	R24,R14
    00B7 3180      CPI	R24,0x10
    00B8 F419      BNE	0x00BC
(0060) 		x=0;y^=1;
    00B9 24EE      CLR	R14
    00BA E081      LDI	R24,1
    00BB 26C8      EOR	R12,R24
    00BC 9563      INC	R22
    00BD 1764      CP	R22,R20
    00BE F350      BCS	0x00A9
    00BF 9621      ADIW	R28,1
    00C0 940E0157  CALL	pop_gset5
    00C2 9508      RET
_LocateXY:
  temp                 --> R20
  posy                 --> R22
  posx                 --> R10
    00C3 940E015E  CALL	push_gset3
    00C5 2F62      MOV	R22,R18
    00C6 2EA0      MOV	R10,R16
(0061) 	}
(0062)   }
(0063) }
(0064) //*******************显示光标定位子函数******************
(0065) void LocateXY(char posx,char posy)
(0066) {
(0067) uchar temp;
(0068) 	temp&=0x7f;
    00C7 774F      ANDI	R20,0x7F
(0069) 	temp=posx&0x0f;
    00C8 2D4A      MOV	R20,R10
    00C9 704F      ANDI	R20,0xF
(0070) 	posy&=0x01;
    00CA 7061      ANDI	R22,1
(0071) 	if(posy)temp|=0x40;
    00CB F009      BEQ	0x00CD
    00CC 6440      ORI	R20,0x40
(0072) 	temp|=0x80;
    00CD 6840      ORI	R20,0x80
(0073) 	LcdWriteCommand(temp,0);
    00CE 2722      CLR	R18
    00CF 2F04      MOV	R16,R20
    00D0 D031      RCALL	_LcdWriteCommand
    00D1 940E0154  CALL	pop_gset3
    00D3 9508      RET
_DisplayOneChar:
  Wdata                --> Y+4
  y                    --> R22
  x                    --> R20
    00D4 940E0160  CALL	push_gset2
    00D6 2F62      MOV	R22,R18
    00D7 2F40      MOV	R20,R16
(0074) }
(0075) //*******************显示指定座标的一个字符子函数*******************
(0076) void DisplayOneChar(uchar x,uchar y,uchar Wdata)
(0077) {
(0078) LocateXY(x,y);
    00D8 2F26      MOV	R18,R22
    00D9 2F04      MOV	R16,R20
    00DA DFE8      RCALL	_LocateXY
(0079) LcdWriteData(Wdata);
    00DB 810C      LDD	R16,Y+4
    00DC D038      RCALL	_LcdWriteData
    00DD 940E0151  CALL	pop_gset2
    00DF 9508      RET
(0080) }
(0081) //*******************LCD初始化子函数*********************
(0082) void InitLcd(void) 
(0083) {
(0084) LcdWriteCommand(0x38,0); 
_InitLcd:
    00E0 2722      CLR	R18
    00E1 E308      LDI	R16,0x38
    00E2 D01F      RCALL	_LcdWriteCommand
(0085) Delay_nms(5);
    00E3 E005      LDI	R16,5
    00E4 E010      LDI	R17,0
    00E5 D05C      RCALL	_Delay_nms
(0086) LcdWriteCommand(0x38,0); 
    00E6 2722      CLR	R18
    00E7 E308      LDI	R16,0x38
    00E8 D019      RCALL	_LcdWriteCommand
(0087) Delay_nms(5);
    00E9 E005      LDI	R16,5
    00EA E010      LDI	R17,0
    00EB D056      RCALL	_Delay_nms
(0088) LcdWriteCommand(0x38,0); 
    00EC 2722      CLR	R18
    00ED E308      LDI	R16,0x38
    00EE D013      RCALL	_LcdWriteCommand
(0089) Delay_nms(5);
    00EF E005      LDI	R16,5
    00F0 E010      LDI	R17,0
    00F1 D050      RCALL	_Delay_nms
(0090) LcdWriteCommand(0x38,1); 
    00F2 E021      LDI	R18,1
    00F3 E308      LDI	R16,0x38
    00F4 D00D      RCALL	_LcdWriteCommand
(0091) LcdWriteCommand(0x08,1); 
    00F5 E021      LDI	R18,1
    00F6 E008      LDI	R16,0x8
    00F7 D00A      RCALL	_LcdWriteCommand
(0092) LcdWriteCommand(0x01,1);
    00F8 E021      LDI	R18,1
    00F9 E001      LDI	R16,1
    00FA D007      RCALL	_LcdWriteCommand
(0093) LcdWriteCommand(0x06,1); 
    00FB E021      LDI	R18,1
    00FC E006      LDI	R16,6
    00FD D004      RCALL	_LcdWriteCommand
(0094) LcdWriteCommand(0x0c,1); 
    00FE E021      LDI	R18,1
    00FF E00C      LDI	R16,0xC
    0100 D001      RCALL	_LcdWriteCommand
    0101 9508      RET
_LcdWriteCommand:
  Attribc              --> R22
  CMD                  --> R20
    0102 940E0160  CALL	push_gset2
    0104 2F62      MOV	R22,R18
    0105 2F40      MOV	R20,R16
(0095) }
(0096) //********************写命令到LCM子函数********************
(0097) void LcdWriteCommand(uchar CMD,uchar Attribc)
(0098) {
(0099) if(Attribc)WaitForEnable();
    0106 2366      TST	R22
    0107 F009      BEQ	0x0109
    0108 D01C      RCALL	_WaitForEnable
(0100) LCM_RS_0;LCM_RW_0;_NOP();
    0109 98C0      CBI	0x18,0
    010A 98C1      CBI	0x18,1
    010B 0000      NOP
(0101) DataPort=CMD;_NOP();
    010C BB4B      OUT	0x1B,R20
    010D 0000      NOP
(0102) LCM_EN_1;_NOP();_NOP();LCM_EN_0;
    010E 9AC2      SBI	0x18,2
    010F 0000      NOP
    0110 0000      NOP
    0111 98C2      CBI	0x18,2
    0112 940E0151  CALL	pop_gset2
    0114 9508      RET
_LcdWriteData:
  dataW                --> R20
    0115 940E0162  CALL	push_gset1
    0117 2F40      MOV	R20,R16
(0103) }
(0104) //*******************写数据到LCM子函数********************
(0105) void LcdWriteData(uchar dataW)
(0106) {
(0107) WaitForEnable();
    0118 D00C      RCALL	_WaitForEnable
(0108) LCM_RS_1;LCM_RW_0;_NOP();
    0119 9AC0      SBI	0x18,0
    011A 98C1      CBI	0x18,1
    011B 0000      NOP
(0109) DataPort=dataW;_NOP();
    011C BB4B      OUT	0x1B,R20
    011D 0000      NOP
(0110) LCM_EN_1;_NOP();_NOP();LCM_EN_0;
    011E 9AC2      SBI	0x18,2
    011F 0000      NOP
    0120 0000      NOP
    0121 98C2      CBI	0x18,2
    0122 940E0165  CALL	pop_gset1
    0124 9508      RET
(0111) }
(0112) //*******************检测LCD忙信号子函数*********************
(0113) void WaitForEnable(void)
(0114) {
(0115) uchar val;
(0116) DataPort=0xff;
_WaitForEnable:
  val                  --> R16
    0125 EF8F      LDI	R24,0xFF
    0126 BB8B      OUT	0x1B,R24
(0117) LCM_RS_0;LCM_RW_1;_NOP();
    0127 98C0      CBI	0x18,0
    0128 9AC1      SBI	0x18,1
    0129 0000      NOP
(0118) LCM_EN_1;_NOP();_NOP();
    012A 9AC2      SBI	0x18,2
    012B 0000      NOP
    012C 0000      NOP
(0119) DDRA=0x00;
    012D 2422      CLR	R2
    012E BA2A      OUT	0x1A,R2
(0120) val=PINA;
    012F B309      IN	R16,0x19
    0130 C001      RJMP	0x0132
(0121) while(val&Busy)val=PINA;
    0131 B309      IN	R16,0x19
    0132 FD07      SBRC	R16,7
    0133 CFFD      RJMP	0x0131
(0122) LCM_EN_0;
    0134 98C2      CBI	0x18,2
(0123) DDRA=0xff;
    0135 EF8F      LDI	R24,0xFF
    0136 BB8A      OUT	0x1A,R24
    0137 9508      RET
(0124) }
(0125) //****************************************
(0126) void Delay_1ms(void)		//1mS延时子函数
(0127) { uint i;
(0128)  for(i=1;i<(uint)(xtal*143-2);i++)
_Delay_1ms:
  i                    --> R16
    0138 E001      LDI	R16,1
    0139 E010      LDI	R17,0
    013A C002      RJMP	0x013D
    013B 5F0F      SUBI	R16,0xFF
    013C 4F1F      SBCI	R17,0xFF
    013D 3706      CPI	R16,0x76
    013E E0E4      LDI	R30,4
    013F 071E      CPC	R17,R30
    0140 F3D0      BCS	0x013B
    0141 9508      RET
_Delay_nms:
  i                    --> R20
  n                    --> R22
    0142 940E0160  CALL	push_gset2
    0144 01B8      MOVW	R22,R16
(0129)     ;
(0130) }
(0131) //====================================
(0132) void Delay_nms(uint n)		//n*1mS延时子函数
(0133) {
(0134)  uint i=0;
    0145 2744      CLR	R20
    0146 2755      CLR	R21
    0147 C003      RJMP	0x014B
(0135)    while(i<n)
(0136)    {Delay_1ms();
    0148 DFEF      RCALL	_Delay_1ms
(0137)     i++;
FILE: <library>
    0149 5F4F      SUBI	R20,0xFF
    014A 4F5F      SBCI	R21,0xFF
    014B 1746      CP	R20,R22
    014C 0757      CPC	R21,R23
    014D F3D0      BCS	0x0148
    014E 940E0151  CALL	pop_gset2
    0150 9508      RET
pop_gset2:
    0151 E0E2      LDI	R30,2
    0152 940C0166  JMP	pop
pop_gset3:
    0154 E0E4      LDI	R30,4
    0155 940C0166  JMP	pop
pop_gset5:
    0157 27EE      CLR	R30
    0158 940C0166  JMP	pop
push_gset5:
    015A 92FA      ST	R15,-Y
    015B 92EA      ST	R14,-Y
push_gset4:
    015C 92DA      ST	R13,-Y
    015D 92CA      ST	R12,-Y
push_gset3:
    015E 92BA      ST	R11,-Y
    015F 92AA      ST	R10,-Y
push_gset2:
    0160 937A      ST	R23,-Y
    0161 936A      ST	R22,-Y
push_gset1:
    0162 935A      ST	R21,-Y
    0163 934A      ST	R20,-Y
    0164 9508      RET
pop_gset1:
    0165 E0E1      LDI	R30,1
pop:
    0166 9149      LD	R20,Y+
    0167 9159      LD	R21,Y+
    0168 FDE0      SBRC	R30,0
    0169 9508      RET
    016A 9169      LD	R22,Y+
    016B 9179      LD	R23,Y+
    016C FDE1      SBRC	R30,1
    016D 9508      RET
    016E 90A9      LD	R10,Y+
    016F 90B9      LD	R11,Y+
    0170 FDE2      SBRC	R30,2
    0171 9508      RET
    0172 90C9      LD	R12,Y+
    0173 90D9      LD	R13,Y+
    0174 FDE3      SBRC	R30,3
    0175 9508      RET
    0176 90E9      LD	R14,Y+
    0177 90F9      LD	R15,Y+
    0178 9508      RET

⌨️ 快捷键说明

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