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

📄 lesson1.lst

📁 AVR单片机C语言编程及应用实例 适合初学者的学习研究 其中包含Atmega16中文资料及Protel部分电路图
💻 LST
字号:
__text_start:
__start:
      13 E5CF      LDI	R28,0x5F
      14 E0D4      LDI	R29,4
      15 BFCD      OUT	0x3D,R28
      16 BFDE      OUT	0x3E,R29
      17 51C0      SUBI	R28,0x10
      18 40D0      SBCI	R29,0
      19 EA0A      LDI	R16,0xAA
      1A 8308      STD	Y+0,R16
      1B 2400      CLR	R0
      1C E6E0      LDI	R30,0x60
      1D E0F0      LDI	R31,0
      1E E010      LDI	R17,0
      1F 36E0      CPI	R30,0x60
      20 07F1      CPC	R31,R17
      21 F011      BEQ	0x0024
      22 9201      ST	R0,Z+
      23 CFFB      RJMP	0x001F
      24 8300      STD	Z+0,R16
      25 E2E6      LDI	R30,0x26
      26 E0F0      LDI	R31,0
      27 E6A0      LDI	R26,0x60
      28 E0B0      LDI	R27,0
      29 E010      LDI	R17,0
      2A E000      LDI	R16,0
      2B BF0B      OUT	0x3B,R16
      2C 32E6      CPI	R30,0x26
      2D 07F1      CPC	R31,R17
      2E F021      BEQ	0x0033
      2F 95C8      LPM
      30 9631      ADIW	R30,1
      31 920D      ST	R0,X+
      32 CFF9      RJMP	0x002C
      33 D072      RCALL	_main
_exit:
      34 CFFF      RJMP	_exit
_Delayms:
  i                    --> R20
  j                    --> R22
  ms                   --> R16
      35 D0C5      RCALL	push_xgsetF000
FILE: C:\iccv7avr\examples.avr\chengxu\lesson1\lesson1.c
(0001) /*******************************************
(0002)   文件:LED.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2006年12月10日 
(0006)   功能:驱动开发板上的LED。1. 流水灯 2.闪烁指定的LED
(0007)   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h>			//包含型号头文件
(0010) #include <macros.h>			//包含"位"操作头文件
(0011) #define  uchar unsigned char
(0012) #define  uint  unsigned int 
(0013) /*******************************************
(0014) 函数名称: Delayms
(0015) 功    能: 延长点亮或者熄灭LED的时间
(0016) 参    数: ms 延长多少毫秒
(0017) 返回值  : 无
(0018) ********************************************/
(0019) void Delayms(uint ms)
(0020) {
(0021)     uint i,j;
(0022) 	for(i=0;i<ms;i++)
      36 2744      CLR	R20
      37 2755      CLR	R21
      38 C00B      RJMP	0x0044
(0023) 	   {
(0024) 	   for(j=0;j<1141;j++);
      39 2766      CLR	R22
      3A 2777      CLR	R23
      3B C002      RJMP	0x003E
      3C 5F6F      SUBI	R22,0xFF
      3D 4F7F      SBCI	R23,0xFF
      3E 3765      CPI	R22,0x75
      3F E0E4      LDI	R30,4
      40 077E      CPC	R23,R30
      41 F3D0      BCS	0x003C
      42 5F4F      SUBI	R20,0xFF
      43 4F5F      SBCI	R21,0xFF
      44 1740      CP	R20,R16
      45 0751      CPC	R21,R17
      46 F390      BCS	0x0039
      47 C0B8      RJMP	pop_xgsetF000
_One_led:
  i                    --> Y,+1
  light                --> R20
  number               --> R10
      48 92AA      ST	R10,-Y
      49 934A      ST	R20,-Y
      4A 2F42      MOV	R20,R18
      4B 2EA0      MOV	R10,R16
(0025)        }
(0026) }
(0027) 
(0028) /*******************************************
(0029) 函数名称: One_led
(0030) 功    能: 点亮或者熄灭指定的LED
(0031) 参    数: number--指定的LED
(0032) 	  	  light--为1的时候为点亮LED,为0的时候为熄灭LED
(0033) 返回值  : 无
(0034) /********************************************/
(0035) void One_led(uchar number,uchar light)
(0036) {uchar i;
(0037)  if(light==1)		   //点亮操作
      4C 3041      CPI	R20,1
      4D F451      BNE	0x0058
(0038)  {
(0039)   PORTA|=BIT(number);   //更新数据
      4E E001      LDI	R16,1
      4F 2D1A      MOV	R17,R10
      50 D0C2      RCALL	lsl8
      51 B22B      IN	R2,0x1B
      52 2A20      OR	R2,R16
      53 BA2B      OUT	0x1B,R2
(0040)   Delayms(10);			   //调整时序
      54 E00A      LDI	R16,0xA
      55 E010      LDI	R17,0
      56 DFDE      RCALL	_Delayms
(0041)  }
      57 C00B      RJMP	0x0063
(0042)  else
(0043)  {
(0044)   PORTA&=~BIT(number);   //更新数据
      58 E001      LDI	R16,1
      59 2D1A      MOV	R17,R10
      5A D0B8      RCALL	lsl8
      5B 2E20      MOV	R2,R16
      5C 9420      COM	R2
      5D B23B      IN	R3,0x1B
      5E 2032      AND	R3,R2
      5F BA3B      OUT	0x1B,R3
(0045)   Delayms(10);			   //调整时序
      60 E00A      LDI	R16,0xA
      61 E010      LDI	R17,0
      62 DFD2      RCALL	_Delayms
(0046)  }
      63 9149      LD	R20,Y+
      64 90A9      LD	R10,Y+
      65 9508      RET
_All_led:
  light                --> R10
      66 92AA      ST	R10,-Y
      67 2EA0      MOV	R10,R16
(0047) }
(0048) /*******************************************
(0049) 函数名称: All_led
(0050) 功    能: 点亮或者熄灭全部LED
(0051) 参    数: light--为1的时候为点亮全部LED,为0的时候为熄灭全部LED
(0052) 返回值  : 无
(0053) /********************************************/
(0054) void All_led(uchar light)
(0055) {
(0056)  if(light)
      68 20AA      TST	R10
      69 F031      BEQ	0x0070
(0057)  {
(0058)   PORTA=0XFF;	 //输出数据
      6A EF8F      LDI	R24,0xFF
      6B BB8B      OUT	0x1B,R24
(0059)   Delayms(5);			 //调整时序
      6C E005      LDI	R16,5
      6D E010      LDI	R17,0
      6E DFC6      RCALL	_Delayms
(0060)  }
      6F C005      RJMP	0x0075
(0061)  else
(0062)  {
(0063)   PORTA=0X00;	 //输出数据
      70 2422      CLR	R2
      71 BA2B      OUT	0x1B,R2
(0064)   Delayms(5);			 //调整时序
      72 E005      LDI	R16,5
      73 E010      LDI	R17,0
      74 DFC0      RCALL	_Delayms
(0065)  }
      75 90A9      LD	R10,Y+
      76 9508      RET
_Flow_LED:
  i                    --> R20
  MS                   --> R10
      77 92AA      ST	R10,-Y
      78 934A      ST	R20,-Y
      79 2EA0      MOV	R10,R16
(0066) }
(0067) /*******************************************
(0068) 函数名称: Flow_led
(0069) 功    能: 流水灯(循环一次)
(0070) 参    数: MS--点亮相邻LED的时间间隔,单位是毫秒
(0071) 返回值  : 无
(0072) /********************************************/
(0073) void Flow_LED(uchar MS)
(0074) {
(0075)  uchar i;
(0076)  for(i=0;i<8;i++)	//循环8次,8个LED依次点亮
      7A 2744      CLR	R20
      7B C00B      RJMP	0x0087
(0077)  {
(0078)   All_led(0);	//全部熄灭
      7C 2700      CLR	R16
      7D DFE8      RCALL	_All_led
(0079)   One_led(i,1);	//点亮指定的LED
      7E E021      LDI	R18,1
      7F 2F04      MOV	R16,R20
      80 DFC7      RCALL	_One_led
(0080)   Delayms(MS);		//延时指定的时间
      81 2D0A      MOV	R16,R10
      82 2711      CLR	R17
      83 DFB1      RCALL	_Delayms
(0081)   All_led(0);	//全部熄灭
      84 2700      CLR	R16
      85 DFE0      RCALL	_All_led
      86 9543      INC	R20
      87 3048      CPI	R20,0x8
      88 F398      BCS	0x007C
      89 9149      LD	R20,Y+
      8A 90A9      LD	R10,Y+
      8B 9508      RET
_Flash_LED:
  time                 --> R20
  MS                   --> R10
  number               --> R12
      8C D078      RCALL	push_xgset303C
      8D 2EA2      MOV	R10,R18
      8E 2EC0      MOV	R12,R16
(0082)  } 
(0083) }
(0084) /*******************************************
(0085) 函数名称: Flash_led
(0086) 功    能: 闪烁指定的LED(第几盏就闪烁几次)
(0087) 参    数: number--指定的LED
(0088) 	  	  MS--LED闪烁的时间间隔
(0089) 返回值  : 无
(0090) /********************************************/
(0091) void Flash_LED(uchar number,uchar MS)
(0092) {
(0093)   uchar time=6;
      8F E046      LDI	R20,6
(0094)  for(;time>0;time--)
      90 C011      RJMP	0x00A2
(0095)  {
(0096)  All_led(0);			//熄灭所有的LED
      91 2700      CLR	R16
      92 DFD3      RCALL	_All_led
(0097)  One_led(number,1);		//点亮指定的LED
      93 E021      LDI	R18,1
      94 2D0C      MOV	R16,R12
      95 DFB2      RCALL	_One_led
(0098)  Delayms(MS);				//延时指定的时间
      96 2D0A      MOV	R16,R10
      97 2711      CLR	R17
      98 DF9C      RCALL	_Delayms
(0099)  All_led(0);			//熄灭所有的LED
      99 2700      CLR	R16
      9A DFCB      RCALL	_All_led
(0100)  Delayms(MS);				//延时指定的时间
      9B 2D0A      MOV	R16,R10
      9C 2711      CLR	R17
      9D DF97      RCALL	_Delayms
(0101)  One_led(number,0);		//熄灭指定的LED 
      9E 2722      CLR	R18
      9F 2D0C      MOV	R16,R12
      A0 DFA7      RCALL	_One_led
      A1 954A      DEC	R20
      A2 E080      LDI	R24,0
      A3 1784      CP	R24,R20
      A4 F360      BCS	0x0091
      A5 C066      RJMP	pop_xgset303C
(0102)  }
(0103) }
(0104) /*******************************************
(0105) 函数名称: main
(0106) 功    能: 1. 流水灯 2.闪烁指定的LED
(0107) 参    数: 无
(0108) 返回值  : 无
(0109) /********************************************/
(0110) void main()
(0111) {	 
(0112)  uint b,i;	   	
(0113)  b=0;	
_main:
  i                    --> R22
  b                    --> R20
      A6 2744      CLR	R20
      A7 2755      CLR	R21
(0114)  DDRA=0XFF;					//b指定闪烁的LED
      A8 EF8F      LDI	R24,0xFF
      A9 BB8A      OUT	0x1A,R24
      AA C032      RJMP	0x00DD
(0115)  while(1)
(0116)  {
(0117)   if(b<3600)b++,b++;
      AB 3140      CPI	R20,0x10
      AC E0EE      LDI	R30,0xE
      AD 075E      CPC	R21,R30
      AE F420      BCC	0x00B3
      AF 5F4F      SUBI	R20,0xFF
      B0 4F5F      SBCI	R21,0xFF
      B1 5F4F      SUBI	R20,0xFF
      B2 4F5F      SBCI	R21,0xFF
(0118)   if(b%7==0)b++;
      B3 E027      LDI	R18,7
      B4 E030      LDI	R19,0
      B5 018A      MOVW	R16,R20
      B6 D028      RCALL	mod16u
      B7 3000      CPI	R16,0
      B8 0701      CPC	R16,R17
      B9 F411      BNE	0x00BC
      BA 5F4F      SUBI	R20,0xFF
      BB 4F5F      SBCI	R21,0xFF
(0119)   if(b==3600)b=0;
      BC 3140      CPI	R20,0x10
      BD E0EE      LDI	R30,0xE
      BE 075E      CPC	R21,R30
      BF F411      BNE	0x00C2
      C0 2744      CLR	R20
      C1 2755      CLR	R21
(0120)   i=(int)(b%8>0);
      C2 01CA      MOVW	R24,R20
      C3 7087      ANDI	R24,7
      C4 7090      ANDI	R25,0
      C5 3080      CPI	R24,0
      C6 0789      CPC	R24,R25
      C7 F019      BEQ	0x00CB
      C8 E061      LDI	R22,1
      C9 E070      LDI	R23,0
      CA C002      RJMP	0x00CD
      CB 2766      CLR	R22
      CC 2777      CLR	R23
(0121)   switch(i)
      CD 3060      CPI	R22,0
      CE 0767      CPC	R22,R23
      CF F029      BEQ	0x00D5
      D0 3061      CPI	R22,1
      D1 E0E0      LDI	R30,0
      D2 077E      CPC	R23,R30
      D3 F021      BEQ	0x00D8
      D4 C008      RJMP	0x00DD
(0122)   {
(0123)    case 0:
(0124)   	   Flow_LED(200);		//i=0,以流水灯的方式显示
      D5 EC08      LDI	R16,0xC8
      D6 DFA0      RCALL	_Flow_LED
(0125) 	   break;
      D7 C005      RJMP	0x00DD
(0126)    case 1:	 				
(0127)    	   Flash_LED(b%8,100);	//i=1,以闪烁灯的方式显示
FILE: <library>
      D8 E624      LDI	R18,0x64
      D9 2F04      MOV	R16,R20
      DA 7007      ANDI	R16,7
      DB 7010      ANDI	R17,0
      DC DFAF      RCALL	_Flash_LED
      DD CFCD      RJMP	0x00AB
      DE 9508      RET
mod16u:
      DF 9468      BSET	6
      E0 C001      RJMP	xdiv16u
div16u:
      E1 94E8      BCLR	6
xdiv16u:
      E2 92EA      ST	R14,-Y
      E3 92FA      ST	R15,-Y
      E4 938A      ST	R24,-Y
      E5 24EE      CLR	R14
      E6 24FF      CLR	R15
      E7 E180      LDI	R24,0x10
      E8 0F00      LSL	R16
      E9 1F11      ROL	R17
      EA 1CEE      ROL	R14
      EB 1CFF      ROL	R15
      EC 16E2      CP	R14,R18
      ED 06F3      CPC	R15,R19
      EE F018      BCS	0x00F2
      EF 1AE2      SUB	R14,R18
      F0 0AF3      SBC	R15,R19
      F1 9503      INC	R16
      F2 958A      DEC	R24
      F3 F7A1      BNE	0x00E8
      F4 F416      BRTC	0x00F7
      F5 2D0E      MOV	R16,R14
      F6 2D1F      MOV	R17,R15
      F7 9189      LD	R24,Y+
      F8 90F9      LD	R15,Y+
      F9 90E9      LD	R14,Y+
      FA 9508      RET
push_xgsetF000:
      FB 937A      ST	R23,-Y
      FC 936A      ST	R22,-Y
      FD 935A      ST	R21,-Y
      FE 934A      ST	R20,-Y
      FF 9508      RET
pop_xgsetF000:
     100 9149      LD	R20,Y+
     101 9159      LD	R21,Y+
     102 9169      LD	R22,Y+
     103 9179      LD	R23,Y+
     104 9508      RET
push_xgset303C:
     105 935A      ST	R21,-Y
     106 934A      ST	R20,-Y
     107 92DA      ST	R13,-Y
     108 92CA      ST	R12,-Y
     109 92BA      ST	R11,-Y
     10A 92AA      ST	R10,-Y
     10B 9508      RET
pop_xgset303C:
     10C 90A9      LD	R10,Y+
     10D 90B9      LD	R11,Y+
     10E 90C9      LD	R12,Y+
     10F 90D9      LD	R13,Y+
     110 9149      LD	R20,Y+
     111 9159      LD	R21,Y+
     112 9508      RET
lsl8:
     113 2311      TST	R17
     114 F019      BEQ	0x0118
     115 0F00      LSL	R16
     116 951A      DEC	R17
     117 CFFB      RJMP	lsl8
     118 9508      RET

⌨️ 快捷键说明

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