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

📄 1602_8563.s

📁 avr单片机的程序
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module _1602_8563.c
	.area text(rom, con, rel)
	.dbfile D:\PCF8563\1602_time\timer_io.h
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 28
; /*************************************
; *         PCF8563时钟程序			 *
; * 文 件 名:1602_8563.c				 *
; * 建立日期:2007年07月04日			 *
; * 设    计:铜河					 *
; * 修改日期:2007年07月08日			 *
; * 版    本:V22.02				 	 *
; * 主控芯片:Mega16L					 *
; * 工作频率:7.3728MHz				 *
; *************************************/
; #include <iom16v.h>
; #include <macros.h>
; #include <stdio.h>
; #include <D:\PCF8563\1602_time\timer_io.h>
; #include <D:\PCF8563\1602_time\delay.h>
; #include <D:\PCF8563\1602_time\lcd1602_4h.h>
; #include <D:\PCF8563\1602_time\TWI_8563.h>
; 
; //数据简化宏定义
; #define uchar unsigned char
; #define uint unsigned int
; 
; //全局变量定义
; uchar timer[8];		  				 //时钟数据
; 
; /**********************************
; *         蜂鸣器发声函数  	  	  *
; * 函数功能:蜂鸣器发出声响		  *
	.dbline 29
; * 入    口:n 声次数	  		  *
	ldi R24,255
	out 0x1a,R24
	.dbline 30
; * 			i 声时长,i*10ms	  *
	clr R2
	out 0x1b,R2
	.dbline 31
; * 返    回:无		  			  *
	ldi R24,8
	out 0x17,R24
	.dbline 32
; * 发声频率:固定1KHz 无源		  *
	out 0x18,R2
	.dbline 33
; **********************************/
	out 0x14,R2
	.dbline 34
; void spk(uchar i,uchar n)
	ldi R24,255
	out 0x15,R24
	.dbline 35
;     {
	ldi R24,240
	out 0x11,R24
	.dbline 36
; 	uint a;
	ldi R24,15
	out 0x12,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfile D:\PCF8563\1602_time\delay.h
	.dbfunc e delay_us _delay_us fV
;              i -> R16,R17
	.even
_delay_us::
	.dbline -1
	.dbline 15
	xjmp L4
L3:
	.dbline 17
	.dbline 18
	subi R16,1
	sbci R17,0
	.dbline 19
	nop
	.dbline 20
	nop
	.dbline 21
	nop
	.dbline 22
L4:
	.dbline 16
	cpi R16,0
	cpc R16,R17
	brne L3
X0:
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              a -> R20,R21
;              i -> R16,R17
	.even
_delay_ms::
	xcall push_gset1
	.dbline -1
	.dbline 32
	.dbline 34
	xjmp L10
L7:
	.dbline 35
	.dbline 36
	ldi R20,1143
	ldi R21,4
	xjmp L14
L11:
	.dbline 37
	.dbline 37
	.dbline 37
L12:
	.dbline 36
	subi R20,1
	sbci R21,0
L14:
	.dbline 36
	cpi R20,0
	cpc R20,R21
	brne L11
X1:
	.dbline 38
L8:
	.dbline 34
	subi R16,1
	sbci R17,0
L10:
	.dbline 34
	cpi R16,0
	cpc R16,R17
	brne L7
X2:
	.dbline -2
L6:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r a 20 i
	.dbsym r i 16 i
	.dbend
	.dbfile D:\PCF8563\1602_time\lcd1602_4h.h
	.dbfunc e lcd_da _lcd_da fV
;              a -> R20
;           data -> R22
	.even
_lcd_da::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 33
	.dbline 35
	sbi 0x1b,2
	.dbline 36
	sbi 0x1b,3
	.dbline 37
; 	for(;n;n--)
	mov R20,R22
	ori R20,15
	.dbline 38
; 	    {
	in R24,0x1b
	ori R24,240
	and R24,R20
	out 0x1b,R24
	.dbline 39
; 		a=i*10;	   	 		       //计算每声响的长度:MS
	ldi R16,50
	ldi R17,0
	xcall _delay_us
	.dbline 40
; 		for(;a;a--)
	cbi 0x1b,3
	.dbline 41
; 		    {
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 43
; 			delay_us(500);		   //响声频率为1KHZ
; 			SPK_TG;
	sbi 0x1b,3
	.dbline 44
; 			delay_us(500);
	mov R20,R22
	andi R20,#0x0F
	swap R20
	ori R20,15
	.dbline 45
; 			SPK_TG;
	in R24,0x1b
	ori R24,240
	and R24,R20
	out 0x1b,R24
	.dbline 46
; 			}
	ldi R16,50
	ldi R17,0
	xcall _delay_us
	.dbline 47
; 		SPK_OFF;   		  		   //响完关闭蜂鸣器
	cbi 0x1b,3
	.dbline 48
; 		delay_ms(100);			   //每声响之间隔100MS
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline -2
L15:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r a 20 c
	.dbsym r data 22 c
	.dbend
	.dbfunc e lcd_comm _lcd_comm fV
;              a -> R20
;           data -> R22
	.even
_lcd_comm::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 53
; 		}
; 	}
; 
; /**********************************
; *          读出数据函数			  *
	.dbline 55
; **********************************/
; uchar read_timer(void)
	cbi 0x1b,2
	.dbline 56
;     {
	sbi 0x1b,3
	.dbline 57
; 	start();		 	 	          //启动总线
	mov R20,R22
	ori R20,15
	.dbline 58
; 	waitack();						  //等待启动完成
	in R24,0x1b
	ori R24,240
	and R24,R20
	out 0x1b,R24
	.dbline 59
; 	if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
	ldi R16,50
	ldi R17,0
	xcall _delay_us
	.dbline 60
; 	write_tim(SLA_W);				  //发送写地址
	cbi 0x1b,3
	.dbline 61
; 	write_tim(0x02);				  //写数据地址
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline 63
; 	
; 	start();
	sbi 0x1b,3
	.dbline 64
; 	waitack();						  //等待启动完成
	mov R20,R22
	andi R20,#0x0F
	swap R20
	ori R20,15
	.dbline 65
; 	if(chkack()!=RESTART)return I2C_ERR;	  //检查是否启动成功
	in R24,0x1b
	ori R24,240
	and R24,R20
	out 0x1b,R24
	.dbline 66
; 	write_tim(SLA_R);				  //发送读地址
	ldi R16,50
	ldi R17,0
	xcall _delay_us
	.dbline 67
; 	
	cbi 0x1b,3
	.dbline 68
; 	timer[0]=read_tim()&0x7F;		  //读出秒数据
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline -2
L16:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r a 20 c
	.dbsym r data 22 c
	.dbend
	.dbfunc e lcd_comm_b _lcd_comm_b fV
;              a -> R20
;           data -> R20
	.even
_lcd_comm_b::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 73
; 	timer[1]=read_tim()&0x7F;		  //读出分数据
; 	timer[2]=read_tim()&0x3F;		  //读出时数据
; 	timer[3]=read_tim()&0x3F;		  //读出日数据
; 	timer[4]=read_tim()&0x07;		  //读出周数据
; 	   if(timer[4]==0)timer[4]=7;
	.dbline 75
; 	timer[5]=read_tim();	  		  //读出月数据
; 	   if((timer[5]&0x80)==0)
	cbi 0x1b,2
	.dbline 76
; 	        timer[7]=0x20;	 		  //世纪位为0,是21世纪
	sbi 0x1b,3
	.dbline 77
; 	   else timer[7]=0x19;			  //世纪位不为0,是20世纪
	ori R20,15
	.dbline 78
; 	timer[5]=timer[5]&0x1F;
	in R24,0x1b
	ori R24,240
	and R24,R20
	out 0x1b,R24
	.dbline 79
; 	timer[6]=read_tim();			  //读出年数据
	ldi R16,50
	ldi R17,0
	xcall _delay_us
	.dbline 80
; 	stop();
	cbi 0x1b,3
	.dbline 81
; 	return I2C_CRR;
	ldi R16,1
	ldi R17,0
	xcall _delay_ms
	.dbline -2
L17:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r a 20 c
	.dbsym r data 20 c
	.dbend
	.dbfunc e lcd_init _lcd_init fV
	.even
_lcd_init::
	.dbline -1
	.dbline 86
; 	}
; 
; /**********************************
; *          写入时钟函数			  *
; **********************************/
	.dbline 87
; uchar write_timer(void)
	ldi R16,2
	ldi R17,0
	xcall _delay_ms
	.dbline 88
;     {
	ldi R16,32
	xcall _lcd_comm_b
	.dbline 89
; 	start();		 	 	          //启动总线
	ldi R16,400
	ldi R17,1
	xcall _delay_us
	.dbline 90
; 	waitack();						  //等待启动完成
	ldi R16,40
	xcall _lcd_comm
	.dbline 91
; 	if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
	ldi R16,200
	ldi R17,0
	xcall _delay_us
	.dbline 92
; 	write_tim(SLA_W);				  //发送写地址
	ldi R16,12
	xcall _lcd_comm
	.dbline 93
; 	write_tim(0x00);				  //写数据首地址
	ldi R16,200
	ldi R17,0
	xcall _delay_us
	.dbline 94
; 	write_tim(0x20);				  //写控制/状态寄存器1,暂停计时
	ldi R16,6
	xcall _lcd_comm
	.dbline 95
; 	write_tim(0x00);				  //写控制/状态寄存器2
	ldi R16,100
	ldi R17,0
	xcall _delay_us
	.dbline 96
; 	write_tim(0x00);				  //写秒数据为0
	ldi R16,1
	xcall _lcd_comm
	.dbline 97
; 	write_tim(timer[1]);			  //写分数据
	ldi R16,10
	ldi R17,0
	xcall _delay_ms
	.dbline -2
L18:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e cls _cls fV
	.even
_cls::
	.dbline -1
	.dbline 102
; 	write_tim(timer[2]);			  //写时数据
; 	write_tim(timer[3]);			  //写日数据
; 	write_tim(timer[4]);			  //写周数据
; 	write_tim(timer[5]);			  //写月数据
; 	write_tim(timer[6]);			  //写年数据
	.dbline 103
; 	stop();
	ldi R16,1
	xcall _lcd_comm
	.dbline 104
; 	return I2C_CRR;
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
	.dbline -2
L19:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e locate _locate fV
;              x -> R20
;              b -> R22
;              a -> R10
	.even
_locate::
	xcall push_gset3
	mov R22,R18
	mov R10,R16
	.dbline -1
	.dbline 109
; 	}
; 	
; /**********************************
; *          启动时钟函数			  *
; **********************************/
	.dbline 111
; uchar start_timer(void)
;     {
	mov R24,R10
	cpi R24,1
	brne L21
	.dbline 112
; 	start();		 	 	          //启动总线
	mov R20,R22
	subi R20,128    ; addi 128
	subi R20,1
L21:
	.dbline 113
; 	waitack();						  //等待启动完成
	mov R24,R10
	cpi R24,2
	brne L23
	.dbline 114
; 	if(chkack()!=START)return I2C_ERR;		  //检查是否启动成功
	mov R20,R22
	subi R20,64    ; addi 192
	subi R20,1
L23:
	.dbline 115
; 	write_tim(SLA_W);				  //发送写地址
	mov R16,R20
	xcall _lcd_comm
	.dbline 116
; 	write_tim(0x00);				  //写数据首地址
	ldi R16,5
	ldi R17,0
	xcall _delay_ms
	.dbline -2
L20:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r x 20 c
	.dbsym r b 22 c
	.dbsym r a 10 c
	.dbend
	.dbfunc e lcd _lcd fV
;              i -> R20
	.even
_lcd::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 121
; 	write_tim(0x00);				  //写控制/状态寄存器1,暂停计时
; 	stop();
; 	return I2C_CRR;
; 	}
; 
	.dbline 122
; /**********************************
	mov R16,R20
	xcall _lcd_da
	.dbline -2
L25:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e xs_lcd _xs_lcd fV
;              s -> R20,R21
	.even
_xs_lcd::
	xcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 130
; *   将时钟数据转换后在LCD上显示	  *
; **********************************/ 
; void timer_lcd(void)
;     {
; 	locate(1,4);			 	 	 //写指令:第1行第4列地址
; 
; 	lcd_da((timer[7]>>4)+0x30);
; 	lcd_da((timer[7]&0x0f)+0x30);
	xjmp L28
L27:
	.dbline 132
	.dbline 133
	movw R30,R20
	ldd R16,z+0
	xcall _lcd
	.dbline 134
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 135
L28:
	.dbline 131
; 	lcd_da((timer[6]>>4)+0x30);		 //显示年
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L27
	.dbline -2
L26:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbend
	.dbfunc e tonghe _tonghe fV
	.even
_tonghe::
	.dbline -1
	.dbline 144
; 	lcd_da((timer[6]&0x0f)+0x30);
; 	lcd_da('/');
; 	lcd_da((timer[5]>>4)+0x30);		 //显示月
; 	lcd_da((timer[5]&0x0f)+0x30);
; 	lcd_da('/');
; 	lcd_da((timer[3]>>4)+0x30);		 //显示日
; 	lcd_da((timer[3]&0x0f)+0x30);
; 
; 	locate(2,2);			 		 //写指令:第2行地址
;    
;    	lcd_da((timer[2]>>4)+0x30);		 //时
; 	lcd_da((timer[2]&0x0f)+0x30);
; 	lcd_da(':');
	.dbline 145
; 	lcd_da((timer[1]>>4)+0x30);		 //分
	xcall _cls
	.dbline 146
; 	lcd_da((timer[1]&0x0f)+0x30);
	ldi R18,5
	ldi R16,1
	xcall _locate
	.dbline 147
; 	lcd_da(':');   
	ldi R16,<L31
	ldi R17,>L31
	xcall _xs_lcd
	.dbline 148
; 	lcd_da((timer[0]>>4)+0x30);		 //秒
	ldi R18,1
	ldi R16,2
	xcall _locate
	.dbline 149
; 	lcd_da((timer[0]&0x0f)+0x30);
	ldi R16,<L32
	ldi R17,>L32
	xcall _xs_lcd
	.dbline -2
L30:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfile D:\PCF8563\1602_time\TWI_8563.h
	.dbfunc e Twi_Init _Twi_Init fV
	.even
_Twi_Init::
	.dbline -1
	.dbline 56
	.dbline 57
	ldi R24,14
	out 0x0,R24
	.dbline 58
	clr R2
	out 0x1,R2
	.dbline -2
L33:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e write_tim _write_tim fc
;              a -> R16
	.even
_write_tim::
	.dbline -1
	.dbline 63
	.dbline 64
	.dbline 64
	out 0x3,R16
	.dbline 64
	ldi R24,132
	out 0x36,R24
	.dbline 64
	.dbline 64
	.dbline 65
L35:
	.dbline 65
L36:
	.dbline 65
	in R2,0x36
	sbrs R2,7
	rjmp L35
	.dbline 65
	.dbline 65
	.dbline 66
	in R24,0x1
	andi R24,248
	cpi R24,24
	breq L38
	.dbline 66
	clr R16
	xjmp L34
L38:
	.dbline 67
	ldi R16,1
	.dbline -2
L34:
	.dbline 0 ; func end
	ret
	.dbsym r a 16 c
	.dbend
	.dbfunc e read_tim _read_tim fc
	.even
_read_tim::
	.dbline -1
	.dbline 71
	.dbline 72
	ldi R24,196
	out 0x36,R24
	.dbline 73
L41:
	.dbline 73
L42:
	.dbline 73
	in R2,0x36
	sbrs R2,7
	rjmp L41
	.dbline 73
	.dbline 73
	.dbline 74
	in R24,0x1
	andi R24,248
	cpi R24,80
	breq L44
	.dbline 74
	clr R16
	xjmp L40
L44:
	.dbline 77
	in R16,0x3
	.dbline -2
L40:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfile D:\PCF8563\1602_time\1602_8563.c
	.dbfunc e spk _spk fV
;              a -> R10,R11
;              n -> R20
;              i -> R22
	.even
_spk::
	xcall push_gset3
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 35
	.dbline 37
	xjmp L50
L47:
	.dbline 38
	.dbline 39
	ldi R24,10
	mul R24,R22
	movw R10,R0
	.dbline 40
	xjmp L54
L51:
	.dbline 41
	.dbline 42
	ldi R16,500
	ldi R17,1
	xcall _delay_us
	.dbline 43
	ldi R24,64
	in R2,0x12
	eor R2,R24
	out 0x12,R2
	.dbline 44
	ldi R16,500
	ldi R17,1
	xcall _delay_us
	.dbline 45
	ldi R24,64
	in R2,0x12
	eor R2,R24
	out 0x12,R2
	.dbline 46
L52:
	.dbline 40
	movw R24,R10
	sbiw R24,1
	movw R10,R24
L54:
	.dbline 40
	tst R10
	brne L51
	tst R11
	brne L51
X3:
	.dbline 47
	cbi 0x12,6
	.dbline 48
	ldi R16,100
	ldi R17,0
	xcall _delay_ms
	.dbline 49
L48:
	.dbline 37
	dec R20
L50:
	.dbline 37
	tst R20
	brne L47
	.dbline -2
L46:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r a 10 i
	.dbsym r n 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e read_timer _read_timer fc
	.even
_read_timer::
	.dbline -1
	.dbline 56
	.dbline 57
	ldi R24,164
	out 0x36,R24

⌨️ 快捷键说明

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