📄 iic.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 + -