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

📄 lesson9.lst

📁 AVR单片机视频教程的课件和每一次课的源程序是学习AVR单片机的首选 第9节
💻 LST
字号:
__text_start:
__start:
    0030 E5CF      LDI	R28,0x5F
    0031 E0D4      LDI	R29,4
    0032 BFCD      OUT	P3D,R28
    0033 BFDE      OUT	P3E,R29
    0034 51C0      SUBI	R28,0x10
    0035 40D0      SBCI	R29,0
    0036 EA0A      LDI	R16,0xAA
    0037 8308      STD	R16,0+Y
    0038 2400      CLR	R0
    0039 E6E0      LDI	R30,0x60
    003A E0F0      LDI	R31,0
    003B E010      LDI	R17,0
    003C 36E0      CPI	R30,0x60
    003D 07F1      CPC	R31,R17
    003E F011      BEQ	0x0041
    003F 9201      ST	R0,Z+
    0040 CFFB      RJMP	0x003C
    0041 8300      STD	R16,0+Z
    0042 E6E0      LDI	R30,0x60
    0043 E0F0      LDI	R31,0
    0044 E6A0      LDI	R26,0x60
    0045 E0B0      LDI	R27,0
    0046 E010      LDI	R17,0
    0047 36E0      CPI	R30,0x60
    0048 07F1      CPC	R31,R17
    0049 F021      BEQ	0x004E
    004A 95C8      LPM
    004B 9631      ADIW	R30,1
    004C 920D      ST	R0,X+
    004D CFF9      RJMP	0x0047
    004E 940E00E5  CALL	_main
_exit:
    0050 CFFF      RJMP	_exit
_delay:
  i                    --> R20
  j                    --> R22
  ms                   --> R16
    0051 D0D7      RCALL	push_gset2
FILE: I:\AVR视频教程\视频教程\lesson9\LESSON9\Skey.c
(0001) void delay(uint ms)
(0002) {
(0003)         uint i,j;
(0004) 	for(i=0;i<ms;i++)
    0052 2744      CLR	R20
    0053 2755      CLR	R21
    0054 C00B      RJMP	0x0060
(0005) 	   {
(0006) 	   for(j=0;j<1141;j++);
    0055 2766      CLR	R22
    0056 2777      CLR	R23
    0057 C002      RJMP	0x005A
    0058 5F6F      SUBI	R22,0xFF
    0059 4F7F      SBCI	R23,0xFF
    005A 3765      CPI	R22,0x75
    005B E0E4      LDI	R30,4
    005C 077E      CPC	R23,R30
    005D F3D0      BCS	0x0058
    005E 5F4F      SUBI	R20,0xFF
    005F 4F5F      SBCI	R21,0xFF
    0060 1740      CP	R20,R16
    0061 0751      CPC	R21,R17
    0062 F390      BCS	0x0055
(0007)        }
(0008) }
    0063 D0C9      RCALL	pop_gset2
    0064 9508      RET
(0009) 
(0010) uchar key_press()
(0011) {
(0012)     uchar j;
(0013)     DDRD|=0X0F;
_key_press:
  j                    --> R16
    0065 B381      IN	R24,P11
    0066 608F      ORI	R24,0xF
    0067 BB81      OUT	P11,R24
(0014) 	PORTD|=0X0F;
    0068 B382      IN	R24,P12
    0069 608F      ORI	R24,0xF
    006A BB82      OUT	P12,R24
(0015) 	
(0016) 	DDRD&=0XF0;
    006B B381      IN	R24,P11
    006C 7F80      ANDI	R24,0xF0
    006D BB81      OUT	P11,R24
(0017) 	
(0018) 	j=PIND;
    006E B300      IN	R16,P10
(0019) 	j=j&0X0F;//00001111
    006F 700F      ANDI	R16,0xF
(0020) 	if(j==0X0F)
    0070 300F      CPI	R16,0xF
    0071 F411      BNE	0x0074
(0021) 	{
(0022) 	  return 0;
    0072 2700      CLR	R16
    0073 C001      RJMP	0x0075
(0023) 	}
(0024) 	else
(0025) 	{
(0026) 	 return 1;
    0074 E001      LDI	R16,1
    0075 9508      RET
_key_scan:
  key                  --> R20
    0076 D0B2      RCALL	push_gset2
(0027) 	}
(0028) 	
(0029) }
(0030) 
(0031) uchar key_scan()
(0032) {
(0033)     uchar key;
(0034)     delay(10);
    0077 E00A      LDI	R16,0xA
    0078 E010      LDI	R17,0
    0079 DFD7      RCALL	_delay
(0035) 	if(key_press())
    007A DFEA      RCALL	_key_press
    007B 2300      TST	R16
    007C F111      BEQ	0x009F
(0036) 	{
(0037) 	key=PIND;
    007D B340      IN	R20,P10
(0038) 	key&=0X0F;
    007E 704F      ANDI	R20,0xF
(0039) 	switch(key)
    007F 2F64      MOV	R22,R20
    0080 2777      CLR	R23
    0081 3067      CPI	R22,7
    0082 E0E0      LDI	R30,0
    0083 077E      CPC	R23,R30
    0084 F099      BEQ	0x0098
    0085 306B      CPI	R22,0xB
    0086 E0E0      LDI	R30,0
    0087 077E      CPC	R23,R30
    0088 F069      BEQ	0x0096
    0089 306D      CPI	R22,0xD
    008A E0E0      LDI	R30,0
    008B 077E      CPC	R23,R30
    008C F039      BEQ	0x0094
    008D 306E      CPI	R22,0xE
    008E E0E0      LDI	R30,0
    008F 077E      CPC	R23,R30
    0090 F009      BEQ	0x0092
    0091 C008      RJMP	0x009A
(0040) 	{
(0041) 	   case 0X0E: 
(0042) 	       key=0;
    0092 2744      CLR	R20
(0043) 		   break;
    0093 C007      RJMP	0x009B
(0044) 	   case 0X0D:
(0045) 	       key=1;
    0094 E041      LDI	R20,1
(0046) 		   break;
    0095 C005      RJMP	0x009B
(0047) 	   	 case 0X0B: 
(0048) 	       key=2;
    0096 E042      LDI	R20,2
(0049) 		   break;
    0097 C003      RJMP	0x009B
(0050) 	   case 0X07:
(0051) 	       key=3;
    0098 E043      LDI	R20,3
(0052) 		   break; 
    0099 C001      RJMP	0x009B
(0053) 	   default:	
(0054) 	       key=0;     	   
    009A 2744      CLR	R20
(0055) 	}
(0056) 	  while(key_press());
    009B DFC9      RCALL	_key_press
    009C 2300      TST	R16
    009D F7E9      BNE	0x009B
(0057) 	}
    009E C001      RJMP	0x00A0
(0058) 	else
(0059) 	{
(0060) 	  key=0;
    009F 2744      CLR	R20
(0061) 	}
(0062) 	return key;
    00A0 2F04      MOV	R16,R20
    00A1 D08B      RCALL	pop_gset2
    00A2 9508      RET
FILE: I:\AVR视频教程\视频教程\lesson9\LESSON9\LESSON9.C
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) #include "Skey.c"
(0006) 
(0007) #define  START  0X08
(0008) #define  MT_SLA_ACK  0X18
(0009) #define  MT_DATA_ACK  0X28
(0010) 
(0011) #define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))	//产生START信号
(0012) #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))	//产生STOP信号
(0013) #define Wait() while(!(TWCR&(1<<TWINT)))		//等待当前操作完成
(0014) #define TestACK() (TWSR&0xF8)				//取出状态码
(0015) #define SetACK() (TWCR|=(1<<TWEA))			//产生ACK
(0016) #define Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);}	//发送一个字节(twi_d为写入的数据)
(0017) 
(0018) void twi_init()
(0019) {
(0020)     TWBR=0X20;
_twi_init:
    00A3 E280      LDI	R24,0x20
    00A4 B980      OUT	P00,R24
(0021) 	TWSR=0;
    00A5 2422      CLR	R2
    00A6 B821      OUT	P01,R2
(0022) 	TWCR=0X44;
    00A7 E484      LDI	R24,0x44
    00A8 BF86      OUT	P36,R24
(0023) }
    00A9 9508      RET
_AD5161_writeB:
  rdata                --> Y+4
  cmd                  --> R20
  devadd               --> R22
    00AA D07E      RCALL	push_gset2
    00AB 2F42      MOV	R20,R18
    00AC 2F60      MOV	R22,R16
(0024) uchar AD5161_writeB(uchar devadd,uchar cmd,uchar rdata)
(0025) {
(0026)     Start();
    00AD EA84      LDI	R24,0xA4
    00AE BF86      OUT	P36,R24
(0027) 	Wait();
    00AF B626      IN	R2,P36
    00B0 FE27      SBRS	R2,7
    00B1 CFFD      RJMP	0x00AF
(0028) 	if(TestACK()!=START)
    00B2 B181      IN	R24,P01
    00B3 7F88      ANDI	R24,0xF8
    00B4 3088      CPI	R24,0x8
    00B5 F011      BEQ	0x00B8
(0029) 	{
(0030) 	   return 0;
    00B6 2700      CLR	R16
    00B7 C02B      RJMP	0x00E3
(0031) 	}
(0032) 	Writebyte(devadd);
    00B8 B963      OUT	P03,R22
    00B9 E884      LDI	R24,0x84
    00BA BF86      OUT	P36,R24
(0033) 	Wait();
    00BB B626      IN	R2,P36
    00BC FE27      SBRS	R2,7
    00BD CFFD      RJMP	0x00BB
(0034) 	if(TestACK()!=MT_SLA_ACK)
    00BE B181      IN	R24,P01
    00BF 7F88      ANDI	R24,0xF8
    00C0 3188      CPI	R24,0x18
    00C1 F011      BEQ	0x00C4
(0035) 	{
(0036) 	   return 0;
    00C2 2700      CLR	R16
    00C3 C01F      RJMP	0x00E3
(0037) 	}
(0038) 	Writebyte(cmd);
    00C4 B943      OUT	P03,R20
    00C5 E884      LDI	R24,0x84
    00C6 BF86      OUT	P36,R24
(0039) 	Wait();
    00C7 B626      IN	R2,P36
    00C8 FE27      SBRS	R2,7
    00C9 CFFD      RJMP	0x00C7
(0040) 	if(TestACK()!=MT_DATA_ACK)
    00CA B181      IN	R24,P01
    00CB 7F88      ANDI	R24,0xF8
    00CC 3288      CPI	R24,0x28
    00CD F011      BEQ	0x00D0
(0041) 	{
(0042) 	   return 0;
    00CE 2700      CLR	R16
    00CF C013      RJMP	0x00E3
(0043) 	}
(0044) 	Writebyte(rdata);
    00D0 800C      LDD	R0,4+Y
    00D1 B803      OUT	P03,R0
    00D2 E884      LDI	R24,0x84
    00D3 BF86      OUT	P36,R24
(0045) 	Wait();
    00D4 B626      IN	R2,P36
    00D5 FE27      SBRS	R2,7
    00D6 CFFD      RJMP	0x00D4
(0046) 	if(TestACK()!=MT_DATA_ACK)
    00D7 B181      IN	R24,P01
    00D8 7F88      ANDI	R24,0xF8
    00D9 3288      CPI	R24,0x28
    00DA F011      BEQ	0x00DD
(0047) 	{
(0048) 	   return 0;
    00DB 2700      CLR	R16
    00DC C006      RJMP	0x00E3
(0049) 	}
(0050) 	Stop();
    00DD E984      LDI	R24,0x94
    00DE BF86      OUT	P36,R24
(0051) 	delay(10);
    00DF E00A      LDI	R16,0xA
    00E0 E010      LDI	R17,0
    00E1 DF6F      RCALL	_delay
(0052) 	return 1;
    00E2 E001      LDI	R16,1
    00E3 D049      RCALL	pop_gset2
    00E4 9508      RET
_main:
  data                 --> R20
  i                    --> R10
    00E5 9721      SBIW	R28,1
(0053) }
(0054) 
(0055) void main()
(0056) {
(0057)     uchar i,data=0;
    00E6 2744      CLR	R20
(0058)     twi_init();
    00E7 DFBB      RCALL	_twi_init
(0059) 	AD5161_writeB(0X58,0,data);
    00E8 8348      STD	R20,0+Y
    00E9 2722      CLR	R18
    00EA E508      LDI	R16,0x58
    00EB DFBE      RCALL	_AD5161_writeB
    00EC C022      RJMP	0x010F
(0060) 	while(1)
(0061) 	{
(0062) 	   if(key_press())
    00ED DF77      RCALL	_key_press
    00EE 2300      TST	R16
    00EF F0F9      BEQ	0x010F
(0063) 	   {
(0064) 	     i=key_scan();
    00F0 DF85      RCALL	_key_scan
    00F1 2EA0      MOV	R10,R16
(0065) 		 
(0066) 		switch(i)
    00F2 2D6A      MOV	R22,R10
    00F3 2777      CLR	R23
    00F4 3060      CPI	R22,0
    00F5 0767      CPC	R22,R23
    00F6 F069      BEQ	0x0104
    00F7 3061      CPI	R22,1
    00F8 E0E0      LDI	R30,0
    00F9 077E      CPC	R23,R30
    00FA F059      BEQ	0x0106
    00FB 3062      CPI	R22,2
    00FC E0E0      LDI	R30,0
    00FD 077E      CPC	R23,R30
    00FE F049      BEQ	0x0108
    00FF 3063      CPI	R22,3
    0100 E0E0      LDI	R30,0
    0101 077E      CPC	R23,R30
    0102 F039      BEQ	0x010A
    0103 C007      RJMP	0x010B
(0067) 		{
(0068) 		  case 0:
(0069) 		     data=data-16;
    0104 5140      SUBI	R20,0x10
(0070) 			 break;
    0105 C005      RJMP	0x010B
(0071) 		   case 1:
(0072) 		     data=data+16;
    0106 5F40      SUBI	R20,0xF0
(0073) 			 break;	 
    0107 C003      RJMP	0x010B
(0074) 		   case 2:
(0075) 		     data=0;
    0108 2744      CLR	R20
(0076) 			 break;
    0109 C001      RJMP	0x010B
(0077) 		   case 3:
(0078) 		     data=255;	
    010A EF4F      LDI	R20,0xFF
(0079) 			 break; 	  
(0080) 		}  
(0081) 		AD5161_writeB(0x58,0,data);  
    010B 8348      STD	R20,0+Y
    010C 2722      CLR	R18
    010D E508      LDI	R16,0x58
    010E DF9B      RCALL	_AD5161_writeB
    010F CFDD      RJMP	0x00ED
(0082) 	   }
(0083) 	}
(0084) }FILE: <library>
    0110 9621      ADIW	R28,1
    0111 9508      RET
push_gset1:
    0112 935A      ST	R21,-Y
    0113 934A      ST	R20,-Y
    0114 9508      RET
pop_gset1:
    0115 E0E1      LDI	R30,1
pop:
    0116 9149      LD	R20,Y+
    0117 9159      LD	R21,Y+
    0118 FDE0      SBRC	R30,0
    0119 9508      RET
    011A 9169      LD	R22,Y+
    011B 9179      LD	R23,Y+
    011C FDE1      SBRC	R30,1
    011D 9508      RET
    011E 90A9      LD	R10,Y+
    011F 90B9      LD	R11,Y+
    0120 FDE2      SBRC	R30,2
    0121 9508      RET
    0122 90C9      LD	R12,Y+
    0123 90D9      LD	R13,Y+
    0124 FDE3      SBRC	R30,3
    0125 9508      RET
    0126 90E9      LD	R14,Y+
    0127 90F9      LD	R15,Y+
    0128 9508      RET
push_gset2:
    0129 937A      ST	R23,-Y
    012A 936A      ST	R22,-Y
    012B 940C0112  JMP	push_gset1
pop_gset2:
    012D E0E2      LDI	R30,2
    012E 940C0116  JMP	pop

⌨️ 快捷键说明

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