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

📄 ac15-3.lst

📁 AVR学习资料
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0033 E5CF      LDI	R28,0x5F
    0034 E0D4      LDI	R29,4
    0035 BFCD      OUT	0x3D,R28
    0036 BFDE      OUT	0x3E,R29
    0037 51C0      SUBI	R28,0x10
    0038 40D0      SBCI	R29,0
    0039 EA0A      LDI	R16,0xAA
    003A 8308      STD	Y+0,R16
    003B 2400      CLR	R0
    003C E6E0      LDI	R30,0x60
    003D E0F0      LDI	R31,0
    003E E010      LDI	R17,0
    003F 36E0      CPI	R30,0x60
    0040 07F1      CPC	R31,R17
    0041 F011      BEQ	0x0044
    0042 9201      ST	R0,Z+
    0043 CFFB      RJMP	0x003F
    0044 8300      STD	Z+0,R16
    0045 E6E5      LDI	R30,0x65
    0046 E0F0      LDI	R31,0
    0047 E6A0      LDI	R26,0x60
    0048 E0B0      LDI	R27,0
    0049 E010      LDI	R17,0
    004A 36E5      CPI	R30,0x65
    004B 07F1      CPC	R31,R17
    004C F021      BEQ	0x0051
    004D 95C8      LPM
    004E 9631      ADIW	R30,1
    004F 920D      ST	R0,X+
    0050 CFF9      RJMP	0x004A
    0051 940E0193  CALL	_main
_exit:
    0053 CFFF      RJMP	_exit
_ePutstr:
  l                    --> R20
  i                    --> R22
  ptr                  --> R10
  y                    --> R12
  x                    --> R14
    0054 940E0294  CALL	push_gset5
    0056 2EC2      MOV	R12,R18
    0057 2EE0      MOV	R14,R16
    0058 9721      SBIW	R28,1
    0059 84AB      LDD	R10,Y+11
    005A 84BC      LDD	R11,Y+12
FILE: d:\MYDOCU~1\ac15-3\ac15-3.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 rd_device_add 0xa1
(0015) #define wr_device_add 0xa0
(0016) 
(0017) //======================================
(0018) //TWI状态定义
(0019) //MT 主方式传输  MR 主方式接收
(0020) #define START 0x08 
(0021) #define RE_START 0x10
(0022) #define MT_SLA_ACK 0x18
(0023) #define MT_SLA_NOACK 0x20
(0024) #define MT_DATA_ACK  0x28
(0025) #define MT_DATA_NOACK 0x30
(0026) #define MR_SLA_ACK  0x40
(0027) #define MR_SLA_NOACK 0x48
(0028) #define MR_DATA_ACK 0x50
(0029) #define MR_DATA_NOACK 0x58
(0030) 
(0031) //常用TWI操作(主模式写和主模式读)
(0032) #define Start()    	  (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
(0033) #define Stop()     	  (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
(0034) #define Wait()	   	  {while(!(TWCR&(1<<TWINT)));}
(0035) #define TestAck() 	  (TWSR&0xf8)
(0036) #define SetAck()	  (TWCR|=(1<<TWEA))
(0037) #define SetNoAck()    (TWCR&=~(1<<TWEA))
(0038) #define Twi()	  	  (TWCR=(1<<TWINT)|(1<<TWEN))
(0039) #define Write8Bit(x)  {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} 
(0040) 
(0041) #define DataPort PORTA		
(0042) #define Busy 0x80			
(0043) #define xtal 8   			
(0044) 
(0045) //=====================================
(0046) const uchar str0[]={"Write : "};//待显字符串
(0047) const uchar str1[]={"Read : "};//待显字符串
(0048) 
(0049) //========函数声明=========
(0050) void WaitForEnable(void);
(0051) void LcdWriteData(uchar W);
(0052) void LcdWriteCommand(uchar CMD,uchar Attribc);
(0053) void InitLcd(void);
(0054) void Display(uchar dd);
(0055) void DisplayOneChar(uchar x,uchar y,uchar Wdata);
(0056) void ePutstr(uchar x,uchar y,uchar const *ptr);
(0057) void port_init(void);
(0058) void delay_ms(unsigned int time);
(0059) void delay_us(int time);
(0060) 
(0061) //**********************显示指定座标的一串字符子函数**************
(0062) void ePutstr(uchar x,uchar y,uchar const *ptr)
(0063) {
(0064) uchar i,l=0;
    005B 2744      CLR	R20
    005C C001      RJMP	0x005E
(0065) 	while(ptr[l]>31){l++;}
    005D 9543      INC	R20
    005E 2FE4      MOV	R30,R20
    005F 27FF      CLR	R31
    0060 0DEA      ADD	R30,R10
    0061 1DFB      ADC	R31,R11
    0062 91E4      LPM	R30,0(Z)
    0063 E18F      LDI	R24,0x1F
    0064 178E      CP	R24,R30
    0065 F3B8      BCS	0x005D
(0066) 	for(i=0;i<l;i++){
    0066 2766      CLR	R22
    0067 C014      RJMP	0x007C
(0067) 	DisplayOneChar(x++,y,ptr[i]);
    0068 2FE6      MOV	R30,R22
    0069 27FF      CLR	R31
    006A 0DEA      ADD	R30,R10
    006B 1DFB      ADC	R31,R11
    006C 91E4      LPM	R30,0(Z)
    006D 83E8      STD	Y+0,R30
    006E 2D2C      MOV	R18,R12
    006F 2C2E      MOV	R2,R14
    0070 2D82      MOV	R24,R2
    0071 5F8F      SUBI	R24,0xFF
    0072 2EE8      MOV	R14,R24
    0073 2D02      MOV	R16,R2
    0074 D01E      RCALL	_DisplayOneChar
(0068) 	if(x==16){
    0075 2D8E      MOV	R24,R14
    0076 3180      CPI	R24,0x10
    0077 F419      BNE	0x007B
(0069) 		x=0;y^=1;
    0078 24EE      CLR	R14
    0079 E081      LDI	R24,1
    007A 26C8      EOR	R12,R24
    007B 9563      INC	R22
    007C 1764      CP	R22,R20
    007D F350      BCS	0x0068
    007E 9621      ADIW	R28,1
    007F 940E0291  CALL	pop_gset5
    0081 9508      RET
_LocateXY:
  temp                 --> R20
  posy                 --> R22
  posx                 --> R10
    0082 940E0298  CALL	push_gset3
    0084 2F62      MOV	R22,R18
    0085 2EA0      MOV	R10,R16
(0070) 	}
(0071)   }
(0072) }
(0073) 
(0074) //*******************显示光标定位子函数******************
(0075) void LocateXY(char posx,char posy)
(0076) {
(0077) uchar temp;
(0078) 	temp&=0x7f;
    0086 774F      ANDI	R20,0x7F
(0079) 	temp=posx&0x0f;
    0087 2D4A      MOV	R20,R10
    0088 704F      ANDI	R20,0xF
(0080) 	posy&=0x01;
    0089 7061      ANDI	R22,1
(0081) 	if(posy)temp|=0x40;
    008A F009      BEQ	0x008C
    008B 6440      ORI	R20,0x40
(0082) 	temp|=0x80;
    008C 6840      ORI	R20,0x80
(0083) 	LcdWriteCommand(temp,0);
    008D 2722      CLR	R18
    008E 2F04      MOV	R16,R20
    008F D031      RCALL	_LcdWriteCommand
    0090 940E028E  CALL	pop_gset3
    0092 9508      RET
_DisplayOneChar:
  Wdata                --> Y+4
  y                    --> R22
  x                    --> R20
    0093 940E029A  CALL	push_gset2
    0095 2F62      MOV	R22,R18
    0096 2F40      MOV	R20,R16
(0084) }
(0085) 
(0086) //*******************显示指定座标的一个字符子函数*******************
(0087) void DisplayOneChar(uchar x,uchar y,uchar Wdata)
(0088) {
(0089) LocateXY(x,y);
    0097 2F26      MOV	R18,R22
    0098 2F04      MOV	R16,R20
    0099 DFE8      RCALL	_LocateXY
(0090) LcdWriteData(Wdata);
    009A 810C      LDD	R16,Y+4
    009B D038      RCALL	_LcdWriteData
    009C 940E028B  CALL	pop_gset2
    009E 9508      RET
(0091) }
(0092) 
(0093) //*******************LCD初始化子函数*********************
(0094) void InitLcd(void) 
(0095) {
(0096) LcdWriteCommand(0x38,0); 
_InitLcd:
    009F 2722      CLR	R18
    00A0 E308      LDI	R16,0x38
    00A1 D01F      RCALL	_LcdWriteCommand
(0097) delay_ms(5);
    00A2 E005      LDI	R16,5
    00A3 E010      LDI	R17,0
    00A4 D1B7      RCALL	_delay_ms
(0098) LcdWriteCommand(0x38,0); 
    00A5 2722      CLR	R18
    00A6 E308      LDI	R16,0x38
    00A7 D019      RCALL	_LcdWriteCommand
(0099) delay_ms(5);
    00A8 E005      LDI	R16,5
    00A9 E010      LDI	R17,0
    00AA D1B1      RCALL	_delay_ms
(0100) LcdWriteCommand(0x38,0); 
    00AB 2722      CLR	R18
    00AC E308      LDI	R16,0x38
    00AD D013      RCALL	_LcdWriteCommand
(0101) delay_ms(5);
    00AE E005      LDI	R16,5
    00AF E010      LDI	R17,0
    00B0 D1AB      RCALL	_delay_ms
(0102) LcdWriteCommand(0x38,1); 
    00B1 E021      LDI	R18,1
    00B2 E308      LDI	R16,0x38
    00B3 D00D      RCALL	_LcdWriteCommand
(0103) LcdWriteCommand(0x08,1); 
    00B4 E021      LDI	R18,1
    00B5 E008      LDI	R16,0x8
    00B6 D00A      RCALL	_LcdWriteCommand
(0104) LcdWriteCommand(0x01,1); 
    00B7 E021      LDI	R18,1
    00B8 E001      LDI	R16,1
    00B9 D007      RCALL	_LcdWriteCommand
(0105) LcdWriteCommand(0x06,1); 
    00BA E021      LDI	R18,1
    00BB E006      LDI	R16,6
    00BC D004      RCALL	_LcdWriteCommand
(0106) LcdWriteCommand(0x0c,1); 
    00BD E021      LDI	R18,1
    00BE E00C      LDI	R16,0xC
    00BF D001      RCALL	_LcdWriteCommand
    00C0 9508      RET
_LcdWriteCommand:
  Attribc              --> R22
  CMD                  --> R20
    00C1 940E029A  CALL	push_gset2
    00C3 2F62      MOV	R22,R18
    00C4 2F40      MOV	R20,R16
(0107) }
(0108) 
(0109) //********************写命令到LCM子函数********************
(0110) void LcdWriteCommand(uchar CMD,uchar Attribc)
(0111) {
(0112) if(Attribc)WaitForEnable();
    00C5 2366      TST	R22
    00C6 F009      BEQ	0x00C8
    00C7 D01C      RCALL	_WaitForEnable
(0113) LCM_RS_0;LCM_RW_0;_NOP();
    00C8 98C0      CBI	0x18,0
    00C9 98C1      CBI	0x18,1
    00CA 0000      NOP
(0114) DataPort=CMD;_NOP();
    00CB BB4B      OUT	0x1B,R20
    00CC 0000      NOP
(0115) LCM_EN_1;_NOP();_NOP();LCM_EN_0;
    00CD 9AC2      SBI	0x18,2
    00CE 0000      NOP
    00CF 0000      NOP
    00D0 98C2      CBI	0x18,2
    00D1 940E028B  CALL	pop_gset2
    00D3 9508      RET
_LcdWriteData:
  dataW                --> R20
    00D4 940E029C  CALL	push_gset1
    00D6 2F40      MOV	R20,R16
(0116) }
(0117) 
(0118) //*******************写数据到LCM子函数********************
(0119) void LcdWriteData(uchar dataW)
(0120) {
(0121) WaitForEnable();
    00D7 D00C      RCALL	_WaitForEnable
(0122) LCM_RS_1;LCM_RW_0;_NOP();
    00D8 9AC0      SBI	0x18,0
    00D9 98C1      CBI	0x18,1
    00DA 0000      NOP
(0123) DataPort=dataW;_NOP();
    00DB BB4B      OUT	0x1B,R20
    00DC 0000      NOP
(0124) LCM_EN_1;_NOP();_NOP();LCM_EN_0;
    00DD 9AC2      SBI	0x18,2
    00DE 0000      NOP
    00DF 0000      NOP
    00E0 98C2      CBI	0x18,2
    00E1 940E029F  CALL	pop_gset1
    00E3 9508      RET
(0125) }
(0126) 
(0127) //*******************检测LCD忙信号子函数*********************
(0128) void WaitForEnable(void)
(0129) {
(0130) uchar val;
(0131) DataPort=0xff;
_WaitForEnable:
  val                  --> R16
    00E4 EF8F      LDI	R24,0xFF
    00E5 BB8B      OUT	0x1B,R24
(0132) LCM_RS_0;LCM_RW_1;_NOP();
    00E6 98C0      CBI	0x18,0
    00E7 9AC1      SBI	0x18,1
    00E8 0000      NOP
(0133) LCM_EN_1;_NOP();_NOP();
    00E9 9AC2      SBI	0x18,2
    00EA 0000      NOP
    00EB 0000      NOP
(0134) DDRA=0x00;
    00EC 2422      CLR	R2
    00ED BA2A      OUT	0x1A,R2
(0135) val=PINA;
    00EE B309      IN	R16,0x19
    00EF C001      RJMP	0x00F1
(0136) while(val&Busy)val=PINA;
    00F0 B309      IN	R16,0x19
    00F1 FD07      SBRC	R16,7
    00F2 CFFD      RJMP	0x00F0
(0137) LCM_EN_0;
    00F3 98C2      CBI	0x18,2
(0138) DDRA=0xff;
    00F4 EF8F      LDI	R24,0xFF
    00F5 BB8A      OUT	0x1A,R24
    00F6 9508      RET
(0139) }
(0140) 
(0141) /********************端口初始化******************/
(0142) void port_init(void)
(0143) {
(0144)  PORTA = 0x00;
_port_init:
    00F7 2422      CLR	R2
    00F8 BA2B      OUT	0x1B,R2
(0145)  DDRA  = 0xFF;
    00F9 EF8F      LDI	R24,0xFF
    00FA BB8A      OUT	0x1A,R24
(0146)  PORTB = 0x00;
    00FB BA28      OUT	0x18,R2
(0147)  DDRB  = 0xFF;
    00FC BB87      OUT	0x17,R24
(0148)  PORTC = 0x00; 
    00FD BA25      OUT	0x15,R2
(0149)  DDRC  = 0x03;
    00FE E083      LDI	R24,3
    00FF BB84      OUT	0x14,R24
(0150)  PORTD = 0xFF;
    0100 EF8F      LDI	R24,0xFF
    0101 BB82      OUT	0x12,R24
(0151)  DDRD  = 0x00;
    0102 BA21      OUT	0x11,R2
    0103 9508      RET
(0152) }
(0153) 
(0154) /*******************扫描按键******************/
(0155) uchar scan_key(void)		
(0156) {					
(0157) uchar temp;			
(0158) temp=PIND;				
_scan_key:
  temp                 --> R16
    0104 B300      IN	R16,0x10
(0159) return temp;			
    0105 9508      RET
_i2c_Read:
  temp                 --> R20
  RomAddress           --> R16
    0106 940E029C  CALL	push_gset1
(0160) }					
(0161) 
(0162) /******************************************
(0163)                I2C总线读一个字节
(0164) 			   如果读失败返回0
(0165) *******************************************/
(0166) unsigned char i2c_Read(unsigned char RomAddress) 
(0167)       {
(0168) 	   unsigned char temp;
(0169) 	   Start();
    0108 EA84      LDI	R24,0xA4
    0109 BF86      OUT	0x36,R24
(0170) 	   Wait();
    010A B626      IN	R2,0x36
    010B FE27      SBRS	R2,7
    010C CFFD      RJMP	0x010A
(0171) 	   if (TestAck()!=START) return 0;	   
    010D B181      IN	R24,0x01
    010E 7F88      ANDI	R24,0xF8
    010F 3088      CPI	R24,0x8
    0110 F011      BEQ	0x0113
    0111 2700      CLR	R16
    0112 C040      RJMP	0x0153
(0172) 	   Write8Bit(wr_device_add);
    0113 EA80      LDI	R24,0xA0
    0114 B983      OUT	0x03,R24
    0115 E884      LDI	R24,0x84
    0116 BF86      OUT	0x36,R24
(0173) 	   Wait(); 
    0117 B626      IN	R2,0x36
    0118 FE27      SBRS	R2,7
    0119 CFFD      RJMP	0x0117
(0174) 	   if (TestAck()!=MT_SLA_ACK) return 0;
    011A B181      IN	R24,0x01
    011B 7F88      ANDI	R24,0xF8
    011C 3188      CPI	R24,0x18
    011D F011      BEQ	0x0120
    011E 2700      CLR	R16
    011F C033      RJMP	0x0153
(0175) 	   Write8Bit(RomAddress);
    0120 B903      OUT	0x03,R16
    0121 E884      LDI	R24,0x84
    0122 BF86      OUT	0x36,R24
(0176) 	   Wait();
    0123 B626      IN	R2,0x36
    0124 FE27      SBRS	R2,7
    0125 CFFD      RJMP	0x0123
(0177) 	   if (TestAck()!=MT_DATA_ACK) return 0;
    0126 B181      IN	R24,0x01
    0127 7F88      ANDI	R24,0xF8
    0128 3288      CPI	R24,0x28
    0129 F011      BEQ	0x012C
    012A 2700      CLR	R16
    012B C027      RJMP	0x0153
(0178) 	   Start();
    012C EA84      LDI	R24,0xA4
    012D BF86      OUT	0x36,R24
(0179) 	   Wait();
    012E B626      IN	R2,0x36
    012F FE27      SBRS	R2,7
    0130 CFFD      RJMP	0x012E
(0180) 	   if (TestAck()!=RE_START)  return 0;
    0131 B181      IN	R24,0x01
    0132 7F88      ANDI	R24,0xF8
    0133 3180      CPI	R24,0x10
    0134 F011      BEQ	0x0137
    0135 2700      CLR	R16
    0136 C01C      RJMP	0x0153
(0181) 	   Write8Bit(rd_device_add);
    0137 EA81      LDI	R24,0xA1
    0138 B983      OUT	0x03,R24
    0139 E884      LDI	R24,0x84
    013A BF86      OUT	0x36,R24
(0182) 	   Wait();
    013B B626      IN	R2,0x36
    013C FE27      SBRS	R2,7
    013D CFFD      RJMP	0x013B
(0183) 	   if(TestAck()!=MR_SLA_ACK)  return 0;
    013E B181      IN	R24,0x01
    013F 7F88      ANDI	R24,0xF8
    0140 3480      CPI	R24,0x40
    0141 F011      BEQ	0x0144
    0142 2700      CLR	R16
    0143 C00F      RJMP	0x0153

⌨️ 快捷键说明

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