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

📄 8563.s

📁 基于ATMEGA16的时钟芯片原代码
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module _8563.c
	.area text(rom, con, rel)
	.dbfile H:\bbi项目源程序\8563时钟芯片/lcd.h
	.dbfunc e delay _delay fV
;              i -> R20
;              n -> R16
	.even
_delay::
	xcall push_gset1
	.dbline -1
	.dbline 6
; /////////////////////////////////////////////////////////////
; //  文件:RT_PCF8563.C                                     //
; //  环境:编译为ICC AVR6.31A,仿真为AVR Studio4.12sp4      //
; //  硬件:ATMEGA16芯片                                     //
; //  日期:2007年5月28日                                    //
; //  功能:在LCD12864液晶屏显示时间                         //
	.dbline 8
; //  备注:                                                 //
; /////////////////////////////////////////////////////////////
	clr R20
	xjmp L5
L2:
	.dbline 9
	.dbline 9
	nop
	.dbline 9
L3:
	.dbline 8
	inc R20
L5:
	.dbline 8
	cp R20,R16
	brlo L2
	.dbline -2
L1:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r n 16 c
	.dbend
	.dbfunc e lcd_out _lcd_out fV
;              i -> R20
;      send_byte -> R22
	.even
_lcd_out::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 15
; #include <iom16v.h>				//包含单片机型号头文件
; #include <macros.h>				//包含"位"操作头文件
; //#include "AVR_XQV12.h"
; #include "lcd.h"
; #include "delay.h"				//包含延时头文件
; 
; #define 	rd_device_add 	0xa3			//定义器件读地址
	.dbline 17
; #define 	wr_device_add 	0xa2			//定义器件写地址
; #define 	START 			0x08
	clr R20
	xjmp L10
L7:
	.dbline 18
; #define 	MT_SLA_ACK 		0x18
	.dbline 19
; #define 	MT_DATA_ACK 	0x28
	sbrc R22,7
	rjmp L11
	.dbline 20
; #define 	RE_START 		0x10
	.dbline 21
; #define 	MR_SLA_ACK 		0x40
	cbi 0x1b,1
	.dbline 22
; #define 	MR_DATA_NOACK 	0x58
	xjmp L12
L11:
	.dbline 24
; #define 	MR_DATA_ACK 	0x50
; #define 	START 		   	0x08
	.dbline 25
; #define 	MT_SLA_ACK 	   	0x18
	sbi 0x1b,1
	.dbline 26
; #define 	MT_DATA_ACK    	0x28
L12:
	.dbline 27
	cbi 0x1b,3
	.dbline 28
	sbi 0x1b,3
	.dbline 29
	lsl R22
	.dbline 30
L8:
	.dbline 17
	inc R20
L10:
	.dbline 17
	cpi R20,8
	brlo L7
	.dbline 31
; #define 	RE_START 	   	0x10
; #define 	MR_SLA_ACK 	   	0x40
; #define 	MR_DATA_NOACK  	0x58
; 
; unsigned char read_shijian[7]={0x02,0x21,0x16,0x24,0x00,0x12,0x27};
	ldi R16,0
	xcall _delay
	.dbline -2
L6:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r send_byte 22 c
	.dbend
	.dbfunc e WR_dat _WR_dat fV
;              s -> R20
;            dat -> R22
	.even
_WR_dat::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 36
; unsigned char write_shijian[7]={0x00,0x48,0x10,0x10,0x00,0x06,0x07};
; 
; unsigned char temp[3];
; 
; 
	.dbline 38
; /*******************************************************/
; /******   TWI总线操作函数                         ******/
	mov R20,R22
	andi R20,240
	.dbline 39
; /******   Start():    总线起始命令               ******/
	ldi R16,250
	xcall _lcd_out
	.dbline 40
; /******   Wait():     等待命令                   ******/
	mov R16,R20
	xcall _lcd_out
	.dbline 41
; /******   TestAck():  测试应答                   ******/
	mov R20,R22
	andi R20,15
	.dbline 42
; /******   Write8Bit():写8位数据                  ******/
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 43
; /******   Stop():     总线结束命令               ******/
	mov R16,R24
	xcall _lcd_out
	.dbline -2
L13:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r s 20 c
	.dbsym r dat 22 c
	.dbend
	.dbfunc e WR_control _WR_control fV
;              s -> R20
;            dat -> R22
	.even
_WR_control::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 47
; /******   Ack():      应答信号                   ******/
; /******   Twi():      总线使能                   ******/
; /*******************************************************/
; void Start(void)
	.dbline 49
; {TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);}
; void Wait(void)
	mov R20,R22
	andi R20,240
	.dbline 50
; {while((TWCR&0x80)!=0x80);}
	ldi R16,248
	xcall _lcd_out
	.dbline 51
; unsigned char TestAck(void)
	mov R16,R20
	xcall _lcd_out
	.dbline 52
; {unsigned char twsr;twsr=TWSR&0xf8;return twsr;}
	mov R20,R22
	andi R20,15
	.dbline 53
; void Write8Bit(unsigned char data)
	mov R24,R20
	andi R24,#0x0F
	swap R24
	mov R20,R24
	.dbline 54
; {TWDR=data;TWCR=(1<<TWINT)|(1<<TWEN);}
	mov R16,R24
	xcall _lcd_out
	.dbline -2
L14:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r s 20 c
	.dbsym r dat 22 c
	.dbend
	.dbfunc e lcd_control _lcd_control fV
	.even
_lcd_control::
	.dbline -1
	.dbline 58
; void Stop(void)
; {TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);}
; void Ack(void)
; {TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);}
	.dbline 59
;  void Twi(void)
	ldi R16,48
	xcall _WR_control
	.dbline 60
; {TWCR=(1<<TWINT)|(1<<TWEN);}
	ldi R16,12
	xcall _WR_control
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_clear _lcd_clear fV
;              i -> R20,R21
	.even
_lcd_clear::
	xcall push_gset1
	.dbline -1
	.dbline 64
; /*#####################################################*/
; /*******************************************************/
; /******   函数名称: i2c_Write()                   ******/
; /******   功    能: 向I2C总线写数据               ******/
	.dbline 66
; /******   参    数: command--数据内容             ******/
; /******             RomAddress--目标地址          ******/
	ldi R16,1
	xcall _WR_control
	.dbline 67
; /******   返回值  : 无                            ******/
	clr R20
	clr R21
L17:
	.dbline 68
	.dbline 69
	nop
	.dbline 70
	nop
	.dbline 72
L18:
	.dbline 67
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 67
	cpi R20,136
	ldi R30,19
	cpc R21,R30
	brlt L17
	.dbline -2
L16:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 I
	.dbend
	.dbfunc e LCD_address _LCD_address fV
;        address -> R20
;              y -> R22
;              x -> R20
	.even
_LCD_address::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 81
; /*******************************************************/
; unsigned char i2c_Write(unsigned char command,unsigned char RomAddress)
; {
; 	Start();  					 	  		//发总线起始命令
; 	Wait();									//等待应答
; 	if(TestAck()!=START)return 1;			//测试应答
; 	Write8Bit(wr_device_add);  				//写器件地址
; 	Wait();									//等待应答
; 	if(TestAck()!=MT_SLA_ACK)return 2;		//测试应答
; 	Write8Bit(RomAddress);					//写器件内的寄存器地址
; 	Wait();									//等待应答
; 	if(TestAck()!=MT_DATA_ACK)return 3;		//测试应答
; 	Write8Bit(command);				 		//写命令
; 	Wait();									//等待应答
	.dbline 83
; 	if(TestAck()!=MT_DATA_ACK)return 4;		//测试应答
; 	Stop();							 		//停止总线
	clr R21
	cpi R20,0
	cpc R20,R21
	breq L25
X0:
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L26
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L27
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L28
	xjmp L22
X1:
	.dbline 84
; 	delay_nms(10);							//延时
L25:
	.dbline 86
; 	return 0;								
; }
	mov R20,R22
	subi R20,128    ; addi 128
	.dbline 87
; /*******************************************************/
	xjmp L23
L26:
	.dbline 89
; /******   函数名称: i2c_WriteData()               ******/
; /******   功    能: 向I2C总线连续写入7个数据      ******/
	mov R20,R22
	subi R20,112    ; addi 144
	.dbline 90
; /******   参    数: RomAddress--目标起始寄存器    ******/
	xjmp L23
L27:
	.dbline 92
; /******   返回值  : 无                            ******/
; /*******************************************************/
	mov R20,R22
	subi R20,120    ; addi 136
	.dbline 93
; unsigned char i2c_WriteData(unsigned char RomAddress)
	xjmp L23
L28:
	.dbline 95
; {
;  	unsigned char i;
	mov R20,R22
	subi R20,104    ; addi 152
	.dbline 96
; 	Start(); 	  					 	  	//发总线起始命令
	xjmp L23
L22:
	.dbline 97
; 	Wait();									//等待应答
	mov R20,R22
	subi R20,128    ; addi 128
	.dbline 98
; 	if(TestAck()!=START)return 1;			//测试应答
L23:
	.dbline 99
; 	Write8Bit(wr_device_add);  				//写器件地址
	mov R16,R20
	xcall _WR_control
	.dbline -2
L21:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r address 20 c
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e LCD_Write_string _LCD_Write_string fV
;              s -> R20,R21
;              Y -> R10
;              X -> R22
	.even
_LCD_Write_string::
	xcall push_gset3
	mov R10,R18
	mov R22,R16
	ldd R20,y+6
	ldd R21,y+7
	.dbline -1
	.dbline 110
; 	Wait();					   				//等待应答
; 	if(TestAck()!=MT_SLA_ACK)return 2;		//测试应答
; 	Write8Bit(RomAddress);					//写器件内的寄存器地址
; 	Wait();									//等待应答
; 	if(TestAck()!=MT_DATA_ACK)return 3;		//测试应答
; 	for(i=0;i<7;i++)				 		//循环7次
; 	{										
; 	 	Write8Bit(write_shijian[i]);		//写数据
; 		Wait();								//等待应答
; 		if(TestAck()!=MT_DATA_ACK)return 4;	//测试应答
; 	}									 	
	.dbline 112
; 	Stop();									//停止总线
; 	delay_nms(10);							//延时
	mov R18,R10
	mov R16,R22
	xcall _LCD_address
	xjmp L31
L30:
	.dbline 114
	.dbline 115
	movw R30,R20
	ldd R16,z+0
	xcall _WR_dat
	.dbline 116
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 117
L31:
	.dbline 113
; 	return 0;								
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L30
	.dbline -2
L29:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r Y 10 c
	.dbsym r X 22 c
	.dbend
	.dbfunc e BCD_ASCII _BCD_ASCII fc
;            bcd -> R16
	.even
_BCD_ASCII::
	.dbline -1
	.dbline 129
; }
; /*******************************************************/
; /******   函数名称: i2c_Read()                    ******/
; /******   功    能: 连续读取I2C总线               ******/
; /******   参    数: RomAddress--目标寄存器        ******/
; /******   返回值  : 读出的数据                    ******/
; /*******************************************************/   
; unsigned char i2c_Read(unsigned char RomAddress)
; {
;  	unsigned char i;
; 	Start(); 	  					 		//发总线起始命令
; 	Wait();									//等待应答
; 	if(TestAck()!=START)return 1;			//测试应答
; 	Write8Bit(wr_device_add);  				//写器件地址
; 	Wait();									//等待应答
; 	if(TestAck()!=MT_SLA_ACK)return 2;		//测试应答
	.dbline 130
; 	Write8Bit(RomAddress);					//写器件内的寄存器地址
	andi R16,15
	.dbline 131
; 	Wait();									//等待应答
	ldi R24,9
	cp R24,R16
	brsh L34
	.dbline 132
; 	if(TestAck()!=MT_DATA_ACK)return 3;		//测试应答
	subi R16,201    ; addi 55
	xjmp L35
L34:
	.dbline 134
; 	Start();						 		//重新发总线起始命令
; 	Wait();									//等待应答
	subi R16,208    ; addi 48
L35:
	.dbline 135
; 	if(TestAck()!=RE_START)return 4;		//测试应答
	.dbline -2
L33:
	.dbline 0 ; func end
	ret
	.dbsym r bcd 16 c
	.dbend
	.dbfunc e LCD_writeasc _LCD_writeasc fV
;           data -> y+4
;              y -> R22
;              x -> R20
	.even
_LCD_writeasc::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 140
; 	Write8Bit(rd_device_add);	  			//写器件地址
; 	Wait();									//等待应答
; 	if(TestAck()!=MR_SLA_ACK)return 5;		//测试应答
; 	for(i=0;i<7;i++)						
; 	{										
	.dbline 141
; 	 	Ack();								//发送应答信号
	mov R18,R22
	mov R16,R20
	xcall _LCD_address
	.dbline 142
; 		Wait();								//等待应答
	ldd R16,y+4
	xcall _WR_dat
	.dbline -2
L36:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l data 4 c
	.dbsym r y 22 c
	.dbsym r x 20 c
	.dbend
	.dbfunc e Lcd_INT _Lcd_INT fV
	.even
_Lcd_INT::
	.dbline -1
	.dbline 146
; 		if(TestAck()!=MR_DATA_ACK)return 6;	//测试应答
; 		read_shijian[i]=TWDR;			 	//将读取的数据放入数组中
; 	}										
; 	Stop();									//停止总线
	.dbline 147
; 	return 0;								
	sbi 0x1a,1
	.dbline 148
; }
	sbi 0x1a,3
	.dbline 149
; /*******************************************************/
	xcall _lcd_control
	.dbline -2
L37:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_writechar _lcd_writechar fV
;         number -> y+4
;              Y -> R22
;              X -> R20
	.even
_lcd_writechar::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 153
; /******   函数名称: ToStr()                       ******/
; /******   功    能: 整数转换成字符串              ******/
; /******   参    数: c--要转换的数据               ******/
; /******   返回值  : 无                            ******/
	.dbline 154
; /*******************************************************/  
	mov R18,R22
	mov R16,R20
	xcall _LCD_address
	.dbline 155
; void ToStr(unsigned char c)
	ldd R16,y+4
	swap R16
	andi R16,#0x0F
	xcall _BCD_ASCII
	xcall _WR_dat
	.dbline 156

⌨️ 快捷键说明

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