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

📄 funcs.s

📁 1.将uC/OS-II操作系统移植到Mega16上 2.建立两个任务
💻 S
📖 第 1 页 / 共 2 页
字号:
;  Delayus(10);
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 92
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
	cbi 0x18,7
	.dbline 93
;  Delayus(10);
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 94
;  DS1302_writeB(data);	 //写入数据
	mov R16,R20
	xcall _DS1302_writeB
	.dbline 95
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
	cbi 0x18,7
	.dbline 96
;  Delayus(10);			 //调整片选脉冲
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 97
;  PORTC&=~BIT(RTC_CS);	 //拉低片选端
	cbi 0x15,7
	.dbline -2
	.dbline 98
; }
L32:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbsym r addr 22 c
	.dbend
	.dbfunc e DS1302_readD _DS1302_readD fc
;           data -> R20
;           addr -> R20
	.even
_DS1302_readD::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 106
; /*******************************************
; 函数名称: DS1302_readD
; 功    能: 从DS1302的某个地址读出一个字节数据
; 参    数: addr--地址值(寄存器或RAM)
; 返回值  : data--读出的数据
; /********************************************/
; uchar DS1302_readD(uchar addr)
; {
	.dbline 108
;  uchar data;
;  PORTC&=~BIT(RTC_CS);	 //拉低片选端
	cbi 0x15,7
	.dbline 109
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
	cbi 0x18,7
	.dbline 110
;  Delayus(10);
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 111
;  PORTC|=BIT(RTC_CS);	 //拉高片选端
	sbi 0x15,7
	.dbline 112
;  Delayus(10); 			 //调整片选脉冲
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 113
;  DS1302_writeB(addr);	 //写入操作命令(地址)
	mov R16,R20
	xcall _DS1302_writeB
	.dbline 114
;  Delayus(10);
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 115
;  data=DS1302_readB();	 //读出数据
	xcall _DS1302_readB
	mov R20,R16
	.dbline 116
;  Delayus(10);
	ldi R16,10
	ldi R17,0
	xcall _Delayus
	.dbline 117
;  PORTB&=~BIT(RTC_CLK);	 //拉低时钟端
	cbi 0x18,7
	.dbline 118
;  PORTC&=~BIT(RTC_CS); 	 //拉低片选端
	cbi 0x15,7
	.dbline 119
;  return data;			 //返回读出的数据
	mov R16,R20
	.dbline -2
L33:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbsym r addr 20 c
	.dbend
	.dbfunc e DS1302_getT _DS1302_getT fV
;           addr -> R20
;              i -> R22
;           time -> R10,R11
	.even
_DS1302_getT::
	xcall push_gset3
	movw R10,R16
	.dbline -1
	.dbline 128
; }
; /*******************************************
; 函数名称: DS1302_getT
; 功    能: 读取DS1302的当前时间的时、分、秒
; 参    数: time[]--读取的时间数组
; 返回值  : 无
; /********************************************/
; void DS1302_getT(INT8U time[])
; {
	.dbline 130
;     uchar i;
;     uchar addr = 0x80; 			 	  		  //读取地址从秒寄存器开始 
	ldi R20,128
	.dbline 131
;     for(i=0;i<3;i++)
	clr R22
	xjmp L38
L35:
	.dbline 132
	.dbline 133
	mov R16,R20
	ori R16,1
	xcall _DS1302_readD
	ldi R24,2
	mul R24,R22
	movw R30,R0
	add R30,R10
	adc R31,R11
	std z+0,R16
	.dbline 134
	subi R20,254    ; addi 2
	.dbline 135
L36:
	.dbline 131
	inc R22
L38:
	.dbline 131
	cpi R22,3
	brlo L35
	.dbline 136
;     {
;         time[i*2]=DS1302_readD(addr|RD);    // 秒 分 时 日 月 星期 年        
;         addr+=2;
;     }
;     PORTB&=~BIT(RTC_CLK);	 				  //拉低时钟端(时钟端在不操作时为低)
	cbi 0x18,7
	.dbline -2
	.dbline 137
; }
L34:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r addr 20 c
	.dbsym r i 22 c
	.dbsym r time 10 pc
	.dbend
	.dbfunc e One_smg_display _One_smg_display fV
;         number -> R20
;           data -> R22
	.even
_One_smg_display::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 147
; 
; /*******************************************
; 函数名称: One_smg_display
; 功    能: 指定的数码管显示指定的内容
; 参    数: data--显示的内容(0-15)
; 	  	  number--指定的数码管(1-6)
; 返回值  : 无
; /********************************************/
; void One_smg_display(uchar data,uchar number)
; { 
	.dbline 148
;  PORTB|=0x3F;			   //输出位选
	in R24,0x18
	ori R24,63
	out 0x18,R24
	.dbline 149
;  PORTA|=BIT(BITLK);		   //更新位选
	sbi 0x1b,4
	.dbline 151
;  //Delayus(50);			   //调整时序
;  PORTA&=~BIT(BITLK);	   //锁存位选
	cbi 0x1b,4
	.dbline 153
; 
;  PORTB=SEGMENT[data];	   //输出段选
	ldi R24,2
	mul R24,R22
	movw R30,R0
	ldi R24,<_SEGMENT
	ldi R25,>_SEGMENT
	add R30,R24
	adc R31,R25
	lpm R0,Z+
	lpm R1,Z
	movw R30,R0
	out 0x18,R30
	.dbline 154
;  PORTA|=BIT(SEGLK);		   //更新段选
	sbi 0x1b,3
	.dbline 156
;  //Delayus(50);			   //调整时序
;  PORTA&=~BIT(SEGLK);	   //锁存段选
	cbi 0x1b,3
	.dbline 158
;  
;  number=~BIT(number-1);	   //调整位选(指定时是1~6,而操作的时候是0~5)
	mov R17,R20
	subi R17,1
	ldi R16,1
	xcall lsl8
	mov R20,R16
	com R20
	.dbline 159
;  PORTB=number;			   //输出位选
	out 0x18,R20
	.dbline 160
;  PORTA|=BIT(BITLK);		   //更新位选
	sbi 0x1b,4
	.dbline 162
;  //Delayus(50);				   //调整时序
;  PORTA&=~BIT(BITLK);	   //锁存位选
	cbi 0x1b,4
	.dbline -2
	.dbline 163
; }
L39:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r number 20 c
	.dbsym r data 22 c
	.dbend
	.dbfunc e All_smg_display _All_smg_display fV
;              i -> R20
;          pdata -> R22,R23
	.even
_All_smg_display::
	xcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 171
; /*******************************************
; 函数名称: All_smg_display
; 功    能: 6个数码管显示指定的内容
; 参    数: *pdata--显示内容数组地址
; 返回值  : 无
; /********************************************/
; void All_smg_display(uchar *pdata)
; {
	.dbline 173
;  uchar i;
;  for(i=0;i<6;i++)
	clr R20
	xjmp L44
L41:
	.dbline 174
	.dbline 175
	mov R18,R20
	subi R18,255    ; addi 1
	mov R2,R20
	clr R3
	ldi R30,5
	ldi R31,0
	sub R30,R2
	sbc R31,R3
	add R30,R22
	adc R31,R23
	ldd R16,z+0
	xcall _One_smg_display
	.dbline 176
	ldi R16,3
	ldi R17,0
	xcall _Delayms
	.dbline 177
L42:
	.dbline 173
	inc R20
L44:
	.dbline 173
	cpi R20,6
	brlo L41
	.dbline -2
	.dbline 178
;  	{
; 	 One_smg_display(pdata[5-i],i+1);
; 	 Delayms(3);
; 	}
; }
L40:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r pdata 22 pc
	.dbend
	.dbfunc e One_led _One_led fV
;              i -> <dead>
;          light -> R22
;         number -> R20
	.even
_One_led::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 188
; 
; /*******************************************
; 函数名称: One_led
; 功    能: 点亮或者熄灭指定的LED
; 参    数: number--指定的LED
; 	  	  light--为TRUE的时候为点亮LED,为FALSE的时候为熄灭LED
; 返回值  : 无
; /********************************************/
; void One_led(uchar number,uchar light)
; {
	.dbline 190
;  uchar i;
;  if(light==TRUE)		   //点亮操作
	cpi R22,1
	brne L46
	.dbline 191
;  {
	.dbline 192
;   PORTB&=~BIT(number);	   //输出数据
	ldi R16,1
	mov R17,R20
	xcall lsl8
	mov R2,R16
	com R2
	in R3,0x18
	and R3,R2
	out 0x18,R3
	.dbline 193
;   PORTA|=BIT(LEDLK);	   //更新数据
	sbi 0x1b,2
	.dbline 195
;   //Delayms(5);			   //调整时序
;   PORTA&=~BIT(LEDLK);	   //锁存数据
	cbi 0x1b,2
	.dbline 196
;  }
	xjmp L47
L46:
	.dbline 198
	.dbline 199
	ldi R16,1
	mov R17,R20
	xcall lsl8
	in R2,0x18
	or R2,R16
	out 0x18,R2
	.dbline 200
	sbi 0x1b,2
	.dbline 202
	cbi 0x1b,2
	.dbline 203
L47:
	.dbline -2
	.dbline 204
;  else
;  {
;   PORTB|=BIT(number);	   //输出数据
;   PORTA|=BIT(LEDLK);	   //更新数据
;   //Delayms(5);			   //调整时序
;   PORTA&=~BIT(LEDLK);	   //锁存数据
;  }
; }
L45:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l i 1 c
	.dbsym r light 22 c
	.dbsym r number 20 c
	.dbend
	.dbfunc e All_led _All_led fV
;          light -> R16
	.even
_All_led::
	.dbline -1
	.dbline 212
; /*******************************************
; 函数名称: All_led
; 功    能: 点亮或者熄灭全部LED
; 参    数: light--为TRUE的时候为点亮全部LED,为FALSE的时候为熄灭全部LED
; 返回值  : 无
; /********************************************/
; void All_led(uchar light)
; {
	.dbline 213
;  if(light)
	tst R16
	breq L49
	.dbline 214
;  {
	.dbline 215
;   PORTB&=~ALLLED;
	in R24,0x18
	andi R24,0
	out 0x18,R24
	.dbline 216
;   PORTA|=BIT(LEDLK);
	sbi 0x1b,2
	.dbline 218
;   //Delayms(5);
;   PORTA&=~BIT(LEDLK);
	cbi 0x1b,2
	.dbline 219
;  }
	xjmp L50
L49:
	.dbline 221
	.dbline 222
	in R24,0x18
	ori R24,255
	out 0x18,R24
	.dbline 223
	sbi 0x1b,2
	.dbline 225
	cbi 0x1b,2
	.dbline 226
L50:
	.dbline -2
	.dbline 227
;  else
;  {
;   PORTB|=ALLLED;
;   PORTA|=BIT(LEDLK);
;   //Delayms(5);
;   PORTA&=~BIT(LEDLK);
;  }
; }
L48:
	.dbline 0 ; func end
	ret
	.dbsym r light 16 c
	.dbend

⌨️ 快捷键说明

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