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

📄 lesson1.s

📁 AVR单片机C语言编程及应用实例 适合初学者的学习研究 其中包含Atmega16中文资料及Protel部分电路图
💻 S
字号:
	.module lesson1.c
	.area text(rom, con, rel)
	.dbfile C:\iccv7avr\examples.avr\chengxu\lesson1\lesson1.c
	.dbfunc e Delayms _Delayms fV
;              i -> R20,R21
;              j -> R22,R23
;             ms -> R16,R17
	.even
_Delayms::
	rcall push_xgsetF000
	.dbline -1
	.dbline 20
; /*******************************************
;   文件:LED.C
;   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
;   硬件:ATMEGA16芯片
;   日期:2006年12月10日 
;   功能:驱动开发板上的LED。1. 流水灯 2.闪烁指定的LED
;   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h>			//包含型号头文件
; #include <macros.h>			//包含"位"操作头文件
; #define  uchar unsigned char
; #define  uint  unsigned int 
; /*******************************************
; 函数名称: Delayms
; 功    能: 延长点亮或者熄灭LED的时间
; 参    数: ms 延长多少毫秒
; 返回值  : 无
; ********************************************/
; void Delayms(uint ms)
; {
	.dbline 22
;     uint i,j;
; 	for(i=0;i<ms;i++)
	clr R20
	clr R21
	rjmp L5
L2:
	.dbline 23
; 	   {
	.dbline 24
; 	   for(j=0;j<1141;j++);
	clr R22
	clr R23
	rjmp L9
L6:
	.dbline 24
L7:
	.dbline 24
	subi R22,255  ; offset = 1
	sbci R23,255
L9:
	.dbline 24
	cpi R22,117
	ldi R30,4
	cpc R23,R30
	brlo L6
X0:
	.dbline 25
;        }
L3:
	.dbline 22
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 22
	cp R20,R16
	cpc R21,R17
	brlo L2
X1:
	.dbline -2
L1:
	.dbline 0 ; func end
	rjmp pop_xgsetF000
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r ms 16 i
	.dbend
	.dbfunc e One_led _One_led fV
;              i -> <dead>
;          light -> R20
;         number -> R10
	.even
_One_led::
	st -y,R10
	st -y,R20
	mov R20,R18
	mov R10,R16
	.dbline -1
	.dbline 36
; }
; 
; /*******************************************
; 函数名称: One_led
; 功    能: 点亮或者熄灭指定的LED
; 参    数: number--指定的LED
; 	  	  light--为1的时候为点亮LED,为0的时候为熄灭LED
; 返回值  : 无
; /********************************************/
; void One_led(uchar number,uchar light)
; {uchar i;
	.dbline 37
;  if(light==1)		   //点亮操作
	cpi R20,1
	brne L11
X2:
	.dbline 38
;  {
	.dbline 39
;   PORTA|=BIT(number);   //更新数据
	ldi R16,1
	mov R17,R10
	rcall lsl8
	in R2,0x1b
	or R2,R16
	out 0x1b,R2
	.dbline 40
;   Delayms(10);			   //调整时序
	ldi R16,10
	ldi R17,0
	rcall _Delayms
	.dbline 41
;  }
	rjmp L12
L11:
	.dbline 43
;  else
;  {
	.dbline 44
;   PORTA&=~BIT(number);   //更新数据
	ldi R16,1
	mov R17,R10
	rcall lsl8
	mov R2,R16
	com R2
	in R3,0x1b
	and R3,R2
	out 0x1b,R3
	.dbline 45
;   Delayms(10);			   //调整时序
	ldi R16,10
	ldi R17,0
	rcall _Delayms
	.dbline 46
;  }
L12:
	.dbline -2
L10:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym l i 1 c
	.dbsym r light 20 c
	.dbsym r number 10 c
	.dbend
	.dbfunc e All_led _All_led fV
;          light -> R10
	.even
_All_led::
	st -y,R10
	mov R10,R16
	.dbline -1
	.dbline 55
; }
; /*******************************************
; 函数名称: All_led
; 功    能: 点亮或者熄灭全部LED
; 参    数: light--为1的时候为点亮全部LED,为0的时候为熄灭全部LED
; 返回值  : 无
; /********************************************/
; void All_led(uchar light)
; {
	.dbline 56
;  if(light)
	tst R10
	breq L14
X3:
	.dbline 57
;  {
	.dbline 58
;   PORTA=0XFF;	 //输出数据
	ldi R24,255
	out 0x1b,R24
	.dbline 59
;   Delayms(5);			 //调整时序
	ldi R16,5
	ldi R17,0
	rcall _Delayms
	.dbline 60
;  }
	rjmp L15
L14:
	.dbline 62
;  else
;  {
	.dbline 63
;   PORTA=0X00;	 //输出数据
	clr R2
	out 0x1b,R2
	.dbline 64
;   Delayms(5);			 //调整时序
	ldi R16,5
	ldi R17,0
	rcall _Delayms
	.dbline 65
;  }
L15:
	.dbline -2
L13:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbsym r light 10 c
	.dbend
	.dbfunc e Flow_LED _Flow_LED fV
;              i -> R20
;             MS -> R10
	.even
_Flow_LED::
	st -y,R10
	st -y,R20
	mov R10,R16
	.dbline -1
	.dbline 74
; }
; /*******************************************
; 函数名称: Flow_led
; 功    能: 流水灯(循环一次)
; 参    数: MS--点亮相邻LED的时间间隔,单位是毫秒
; 返回值  : 无
; /********************************************/
; void Flow_LED(uchar MS)
; {
	.dbline 76
;  uchar i;
;  for(i=0;i<8;i++)	//循环8次,8个LED依次点亮
	clr R20
	rjmp L20
L17:
	.dbline 77
;  {
	.dbline 78
;   All_led(0);	//全部熄灭
	clr R16
	rcall _All_led
	.dbline 79
;   One_led(i,1);	//点亮指定的LED
	ldi R18,1
	mov R16,R20
	rcall _One_led
	.dbline 80
;   Delayms(MS);		//延时指定的时间
	mov R16,R10
	clr R17
	rcall _Delayms
	.dbline 81
;   All_led(0);	//全部熄灭
	clr R16
	rcall _All_led
	.dbline 82
;  } 
L18:
	.dbline 76
	inc R20
L20:
	.dbline 76
	cpi R20,8
	brlo L17
X4:
	.dbline -2
L16:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r i 20 c
	.dbsym r MS 10 c
	.dbend
	.dbfunc e Flash_LED _Flash_LED fV
;           time -> R20
;             MS -> R10
;         number -> R12
	.even
_Flash_LED::
	rcall push_xgset303C
	mov R10,R18
	mov R12,R16
	.dbline -1
	.dbline 92
; }
; /*******************************************
; 函数名称: Flash_led
; 功    能: 闪烁指定的LED(第几盏就闪烁几次)
; 参    数: number--指定的LED
; 	  	  MS--LED闪烁的时间间隔
; 返回值  : 无
; /********************************************/
; void Flash_LED(uchar number,uchar MS)
; {
	.dbline 93
;   uchar time=6;
	ldi R20,6
	.dbline 94
;  for(;time>0;time--)
	rjmp L25
L22:
	.dbline 95
;  {
	.dbline 96
;  All_led(0);			//熄灭所有的LED
	clr R16
	rcall _All_led
	.dbline 97
;  One_led(number,1);		//点亮指定的LED
	ldi R18,1
	mov R16,R12
	rcall _One_led
	.dbline 98
;  Delayms(MS);				//延时指定的时间
	mov R16,R10
	clr R17
	rcall _Delayms
	.dbline 99
;  All_led(0);			//熄灭所有的LED
	clr R16
	rcall _All_led
	.dbline 100
;  Delayms(MS);				//延时指定的时间
	mov R16,R10
	clr R17
	rcall _Delayms
	.dbline 101
;  One_led(number,0);		//熄灭指定的LED 
	clr R18
	mov R16,R12
	rcall _One_led
	.dbline 102
;  }
L23:
	.dbline 94
	dec R20
L25:
	.dbline 94
	ldi R24,0
	cp R24,R20
	brlo L22
X5:
	.dbline -2
L21:
	.dbline 0 ; func end
	rjmp pop_xgset303C
	.dbsym r time 20 c
	.dbsym r MS 10 c
	.dbsym r number 12 c
	.dbend
	.dbfunc e main _main fV
;              i -> R22,R23
;              b -> R20,R21
	.even
_main::
	.dbline -1
	.dbline 111
; }
; /*******************************************
; 函数名称: main
; 功    能: 1. 流水灯 2.闪烁指定的LED
; 参    数: 无
; 返回值  : 无
; /********************************************/
; void main()
; {	 
	.dbline 113
;  uint b,i;	   	
;  b=0;	
	clr R20
	clr R21
	.dbline 114
;  DDRA=0XFF;					//b指定闪烁的LED
	ldi R24,255
	out 0x1a,R24
	rjmp L28
L27:
	.dbline 116
;  while(1)
;  {
	.dbline 117
;   if(b<3600)b++,b++;
	cpi R20,16
	ldi R30,14
	cpc R21,R30
	brsh L30
X6:
	.dbline 117
	subi R20,255  ; offset = 1
	sbci R21,255
	subi R20,255  ; offset = 1
	sbci R21,255
L30:
	.dbline 118
;   if(b%7==0)b++;
	ldi R18,7
	ldi R19,0
	movw R16,R20
	rcall mod16u
	cpi R16,0
	cpc R16,R17
	brne L32
X7:
	.dbline 118
	subi R20,255  ; offset = 1
	sbci R21,255
L32:
	.dbline 119
;   if(b==3600)b=0;
	cpi R20,16
	ldi R30,14
	cpc R21,R30
	brne L34
X8:
	.dbline 119
	clr R20
	clr R21
L34:
	.dbline 120
;   i=(int)(b%8>0);
	movw R24,R20
	andi R24,7
	andi R25,0
	cpi R24,0
	cpc R24,R25
	breq L36
X9:
	ldi R22,1
	ldi R23,0
	rjmp L37
L36:
	clr R22
	clr R23
L37:
	.dbline 121
;   switch(i)
	cpi R22,0
	cpc R22,R23
	breq L40
X10:
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L41
X11:
	rjmp L38
L40:
	.dbline 124
;   {
;    case 0:
;   	   Flow_LED(200);		//i=0,以流水灯的方式显示
	ldi R16,200
	rcall _Flow_LED
	.dbline 125
; 	   break;
	rjmp L39
L41:
	.dbline 127
;    case 1:	 				
;    	   Flash_LED(b%8,100);	//i=1,以闪烁灯的方式显示
	ldi R18,100
	mov R16,R20
	andi R16,7
	andi R17,0
	rcall _Flash_LED
	.dbline 128
;   }
L38:
L39:
	.dbline 129
;  }  
L28:
	.dbline 115
	rjmp L27
X12:
	.dbline -2
L26:
	.dbline 0 ; func end
	ret
	.dbsym r i 22 i
	.dbsym r b 20 i
	.dbend
; }

⌨️ 快捷键说明

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