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

📄 iic.s

📁 AVR单片机对DS3231的读写操作源代码
💻 S
字号:
	.module IIC.C
	.area text(rom, con, rel)
	.dbfile F:\ouravr\ds3231\IIC.C
	.dbfunc e DelayMs _DelayMs fV
;          count -> R20,R21
;              i -> R16
	.even
_DelayMs::
	rcall push_gset1
	.dbline -1
	.dbline 18
; #include <iom16v.h>
; #include <macros.h>
; #define uchar unsigned char 
; #define uint  unsigned int
; 
; void DelayUs(uchar i);
; void CLK(uchar PD);//设置SCL的电平
; void IO(uchar PD);//设置IO的电平
; void SetIO(uchar i);//设置IO为输入输出
; 
; //IIC读写函数供外部main函数调用
; void Write24c02_OneByte(unsigned char addr,unsigned char ddata);
; unsigned char Read24c02_OneByte(unsigned char addr);
; void WriteDs3231_OneByte(unsigned char addr,unsigned char ddata);
; unsigned char ReadDs3231_OneByte(unsigned char addr); 
; 
; void DelayMs(uchar i)
; {
	.dbline 20
	rjmp L5
L2:
	.dbline 20
	ldi R20,100
	ldi R21,0
	rjmp L9
L6:
	.dbline 20
L7:
	.dbline 20
	subi R20,1
	sbci R21,0
L9:
	.dbline 20
	cpi R20,0
	cpc R20,R21
	brne L6
X0:
L3:
	.dbline 20
	dec R16
L5:
	.dbline 20
;  uint count;
;  for(;i!=0;i--)for(count=100;count!=0;count--);
	tst R16
	brne L2
	.dbline -2
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r count 20 i
	.dbsym r i 16 c
	.dbend
	.dbfunc e CLK _CLK fV
;             PD -> R16
	.even
_CLK::
	.dbline -1
	.dbline 24
; }
; //设置SCL的电平
; void CLK(uchar PD) 
; {if(PD==1) PORTD|=0x08;//SCL置1
	.dbline 24
	cpi R16,1
	brne L11
	.dbline 24
	sbi 0x12,3
	rjmp L12
L11:
	.dbline 25
	cbi 0x12,3
L12:
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbsym r PD 16 c
	.dbend
	.dbfunc e IO _IO fV
;             PD -> R16
	.even
_IO::
	.dbline -1
	.dbline 29
;  else       PORTD&=~0x08;//SCL置0
; }
; //设置IO的电平
; void IO(uchar PD) 
; {if(PD==1) PORTD|=0x04;//IO置1
	.dbline 29
	cpi R16,1
	brne L14
	.dbline 29
	sbi 0x12,2
	rjmp L15
L14:
	.dbline 30
	cbi 0x12,2
L15:
	.dbline -2
L13:
	.dbline 0 ; func end
	ret
	.dbsym r PD 16 c
	.dbend
	.dbfunc e Start _Start fV
	.even
_Start::
	.dbline -1
	.dbline 38
;  else       PORTD&=~0x04;//IO置0
; }
; 
; 
; /////////////////////////////////
; //IIC
; //*******************Start条件****************//
; void Start(void)
; {
	.dbline 39
;  CLK(0);DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 39
	ldi R16,2
	rcall _DelayMs
	.dbline 40
;  IO(1); DelayMs(2);
	ldi R16,1
	rcall _IO
	.dbline 40
	ldi R16,2
	rcall _DelayMs
	.dbline 41
;  CLK(1);DelayMs(2);
	ldi R16,1
	rcall _CLK
	.dbline 41
	ldi R16,2
	rcall _DelayMs
	.dbline 42
;  IO(0); DelayMs(2);
	clr R16
	rcall _IO
	.dbline 42
	ldi R16,2
	rcall _DelayMs
	.dbline 43
;  CLK(0);DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 43
	ldi R16,2
	rcall _DelayMs
	.dbline -2
L16:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Stop _Stop fV
	.even
_Stop::
	.dbline -1
	.dbline 48
; }
; 
; //*******************Stop条件****************//
; void Stop(void)
; {
	.dbline 49
;  CLK(0);  DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 49
	ldi R16,2
	rcall _DelayMs
	.dbline 50
;  IO(0);   DelayMs(2);
	clr R16
	rcall _IO
	.dbline 50
	ldi R16,2
	rcall _DelayMs
	.dbline 51
;  CLK(1);  DelayMs(2);
	ldi R16,1
	rcall _CLK
	.dbline 51
	ldi R16,2
	rcall _DelayMs
	.dbline 52
;  IO(1);   DelayMs(2);
	ldi R16,1
	rcall _IO
	.dbline 52
	ldi R16,2
	rcall _DelayMs
	.dbline 53
;  CLK(0);  DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 53
	ldi R16,2
	rcall _DelayMs
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SendData _SendData fV
;          count -> R20
;          Xdata -> R22
	.even
_SendData::
	rcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 57
; }
; //********************发送数据************//
; void SendData(uchar Xdata)  
; {uchar count;
	.dbline 58
;  for(count=0;count!=8;count++)
	clr R20
	rjmp L22
L19:
	.dbline 59
;  	{
	.dbline 60
; 	 CLK(0); DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 60
	ldi R16,2
	rcall _DelayMs
	.dbline 61
; 	 if(Xdata&0x80) 
	sbrs R22,7
	rjmp L23
	.dbline 62
; 	  IO(1);
	ldi R16,1
	rcall _IO
	rjmp L24
L23:
	.dbline 64
; 	 else 
; 	  IO(0);
	clr R16
	rcall _IO
L24:
	.dbline 65
	ldi R16,2
	rcall _DelayMs
	.dbline 66
	ldi R16,1
	rcall _CLK
	.dbline 66
	ldi R16,2
	rcall _DelayMs
	.dbline 67
	lsl R22
	.dbline 68
L20:
	.dbline 58
	inc R20
L22:
	.dbline 58
	cpi R20,8
	brne L19
	.dbline 70
; 	 DelayMs(2);
; 	 CLK(1); DelayMs(2);
; 	 Xdata<<=1;
; 	}
; 	//以下把SDA置1释放总线
;  CLK(0);DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 70
	ldi R16,2
	rcall _DelayMs
	.dbline 71
;  CLK(1);DelayMs(2);
	ldi R16,1
	rcall _CLK
	.dbline 71
	ldi R16,2
	rcall _DelayMs
	.dbline 72
;  CLK(0);DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 72
	ldi R16,2
	rcall _DelayMs
	.dbline -2
L18:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r count 20 c
	.dbsym r Xdata 22 c
	.dbend
	.dbfunc e ReceiveData _ReceiveData fc
;          value -> R20
;           temp -> R22
;          count -> R10
	.even
_ReceiveData::
	rcall push_gset3
	.dbline -1
	.dbline 76
; }
; /////////////接收数据///////////////////
; uchar  ReceiveData(void)  
; {
	.dbline 79
;  uchar count;
;  uchar temp;
;  uchar value=0;
	clr R20
	.dbline 80
;  DDRD&=~0x04;//设置为输入
	cbi 0x11,2
	.dbline 81
;   for(count=0;count!=8;count++)
	clr R10
	rjmp L29
L26:
	.dbline 82
;  	{
	.dbline 83
; 	 value<<=1;
	lsl R20
	.dbline 84
; 	 CLK(1); DelayMs(2);
	ldi R16,1
	rcall _CLK
	.dbline 84
	ldi R16,2
	rcall _DelayMs
	.dbline 85
; 	 temp=PIND;//读引脚
	in R22,0x10
	.dbline 86
; 	 if((temp&0x04)==0x04) value++;
	mov R24,R22
	andi R24,4
	cpi R24,4
	brne L30
	.dbline 86
	inc R20
L30:
	.dbline 87
	ldi R16,2
	rcall _DelayMs
	.dbline 88
	clr R16
	rcall _CLK
	.dbline 88
	ldi R16,2
	rcall _DelayMs
	.dbline 89
L27:
	.dbline 81
	inc R10
L29:
	.dbline 81
	mov R24,R10
	cpi R24,8
	brne L26
	.dbline 90
; 	 DelayMs(2);
; 	 CLK(0); DelayMs(2);
; 	}
;  DDRD|=0x04;//设置为输出
	sbi 0x11,2
	.dbline 92
;  //以下输出NOACK
;  CLK(0);DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 92
	ldi R16,2
	rcall _DelayMs
	.dbline 93
;  IO(1);DelayMs(2);
	ldi R16,1
	rcall _IO
	.dbline 93
	ldi R16,2
	rcall _DelayMs
	.dbline 94
;  CLK(1);DelayMs(2);
	ldi R16,1
	rcall _CLK
	.dbline 94
	ldi R16,2
	rcall _DelayMs
	.dbline 95
;  CLK(0);DelayMs(2);
	clr R16
	rcall _CLK
	.dbline 95
	ldi R16,2
	rcall _DelayMs
	.dbline 96
;  return value;
	mov R16,R20
	.dbline -2
L25:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r value 20 c
	.dbsym r temp 22 c
	.dbsym r count 10 c
	.dbend
	.dbfunc e Write24c02_OneByte _Write24c02_OneByte fV
;          ddata -> R20
;           addr -> R22
	.even
_Write24c02_OneByte::
	rcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 103
; }
; 
; //////////////以下供main调用/////////////////
; 
; //向addr写一个数据
; void Write24c02_OneByte(unsigned char addr,unsigned char ddata)
; {
	.dbline 105
; 
;     Start();
	rcall _Start
	.dbline 106
; 	SendData(0xa0);//器件寻址
	ldi R16,160
	rcall _SendData
	.dbline 107
; 	SendData(addr);//存储器寻址
	mov R16,R22
	rcall _SendData
	.dbline 108
; 	SendData(ddata);//写入数据
	mov R16,R20
	rcall _SendData
	.dbline 109
; 	Stop();
	rcall _Stop
	.dbline 110
; 	DelayMs(2000);
	ldi R16,208
	rcall _DelayMs
	.dbline -2
L32:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r ddata 20 c
	.dbsym r addr 22 c
	.dbend
	.dbfunc e Read24c02_OneByte _Read24c02_OneByte fc
;           temp -> R20
;           addr -> R20
	.even
_Read24c02_OneByte::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 115
; }
; ///////////////////////////////
; //从addr读一个数据
; unsigned char Read24c02_OneByte(unsigned char addr)
; {
	.dbline 117
;     uchar temp;
;     Start();
	rcall _Start
	.dbline 118
; 	SendData(0xa0);//器件寻址
	ldi R16,160
	rcall _SendData
	.dbline 119
; 	SendData(addr);//存储器寻址
	mov R16,R20
	rcall _SendData
	.dbline 120
; 	Start();
	rcall _Start
	.dbline 121
;     SendData(0xa1);   //设置读
	ldi R16,161
	rcall _SendData
	.dbline 122
; 	temp = ReceiveData();//读取数据
	rcall _ReceiveData
	mov R20,R16
	.dbline 123
; 	Stop();
	rcall _Stop
	.dbline 124
; 	DelayMs(2000);
	ldi R16,208
	rcall _DelayMs
	.dbline 125
; 	return temp;    
	mov R16,R20
	.dbline -2
L33:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r addr 20 c
	.dbend
	.dbfunc e WriteDs3231_OneByte _WriteDs3231_OneByte fV
;          ddata -> R20
;           addr -> R22
	.even
_WriteDs3231_OneByte::
	rcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 129
; 
; }
; void WriteDs3231_OneByte(unsigned char addr,unsigned char ddata)
; { 
	.dbline 130
;     Start();
	rcall _Start
	.dbline 131
;  SendData(0xd0);//器件寻址
	ldi R16,208
	rcall _SendData
	.dbline 132
;  SendData(addr);//存储器寻址
	mov R16,R22
	rcall _SendData
	.dbline 133
;  SendData(ddata);//写入数据
	mov R16,R20
	rcall _SendData
	.dbline 134
;  Stop();
	rcall _Stop
	.dbline 135
;  DelayMs(2000);
	ldi R16,208
	rcall _DelayMs
	.dbline -2
L34:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r ddata 20 c
	.dbsym r addr 22 c
	.dbend
	.dbfunc e ReadDs3231_OneByte _ReadDs3231_OneByte fc
;           temp -> R20
;           addr -> R20
	.even
_ReadDs3231_OneByte::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 140
; }
; ///////////////////////////////
; //从addr读一个数据
; unsigned char ReadDs3231_OneByte(unsigned char addr)
; {
	.dbline 142
;     uchar temp;
;     Start();
	rcall _Start
	.dbline 143
;  SendData(0xd0);//器件寻址
	ldi R16,208
	rcall _SendData
	.dbline 144
;  SendData(addr);//存储器寻址
	mov R16,R20
	rcall _SendData
	.dbline 145
;  Start();
	rcall _Start
	.dbline 146
;     SendData(0xd1);   //设置读
	ldi R16,209
	rcall _SendData
	.dbline 147
;  temp = ReceiveData();//读取数据
	rcall _ReceiveData
	mov R20,R16
	.dbline 148
;  Stop();
	rcall _Stop
	.dbline 149
;  DelayMs(2000);
	ldi R16,208
	rcall _DelayMs
	.dbline 150
;  return temp;    
	mov R16,R20
	.dbline -2
L35:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r temp 20 c
	.dbsym r addr 20 c
	.dbend

⌨️ 快捷键说明

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