📄 rtc.s
字号:
.module RTC.C
.area data(ram, con, rel)
_Table::
.blkb 2
.area idata
.byte 63,6
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 91,'O
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 'f,'m
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 125,7
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 127,'o
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 56,'v
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
.dbsym e Table _Table A[12:12]c
_Data::
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
.blkb 2
.area idata
.byte 0,0
.area data(ram, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
.dbsym e Data _Data A[4:4]c
.area text(rom, con, rel)
.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
.dbfunc e DelayMs _DelayMs fV
; j -> R20
; i -> R16
.even
_DelayMs::
rcall push_gset1
.dbline -1
.dbline 18
; //***************************FileName:RTC.C************************//
; //***************************ICCAVR V6.30编译**********************//
;
; #include <io8535v.h> //寄存器定义文件
; #include <macros.h> //使用到宏
; #define uchar unsigned char //数据类型定义
; #define uint unsigned char //数据类型定义
; #define SD2303 0x64 //SD2303器件IIC识别码
;
;
; uchar Table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76};
; //显示数据表 0 1 2 3 4 5 6 7 8 9 L H
; uchar Data[4]={0,0,0,0}; //DS1722
; uchar Enter_Flag; //确定
; uchar F_Flag; //数据应答标志
;
; void DelayMs(uint i) //延时函数1
; {uchar j;
.dbline 19
; for(;i!=0;i--)
rjmp L5
L2:
.dbline 20
.dbline 20
ldi R20,208
rjmp L9
L6:
.dbline 20
.dbline 20
.dbline 20
L7:
.dbline 20
dec R20
L9:
.dbline 20
tst R20
brne L6
.dbline 20
L3:
.dbline 19
dec R16
L5:
.dbline 19
tst R16
brne L2
.dbline -2
.dbline 21
; {for(j=2000;j!=0;j--) {;}}
; }
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r i 16 c
.dbend
.dbfunc e Display _Display fV
; sel -> R20
; i -> R22
; p -> R10,R11
.even
_Display::
rcall push_gset3
mov R10,R16
mov R11,R17
.dbline -1
.dbline 24
;
; void Display(uchar *p) //显示函数
; {uchar i,sel=0x00;
.dbline 24
clr R20
.dbline 25
; for(i=0;i<16;i++)
clr R22
rjmp L14
L11:
.dbline 26
.dbline 26
out 0x15,R20
.dbline 27
mov R30,R22
clr R31
add R30,R10
adc R31,R11
ldd R30,z+0
clr R31
ldi R24,<_Table
ldi R25,>_Table
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x1b,R2
.dbline 28
ldi R16,10
rcall _DelayMs
.dbline 29
lsl R20
.dbline 30
L12:
.dbline 25
inc R22
L14:
.dbline 25
cpi R22,16
brlo L11
.dbline -2
.dbline 31
; {PORTC=sel;
; PORTA=Table[p[i]];
; DelayMs(10);
; sel=sel<<1;
; }
; }
L10:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r sel 20 c
.dbsym r i 22 c
.dbsym r p 10 pc
.dbend
.dbfunc e NOPNOP _NOPNOP fV
; i -> R16
.even
_NOPNOP::
.dbline -1
.dbline 35
.dbline 35
rjmp L19
L16:
.dbline 35
nop
L17:
.dbline 35
dec R16
L19:
.dbline 35
;
;
; void NOPNOP(uchar i) //延时函数2
; {for(;i!=0;i--) NOP();}
tst R16
brne L16
.dbline -2
.dbline 35
L15:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e SetSCL _SetSCL fV
; i -> R16
.even
_SetSCL::
.dbline -1
.dbline 38
;
; void SetSCL(uchar i) //IIC时钟线SCL设置
; {if(i==1) PORTB=PORTB|0x01;
.dbline 38
cpi R16,1
brne L21
.dbline 38
sbi 0x18,0
rjmp L22
L21:
.dbline 39
in R24,0x18
andi R24,254
out 0x18,R24
L22:
.dbline -2
.dbline 39
; else PORTB=PORTB&0xFE;}
L20:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e SetSDA _SetSDA fV
; i -> R16
.even
_SetSDA::
.dbline -1
.dbline 42
;
; void SetSDA(uchar i) //IIC数据线SDA设置
; {if(i==1) PORTB=PORTB|0x02;
.dbline 42
cpi R16,1
brne L24
.dbline 42
sbi 0x18,1
rjmp L25
L24:
.dbline 43
in R24,0x18
andi R24,253
out 0x18,R24
L25:
.dbline -2
.dbline 43
; else PORTB=PORTB&0xFD;}
L23:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e Start _Start fV
.even
_Start::
.dbline -1
.dbline 51
;
; //SCL=PB^0; SD2303时钟线
; //SDA=PB^1; SD2303数据线
; //INTRB=PB^3; SD2303中断线A
; //INTRA=PB^2; SD2303中断线B
;
; void Start() //IIC总线开始信号
; {SetSDA(1);
.dbline 51
ldi R16,1
rcall _SetSDA
.dbline 52
; SetSCL(1);
ldi R16,1
rcall _SetSCL
.dbline 53
; NOPNOP(50);
ldi R16,50
rcall _NOPNOP
.dbline 54
; SetSDA(0);
clr R16
rcall _SetSDA
.dbline 55
; NOPNOP(50);
ldi R16,50
rcall _NOPNOP
.dbline 56
; SetSCL(0);
clr R16
.dbline -2
.dbline 57
; }
L26:
.dbline 0 ; func end
rjmp _SetSCL
.dbend
.dbfunc e Stop _Stop fV
.even
_Stop::
.dbline -1
.dbline 60
;
; void Stop() //IIC总线停止信号
; {SetSDA(0);
.dbline 60
clr R16
rcall _SetSDA
.dbline 61
; SetSCL(1);
ldi R16,1
rcall _SetSCL
.dbline 62
; NOPNOP(50);
ldi R16,50
rcall _NOPNOP
.dbline 63
; SetSDA(1);
ldi R16,1
rcall _SetSDA
.dbline 64
; NOPNOP(50);
ldi R16,50
rcall _NOPNOP
.dbline 65
; SetSCL(0);
clr R16
.dbline -2
.dbline 66
; }
L27:
.dbline 0 ; func end
rjmp _SetSCL
.dbend
.dbfunc e Ack _Ack fV
.even
_Ack::
.dbline -1
.dbline 69
;
; void Ack() //单片机应答信号
; {SetSDA(0);
.dbline 69
clr R16
rcall _SetSDA
.dbline 70
; SetSCL(1);
ldi R16,1
rcall _SetSCL
.dbline 71
; NOPNOP(50);
ldi R16,50
rcall _NOPNOP
.dbline 72
; SetSCL(0);
clr R16
rcall _SetSCL
.dbline 73
; SetSDA(1);
ldi R16,1
.dbline -2
.dbline 74
; }
L28:
.dbline 0 ; func end
rjmp _SetSDA
.dbend
.dbfunc e Nack _Nack fV
.even
_Nack::
.dbline -1
.dbline 77
;
; void Nack() //单片机非应答信号
; {SetSDA(1);
.dbline 77
ldi R16,1
rcall _SetSDA
.dbline 78
; SetSCL(1);
ldi R16,1
rcall _SetSCL
.dbline 79
; NOPNOP(50);
ldi R16,50
rcall _NOPNOP
.dbline 80
; SetSCL(0);
clr R16
rcall _SetSCL
.dbline 81
; SetSDA(0);
clr R16
.dbline -2
.dbline 82
; }
L29:
.dbline 0 ; func end
rjmp _SetSDA
.dbend
.dbfunc e Check_Ack _Check_Ack fV
.even
_Check_Ack::
.dbline -1
.dbline 85
;
; void Check_Ack() //器件应答信号检查
; {SetSDA(1);
.dbline 85
ldi R16,1
rcall _SetSDA
.dbline 86
; SetSCL(1);
ldi R16,1
rcall _SetSCL
.dbline 87
; F_Flag=0;
clr R2
sts _F_Flag,R2
.dbline 88
; DDRB=DDRB&0xFD;
in R24,0x17
andi R24,253
out 0x17,R24
.dbline 89
; if((PINB&0x02)==0)
sbic 0x16,1
rjmp L31
.dbline 90
; {SetSCL(0);
.dbline 90
clr R16
rcall _SetSCL
.dbline 91
; NOPNOP(50);}
ldi R16,50
rcall _NOPNOP
.dbline 91
rjmp L32
L31:
.dbline 93
; else
; {F_Flag=1;
.dbline 93
ldi R24,1
sts _F_Flag,R24
.dbline 94
; SetSCL(0);
clr R16
rcall _SetSCL
.dbline 95
; NOPNOP(50);}
ldi R16,50
rcall _NOPNOP
.dbline 95
L32:
.dbline 96
; DDRB=DDRB|0x02;
sbi 0x17,1
.dbline -2
.dbline 97
; }
L30:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Write_Bit0 _Write_Bit0 fV
.even
_Write_Bit0::
.dbline -1
.dbline 100
;
; void Write_Bit0() //向IIC总线写0
; {SetSDA(0);
.dbline 100
clr R16
rcall _SetSDA
.dbline 101
; SetSCL(1);
ldi R16,1
rcall _SetSCL
.dbline 102
; NOPNOP(50);
ldi R16,50
rcall _NOPNOP
.dbline 103
; SetSCL(0);
clr R16
.dbline -2
.dbline 104
; }
L33:
.dbline 0 ; func end
rjmp _SetSCL
.dbend
.dbfunc e Write_Bit1 _Write_Bit1 fV
.even
_Write_Bit1::
.dbline -1
.dbline 107
;
; void Write_Bit1() //向IIC总线写1
; {SetSDA(1);
.dbline 107
ldi R16,1
rcall _SetSDA
.dbline 108
; SetSCL(1);
ldi R16,1
rcall _SetSCL
.dbline 109
; NOPNOP(50);
ldi R16,50
rcall _NOPNOP
.dbline 110
; SetSCL(0);
clr R16
rcall _SetSCL
.dbline 111
; SetSDA(0);
clr R16
.dbline -2
.dbline 112
; }
L34:
.dbline 0 ; func end
rjmp _SetSDA
.dbend
.dbfunc e Write_Byte _Write_Byte fV
; i -> R20
; Data -> R22
.even
_Write_Byte::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 115
;
; void Write_Byte(uchar Data) //向IIC总线写一字节数据
; {uchar i;
.dbline 116
; for(i=0;i<8;i++)
clr R20
rjmp L39
L36:
.dbline 117
; {if((Data&0x80)>0)
.dbline 117
clr R2
mov R24,R22
andi R24,128
cp R2,R24
brsh L40
.dbline 118
; Write_Bit1();
rcall _Write_Bit1
rjmp L41
L40:
.dbline 120
; else
; Write_Bit0();
rcall _Write_Bit0
L41:
.dbline 121
lsl R22
.dbline 122
L37:
.dbline 116
inc R20
L39:
.dbline 116
cpi R20,8
brlo L36
.dbline -2
.dbline 123
; Data<<=1;
; }
; }
L35:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r Data 22 c
.dbend
.dbfunc e Read_Byte _Read_Byte fc
; j -> R20
; nn -> R22
.even
_Read_Byte::
rcall push_gset2
.dbline -1
.dbline 127
;
;
; uchar Read_Byte() //从IIC总线读一字节数据
; {uchar nn=0xff;
.dbline 127
ldi R22,255
.dbline 129
; uchar j;
; for (j=0;j<8;j++)
clr R20
rjmp L46
L43:
.dbline 130
; {SetSDA(1);
.dbline 130
ldi R16,1
rcall _SetSDA
.dbline 131
; SetSCL(1);
ldi R16,1
rcall _SetSCL
.dbline 132
; DDRB=DDRB&0xFB;
in R24,0x17
andi R24,251
out 0x17,R24
.dbline 134
;
; if((PINB&0x02)==0)
sbic 0x16,1
rjmp L47
.dbline 135
; {nn<<=1;
.dbline 135
lsl R22
.dbline 136
; nn=(nn&0xfe);
andi R22,254
.dbline 137
; SetSCL(0);}
clr R16
rcall _SetSCL
.dbline 137
rjmp L48
L47:
.dbline 139
; else
; {nn<<=1;
.dbline 139
lsl R22
.dbline 140
; nn=(nn|0x01);
ori R22,1
.dbline 141
; SetSCL(0);}
clr R16
rcall _SetSCL
.dbline 141
L48:
.dbline 142
L44:
.dbline 129
inc R20
L46:
.dbline 129
cpi R20,8
brlo L43
.dbline 143
; }
; DDRB=DDRB|0x02;
sbi 0x17,1
.dbline 144
; return(nn);
mov R16,R22
.dbline -2
L42:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r nn 22 c
.dbend
.dbfunc e Write_Nbyte _Write_Nbyte fV
; k -> R20
; Number -> R22
; Array -> R10,R11
; Address -> R12
; Slave -> R14
.even
_Write_Nbyte::
rcall push_gset5
mov R12,R18
mov R14,R16
ldd R10,y+10
ldd R11,y+11
ldd R22,y+12
.dbline -1
.dbline 154
; }
;
; //****************************写N个字节子程序**********************//
; //函数参数说明:
; //Slave:IIC器件地址,如上文定义的SD2303
; //Address:起始地址
; //Array:读数据存放的数组
; //Number:读取的字节数
; void Write_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
; {uchar k;
L50:
L51:
.dbline 156
; writ:do //开始->写IIC器件地址->检查应答位
; {Start();
.dbline 156
rcall _Start
.dbline 157
; Write_Byte(Slave);
mov R16,R14
rcall _Write_Byte
.dbline 158
; Check_Ack();
rcall _Check_Ack
.dbline 159
L52:
.dbline 159
; }while(F_Flag==1);
lds R24,_F_Flag
cpi R24,1
breq L51
L54:
.dbline 161
; do
; {Write_Byte(Address<<4); //送起始地址->检查应答位
.dbline 161
mov R16,R12
andi R16,#0x0F
swap R16
rcall _Write_Byte
.dbline 162
; Check_Ack();
rcall _Check_Ack
.dbline 163
L55:
.dbline 163
; }while(F_Flag==1);
lds R24,_F_Flag
cpi R24,1
breq L54
.dbline 164
; for(k=0;k<Number;k++) //写Number个数据
clr R20
rjmp L60
L57:
.dbline 165
.dbline 165
mov R30,R10
mov R31,R11
ldd R16,z+0
rcall _Write_Byte
.dbline 166
mov R24,R10
mov R25,R11
adiw R24,1
mov R10,R24
mov R11,R25
.dbline 167
rcall _Check_Ack
.dbline 167
L58:
.dbline 164
inc R20
L60:
.dbline 164
cp R20,R22
brlo L57
.dbline 168
; {Write_Byte(*Array);
; Array++;
; Check_Ack();} //检查应答位
; Stop();
rcall _Stop
.dbline -2
.dbline 169
; }
L49:
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r k 20 c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -